用Java读取二进制文件

时间:2011-04-08 19:00:31

标签: 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被推荐了几次。他们是唯一的出路吗?

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:1)

想要文件的对象:

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

More about difference