【发布时间】:2011-10-01 05:24:25
【问题描述】:
我正在从 Android 设备的 SD 卡中读取图像文件。由于内存泄漏,这会导致内存不足致命错误。我已将其范围缩小到 GC 未删除的 1 字节数组的分配。我使用 FileInputStream 读取文件是否有更有效的方法来执行此操作?你能看出内存泄漏的原因吗?谢谢
private String getHexFileString(File _file)
{
byte[] byteStream = new byte[(int) _file.length()];
String fileHexString = null;
try
{
FileInputStream fis = new FileInputStream(_file);
fis.read(byteStream);
fis.close();
fis = null;
fileHexString = byteArrayToHexString(byteStream);
}
catch (FileNotFoundException e1)
{ actLog.addMessage(new ErrorMessage(e1)); }
catch (IOException e2)
{ actLog.addMessage(new ErrorMessage(e2)); }
catch(OutOfMemoryError e3)
{ actLog.addMessage(new ErrorMessage(e3)); }
return fileHexString;
}
/**
* This method formats a byte-array into a hex string
*
* @param b byte-array
* @return hex string
*/
public String byteArrayToHexString(byte[] b)
{
char[] hexVal = new char[b.length * 2];
int value = 0;
for (int i = 0; i < b.length; i++)
{
value = (b[i] + 256) % 256;
hexVal[i * 2 + 0] = kDigits[value >> 4];
hexVal[i * 2 + 1] = kDigits[value & 0x0f];
}
return new String(hexVal);
}
【问题讨论】:
-
每张图片有多大? getHexFileString() 的返回值是否缓存在任何地方?
-
另外,为什么你需要代表图像的字节的十六进制值?
-
长长的问题列表中的另一个问题 :-) 如果不调用函数 byteArrayToHexString() 是否会出现内存不足?
标签: java file memory filestream memory-leaks