java - 在 Java 中读取二进制文件

标签 java

我有一个相对较长的无符号整数文件(每个 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 分钟是我迄今为止达到的最快速度。今天一位类(class)伙伴吹嘘说他的程序在 4 秒内读取它。他在 C++ 工作,我知道 C++ 比 Java 快,但这太荒谬了。有人可以告诉我我在这里做错了什么吗?我不能把它归咎于语言或机器,所以一定是我。不过,据我所知,Java 教程使用完全相同的类,即 DataInputStream。我还看到 FileChannels 被推荐了几次。他们是唯一的出路吗?

最佳答案

你应该使用缓冲输入,比如:

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

关于java - 在 Java 中读取二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599616/

相关文章:

java - 使用 Java 进行 Selen 自动化

java - 我可以在同一个输出流上同时使用 PrintWriter 和 BufferedOutputStream 吗?

java - 选择标签的默认值

Java对象混淆

java - 如何在 JavaFX 中处理各种 HiDPI 缩放级别的多分辨率图像?

java - 如何管理客户端特定配置

java - 如何从 quarkus 应用程序中正确地将逻辑删除消息发布到压缩的 kafka 主题?

java - 使用 Jackson 解析 Json 文件

java - jsoup 不抓取所有元素?

java - 是否可以在基于 IntelliJ Idea 平台的 IDE 的注释中引用文件?