Search code examples
androidstringstringbuilderout-of-memorystringbuffer

Out of Memory Exception for String, StringBuffer and StringBuilder in Android


I'm facing an Out of Memory Exception while converting a 1.8MB image to bytes and then encrypt, finally converting into a string (length printed in log is 1652328). And then, I'm appending this string to some XML format to post, where the real problem arises. While appending some tags to this pictureString using StringBuffer or StringBuilder or adding to a string Out of Memory exception is occuring. How can I resolve this issue?

For small images this issue is not replicating.

The below piece of code converts a picture at path path to String.

fis = new FileInputStream(path);
buffer = new byte[fis.available()];
try {
    fis.read(buffer, 0, buffer.length);
    String byteString = 
        com.mobile.android.components.Base64.encodeBytes(buffer);
    return byteString;
} catch (IOException ex) {

}

The above byteString is appended to xml post as follows.

StringBuilder pictureName = new StringBuilder();
pictureName.append(byteString ); //here array out of bound at StringBuilder.extendBuffer
..........
appending continues

UPDATED

In the above appending, encoded byteStream is encrypted using cypher AES and then appended to StringBuilder.


Solution

  • Thanks everyone for the support.

    I finally optimized my code to a max extent using file operations.

    For encoding I used Base64.encodeFileToFile(picturePath, encodedPicturePath); I saved the encoded image in a file. And then for encryption,I used CypherOutPutStream where a FileOutputStream is passed in constructor.So Encryption is also done using file. The final step is while using HttpPost,I used to send the total encrypted data as a StringEntity which is final Hurdle for OutOfMemeoryException.I changed the StringEntity to FileEntity.This reduced the heap consumption of my application and thus improved the overall performance and upload capacity.

    Note: Dont Encrypt the encoded image in chunks which will change the overall encoded data.Do it inn a single piece.

    Failures: Before i used files for Encoding ,I chunked the whole picture and encoded to a file.But,If i decode the encoded file,I failed to get the original picture.

    Regards,Sha