【发布时间】:2017-11-12 09:34:48
【问题描述】:
我有一个需要读取然后存储到变量的二进制文件列表。每个文件都是大量双打的集合。这些文件是用linux下的C语言中的双重类型的C程序保存的。现在,我想使用 Java 读取所有这些文件。这是您可以实现的最快方法吗?在我的 PC 中,读取 10 个文件(1.5 Mb/文件和 194,672 个双精度/文件)需要 24 秒并将它们存储到一个数组中。我正在考虑使用某种类型的缓冲区,但我不确定是否应该从乞讨中留下一些字节......
int i;
int num_f = 10;
int num_d = 194672;
File folder = new File(route);
File[] listOfFiles = folder.listFiles();
float double_list[][] = new float[num_f][num_d];
for (int file = 0; file < listOfFiles.length; file++) {
if (listOfFiles[file].isFile()) {
try{
br = new DataInputStream(new FileInputStream(listOfFiles[file].getAbsolutePath()));
//We read all file
i = 0;
while(br.available() > 0) {
//I know that float != double but I don't think I will lose a huge precision
//as the double numbers stored are in a region [-5,5] and with this way I reduce
//the amount of memory needed. (float) is not cpu consuming (<1s).
double_list[file][i++] = (float) br.readDouble();
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
//Close file
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
【问题讨论】:
-
您应该在
DataInputStream和FileInputStream之间添加一个BufferedInputStream。默认缓冲区大小应该不错,但您可以随时尝试。 -
使用
DataInputStream你不能控制endianness。如果您的代码不起作用,可能是因为这个原因,因此您可能需要改用DoubleBuffer。 -
好的,现在使用 buferedinputstream 需要 7 秒,减少了 70%。好的!没有什么可以改进的了?顺便说一句,我该如何使用 DoubleBuffer?
-
如果你的内存数组是
double,而不是float,那么你可以尝试使用DoubleBuffer,将10个8 * num_d = 1557376字节块读入byte[],然后使用ByteBuffer.wrap(bytes).asDoubleBuffer().get(double_list[i])。这种块读取可能会更快。