Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OutOfMemory exception in converting ByteArray to String?

I use the following code for converting my ByteArray to String:

String sReturn = new String(byteArray, "UTF-8");

But I get the following exception when ByteArray is large enough.

Is there any other way to convert ByteArray to String without Out of memory exception?

06-17 12:27:37.594: E/dalvikvm(1617): Out of memory: Heap Size=30663KB, Allocated=22087KB, Bitmap Size=936KB, Limit=32768KB
06-17 12:27:37.594: E/dalvikvm(1617): Extra info: Footprint=30663KB, Allowed Footprint=30663KB, Trimmed=616KB
06-17 12:27:37.594: W/dalvikvm(1617): threadid=9: thread exiting with uncaught exception (group=0x4001d648)
06-17 12:27:37.594: E/AndroidRuntime(1617): FATAL EXCEPTION: Thread-19
06-17 12:27:37.594: E/AndroidRuntime(1617): java.lang.OutOfMemoryError: (Heap Size=30663KB, Allocated=22087KB, Bitmap Size=936KB)
06-17 12:27:37.594: E/AndroidRuntime(1617):     at java.lang.String.<init>(String.java:422)
06-17 12:27:37.594: E/AndroidRuntime(1617):     at java.lang.String.<init>(String.java:276)
06-17 12:27:37.594: E/AndroidRuntime(1617):     at org.mabna.order.utils.Utilities.decompress(Utilities.java:389)
06-17 12:27:37.594: E/AndroidRuntime(1617):     at org.mabna.order.utils.WebserviceResponse.getClearedResponse(WebserviceResponse.java:18)
06-17 12:27:37.594: E/AndroidRuntime(1617):     at org.mabna.order.businessLayer.BoWebService.getDataForUpdate(BoWebService.java:216)
06-17 12:27:37.594: E/AndroidRuntime(1617):     at org.mabna.order.ui.ActToolDataExchange.threadGetDataForFullUpdate(ActToolDataExchange.java:389)
06-17 12:27:37.594: E/AndroidRuntime(1617):     at org.mabna.order.ui.ActToolDataExchange.access$9(ActToolDataExchange.java:380)
06-17 12:27:37.594: E/AndroidRuntime(1617):     at org.mabna.order.ui.ActToolDataExchange$35.run(ActToolDataExchange.java:639)
06-17 12:27:37.594: E/AndroidRuntime(1617):     at org.mabna.order.utils.Utilities$4.run(Utilities.java:924)

UPDATE

public static String decompress(String zipText) throws IOException {
    byte[] compressed = Base64.decode(zipText);
    if (compressed.length > 4) {
        GZIPInputStream gzipInputStream = new GZIPInputStream(
                new ByteArrayInputStream(compressed, 4,
                        compressed.length - 4));

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        for (int value = 0; value != -1;) {
            value = gzipInputStream.read();
            if (value != -1) {
                baos.write(value);
            }
        }
        gzipInputStream.close();
        baos.close();

        byte[] byteArray = baos.toByteArray();

        Log.i("toByteArray", String.valueOf(byteArray.length));

        String sReturn = new String(byteArray, "UTF-8");

        return sReturn;
    } else {
        return "";
    }
}



public static String decrypt(String encrypted, String password)
        throws Exception {

    byte[] encrypteddata = Base64.decode(encrypted);

    byte[] bytes = decrypt(encrypteddata, password);

    String result = new String(bytes, "UTF-8");

    return result;
}

public static byte[] decrypt(byte[] encrypted, String password)
        throws Exception {

    byte[] passwordKey = encodeDigest(password);
    try {
        aesCipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
    } catch (NoSuchAlgorithmException e) {
        throw new Exception(
                "Decryption Exception: No such algorithm\r\n" + e
                        .toString());
    } catch (NoSuchPaddingException e) {
        throw new Exception(
                "Decryption Exception: No such padding PKCS5\r\n" + e
                        .toString());
    }
    secretKey = new SecretKeySpec(passwordKey, CIPHER_ALGORITHM);

    try {
        aesCipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
    } catch (InvalidKeyException e) {
        throw new Exception(
                "Decryption Exception: Invalid key\r\n" + e.toString());
    } catch (InvalidAlgorithmParameterException e) {
        throw new Exception(
                "Decryption Exception: Invalid algorithm\r\n" + e
                        .toString());
    }

    byte[] encryptedData;
    try {
        encryptedData = aesCipher.doFinal(encrypted);
    } catch (IllegalBlockSizeException e) {
        throw new Exception(
                "Decryption Exception: Illegal block size\r\n" + e
                        .toString());
    } catch (BadPaddingException e) {
        throw new Exception(
                "Decryption Exception: Bad padding\r\n" + e
                        .toString());
    }
    return encryptedData;
}
like image 477
Bobs Avatar asked Jun 17 '12 07:06

Bobs


People also ask

How can we avoid Outofmemory exception?

OutOfMemoryError: Java heap space. 1) An easy way to solve OutOfMemoryError in java is to increase the maximum heap size by using JVM options "-Xmx512M", this will immediately solve your OutOfMemoryError.

What is Bytearray in java?

The ByteArrayOutputStream class of the java.io package can be used to write an array of output data (in bytes). It extends the OutputStream abstract class. Note: In ByteArrayOutputStream maintains an internal array of bytes to store the data.


1 Answers

Following snippet will help you.Try to read in chunks

             StringBuilder sb=new StringBuilder();  

             Log.v("abc","length : " + byteArray.length);  

             while (totalBytesRead < formDataLength) {    
                 byteRead = in.read(dataBytes, totalBytesRead, formDataLength);    
                 // byteRead = in.read(dataBytes);    
                 //totalBytesRead += byteRead;    
                 sb.append((char)byteRead);  
             }    

              String s=sb.toString(); 
like image 75
Vipul Avatar answered Oct 13 '22 05:10

Vipul