我有一个包含无符号整数的相对较长的文件(每个数字有64位,文件大小为0.47GB),我需要读取并存储到一个数组中。在一番思索后,我最终选择了使用long类型,因为在Java中所有东西都是有符号的(如果我错了,请指出)。无论如何,这个数组只需要排序,所以原始数字的确切值并不是最重要的。我们只需要测量排序算法的效率,没有其他更多的需求。然而,当我真正开始读取文件时(参见下面的代码),我遇到了一些困难。
public class ReadFileTest {
public static void main(String[] args) throws Exception {
String address = "some/directory";
File input_file = new File (address);
FileInputStream file_in = new FileInputStream(input_file);
DataInputStream data_in = new DataInputStream (file_in );
long [] array_of_ints = new long [1000000];
int index = 0;
long start = System.currentTimeMillis();
while(true) {
try {
long a = data_in.readLong();
index++;
System.out.println(a);
}
catch(EOFException eof) {
System.out.println ("End of File");
break;
}
}
System.out.println(index);
System.out.println(System.currentTimeMillis() - start);
}
}
程序似乎永远在运行,通常我会趁着它读取的时候出去吃午饭。到目前为止,最快的速度是20分钟。今天一位同学吹嘘他的程序只用了4秒钟。他使用的是C++,我知道C++比Java更快,但这也太离谱了。请问有人能告诉我我在这里做错了什么吗?我不能把它归咎于语言或机器,所以必须是我的问题。从我看到的情况来看,Java教程使用的正是相同的类,即DataInputStream
。另外,我还看到一些人推荐使用FileChannels
,难道这是唯一的出路吗?
inputFile.getLength()/8
作为数组的长度。 - Paŭlo Ebermann