在Java中读取二进制文件

在Java中读取二进制文件,java,Java,我有一个较长的无符号整数文件(每个64位,0.47GB文件),需要读取并存储在数组中。经过一番绞尽脑汁之后,我最终使用了long类型,因为Java中的所有内容都是经过签名的(如果我错了,请纠正我),我想不出更好的替代方法。无论如何,数组只需要排序,所以原始数字的精确值不是最重要的。我们应该衡量排序算法的效率,仅此而已。然而,当我真正开始阅读这个文件(我的代码如下)时,我遇到了一个困难 它会一直持续下去,我通常会一边看节目一边出去吃午饭。总的来说,20分钟是我迄今为止最快的时间。今天,一位课程伙伴

我有一个较长的无符号整数文件(每个64位,0.47GB文件),需要读取并存储在数组中。经过一番绞尽脑汁之后,我最终使用了long类型,因为Java中的所有内容都是经过签名的(如果我错了,请纠正我),我想不出更好的替代方法。无论如何,数组只需要排序,所以原始数字的精确值不是最重要的。我们应该衡量排序算法的效率,仅此而已。然而,当我真正开始阅读这个文件(我的代码如下)时,我遇到了一个困难


它会一直持续下去,我通常会一边看节目一边出去吃午饭。总的来说,20分钟是我迄今为止最快的时间。今天,一位课程伙伴吹嘘说他的课程只用了4秒就读完了。他在C++中工作,我知道C++比java快,但这很荒谬。谁能告诉我我做错了什么。我不能怪语言或机器,所以一定是我。但是,从我所看到的情况来看,Java教程使用的是完全相同的类,即
DataInputStream
。我还看到文件频道被推荐了好几次。它们是唯一的出路吗?

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

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

要删除文件的对象:

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

您的mates程序是否也将所有内容打印到标准输出?我打赌大部分时间都在那里。注释掉读取循环中的println,然后重试。同时确保您使用的设置与他相同。如果你用的是5400 RPM的硬盘,而他用的是SSD,不管你用什么语言,他都会抽你。你每天吃多少次午餐?(j/k)此外,对于0.47 GB文件,您可能希望使用更长的数组。您可以尝试使用
inputFile.getLength()/8
作为数组的长度。此外,还可以尝试使用不同大小的缓冲区。不要认为默认的缓冲区大小是最好的,尤其是因为您正在读取如此大量的字节。一般来说,我没有发现将缓冲区增加到默认值
8192
以上会有多大帮助,即使是在本机语言中。只有很少的10或100字节的缓冲区是非常慢的,但一旦达到8192,您可能会获得90%或更多的最大性能。
new ObjectInputStream(
    new BufferedInputStream(
        new FileInputStream(new File(file_name))))