我有一个依赖于输入流的简单 java 程序。我必须读取一个 160 MB 的 ecg 文件,该文件在普通 jvm 上运行完美,但是当我在 android 中运行此代码时,它根本无法分配 160 MB 并关闭我的应用程序。
这是一段代码:
// reads the ecg file into a stream and stores it in the InputArray
public byte[] readStream() throws IOException{
FileInputStream inputFile = new FileInputStream(getDataPath());
setBytesToSkip(0);
inputFile.skip(getBytesToSkip());
setLengthOfInputFile(inputFile.available());
byte[] InputArray = new byte[getLengthOfInputFile()];
setInputArray(InputArray);
inputFile.read(getInputArray());
inputFile.close();
return inputArray;
}
// writes the bytes of the inputArray into a buffer bb
public ByteBuffer bufferStream(byte[] array){
inputArray = array;
setBufferOffset(0);
setBufferByteReadLength(getLengthOfInputFile());
ByteBuffer bb = ByteBuffer.allocateDirect(getBufferByteReadLength());
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(getInputArray(), getBufferOffset(), getBufferByteReadLength());
return bb;
}
我还尝试使用 DirectBuffer 越过正常堆,但仍然出现内存不足错误,例如:
dalvikvm-heap PID:1715 Out of memory on a 167230992-byte allocation
有没有办法以更有效的方式处理输入流的数据?或者我可以拿一些存储空间,
例如一个 sdcard 作为“堆”吗?
最好的问候洛雷佐