【发布时间】:2011-02-22 12:29:32
【问题描述】:
我需要将一个包含 4 字节整数(小端序)的二进制文件读入我的 Android 应用程序的二维数组中。我目前的解决方案如下:
DataInputStream inp = null;
try {
inp = new DataInputStream(new BufferedInputStream(new FileInputStream(procData), 32768));
}
catch (FileNotFoundException e) {
Log.e(TAG, "File not found");
}
int[][] test_data = new int[SIZE_X][SIZE_Y];
byte[] buffer = new byte[4];
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
for (int i=0; i < SIZE_Y; i++) {
for (int j=0; j < SIZE_X; j++) {
inp.read(buffer);
byteBuffer = ByteBuffer.wrap(buffer);
test_data[j][SIZE_Y - i - 1] = byteBuffer.order(ByteOrder.LITTLE_ENDIAN).getInt();
}
}
这对于 2k*2k 数组来说相当慢,大约需要 25 秒。我可以在 DDMS 中看到垃圾收集器正在超时工作,所以这可能是运行缓慢的原因之一。
必须有一种更有效的方法来使用 ByteBuffer 将该文件读入数组,但我目前没有看到它。关于如何加快速度的任何想法?
【问题讨论】:
-
真的需要同时读取所有数据吗?您是否经常访问许多条目?如果没有,您可以避免将整个数组“解析”为整数。只需读取或包装整个文件,并通过计算其与 x y 坐标的偏移量来提供所需的条目。
-
@Luzifer 一开始我至少需要一次所有数据。
标签: java android performance file-io endianness