用Java读取二进制文件

我有一个相对较长的无符号整数文件(每个64位,0.47GB文件),我需要读取并存储在一个数组中。 在经历了一些脑力劳动之后,我使用了类型很长的东西,因为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被推荐了几次。 他们是唯一的出路吗?

您应该使用缓冲输入,例如:

 new DataInputStream( new BufferedInputStream( new FileInputStream(new File(input_file)))) 

想要文件的对象:

 new ObjectInputStream( new BufferedInputStream( new FileInputStream(new File(file_name)))) 

更多关于差异