开发嵌入式系统时,在开发桌面环境时面临许多挑战。我目前面临的挑战是将大文件(可能10-100MB)转换为字节数组,同时牢记我的有限资源(内存)。我一直在使用的两个实现导致可怕的
java.lang.OutOfMemoryError
我开始自己实施这个:
/** Converts the given File to an array of bits. */
private byte[] fileToBytes(File file) {
InputStream input_stream = new BufferedInputStream(new FileInputStream(file));
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] data = new byte[16384]; // 16K
int bytes_read;
while ((bytes_read = input_stream.read(data,0,data.length)) != -1) {
buffer.write(data, 0, bytes_read);
}
input_stream.close();
return buffer.toByteArray();
}
然后决定使用经过试验和测试的Apache commons-io为我处理这个问题,但同样的错误。这是可以在Android等移动环境中完成的事情,还是我运气不好?
答案 0 :(得分:1)
你不能把这么大的文件放到Android的内存中,因为Android中的堆大小限制在16-32MB左右,具体取决于设备。所以,你应该以某种方式重新设计你的应用程序。
答案 1 :(得分:1)
要将文件转换为字节数组,您可以使用DatanputStream。
byte[] lData = new byte[file_length];
DataInputStream lDataIS = new DataInputStream(InputStream);
lDataIS.readFully(lData);
要正确加载大文件,也许您可以通过块读取它们,并使用代理对象来操作部分加载的文件。