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;
}
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.
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.
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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With