用Java读取二进制文件 [英] Reading a binary file in Java

查看:219
本文介绍了用Java读取二进制文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个相对较长的无符号整数文件(每个64位,0.47GB文件),我需要读取并存储在一个数组中。在经历了一些脑力劳动之后,我使用了类型很长的东西,因为Java中的所有内容都已签名(请纠正我,如果我错了,请),我想不出更好的选择。无论如何,只需对数组进行排序,因此原始数字的精确值并不是最重要的。我们应该测量排序算法的效率,仅此而已。然而,当我真正来阅读文件时,我遇到了一堵砖墙(我的代码如下)。

I have a comparatively long file of unsigned integers (64 bits each, 0.47GB file) that I need to read and store in an array. After some brain racking I wound up using the type long, since everything in Java is signed (correct me if I'm wrong, please) and I couldn't think of a better alternative. Anyhow, the array only has to be sorted, so the precise values of the original numbers are not of the utmost importance. We're supposed to measure the efficiency of the sorting algorithm, nothing more. However, I came up against a brick wall when I actually came to reading the file (my code below).

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

It goes on and on forever, and I usually step out to have lunch while the programme's reading. All in all 20 minutes is the fastest I've achieved so far. A course mate bragged today that his programme read it in 4 sec. He's working in C++ and I know that C++ is faster than Java, but this is ridiculous. Could somebody, please, tell me what I'm doing wrong here. I can't blame it on the language or the machine, so it must be me. From what I can see, though, the Java tutorials use exactly the same class, i.e. DataInputStream. I also saw FileChannels being recommended a couple of times. Are they the only way out?

推荐答案

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

You should use buffered input, something like:

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

这篇关于用Java读取二进制文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆