1

我在将 1.8MB 图像转换为字节然后加密时遇到内存不足异常,最后转换为字符串(日志中打印的长度为 1652328)。然后,我将此字符串附加到一些 XML 格式以发布,真正的问题出现了。StringBuffer在使用或StringBuilder添加到此图片字符串中添加一些标签时,发生内存不足异常。我该如何解决这个问题?

对于小图像,此问题不会复制。

下面的一段代码将路径中的图片转换pathString.

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) {

}

以上byteString内容附加到 xml 帖子中,如下所示。

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

更新

在上面的附加中,编码byteStream使用密码 AES 加密,然后附加到StringBuilder.

4

2 回答 2

1

bitmap.recycle();将位图转换为字节数组后立即调用。这将释放与此位图关联的本机对象,并清除对像素数据的引用。

更新

很明显,从文件流中读取的内存块太大而无法处理。避免一次读取整个文件。一块一块地做。在不使用中间字符串对象的情况下将字符串附加到 xml。

更新 2

您可以这样做以避免在将整个 xml 文件发送到服务器时加载整个 xml 文件。

// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);

// Enable POST method
connection.setRequestMethod("POST");

outputStream = new DataOutputStream( connection.getOutputStream() );
// Read file
bytesRead = fileInputStream.read(buffer, 0, bufferSize);

while (bytesRead > 0)
{
    outputStream.write(buffer, 0, bufferSize);
    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}

然后写入边界字符,刷新并关闭流。

于 2011-09-26T16:38:15.103 回答
0

感谢大家的支持。

我终于使用文件操作最大限度地优化了我的代码。

对于我使用Base64.encodeFileToFile(picturePath, encodedPicturePath); 的编码,我将编码的图像保存在一个文件中。然后对于加密,我使用CypherOutPutStream了在构造函数中传递 FileOutputStream 的地方。所以加密也是使用文件完成的。最后一步是在使用 HttpPost 时,我曾经将总加密数据作为StringEntity最终障碍发送。OutOfMemeoryException我将 StringEntity 更改为FileEntity。这减少了我的应用程序的堆消耗,从而提高了整体性能和上传容量。

注意:不要对编码图像进行分块加密,这会改变整体编码数据。只做一个。

失败:在我使用文件进行编码之前,我将整个图片分块并编码到一个文件中。但是,如果我对编码的文件进行解码,我无法获得原始图片。

问候,沙

于 2011-10-10T05:56:17.687 回答