java - 如何读取二进制文件直到文件结束?

标签 java binaryfiles eof

我需要读取包含 eof 的二进制文件。

我使用 DataInputStream 读取文件

DataInputStream instr = new DataInputStream(new BufferedInputStream(new FileInputStream( fileName ) ) );

我使用 readInt(); 将二进制文件读取为整数。

try {
    while ( true){
        System.out.println(instr.readInt());
        sum += instr.readInt(); //sum is integer
    }
} catch ( EOFException  eof ) {
    System.out.println( "The sum is: " + sum );
    instr.close();
}

但是这个程序不读取文件末尾或最后一行文本(如果它是文本文件)。 所以如果文本文件只包含一行文本,则总和为 0。 请帮我解决这个问题。

示例:如果 .txt 文件包含文本。

a
b
c

readInt(); 只读取 ab

最佳答案

这确实很正常。您正在尝试读取字节,而不是整数。 readInt() 方法将四个字节合并为一个 int。

让我们分析一下您的示例文件:

a
b
c

这总共是5个字节:a, \n, b, \n, c.
\n 是换行符。

readInt() 方法获取前四个字节并将其制成一个整数。这意味着当您尝试对其进行第二次调用时,只剩下一个字节,这是不够的。

尝试改用 readByte(),它将一个接一个地返回所有字节。


为了演示,这是 readInt() 方法的主体,它调用了 4 次 read():

   public final int readInt() throws IOException {
        int ch1 = in.read();
        int ch2 = in.read();
        int ch3 = in.read();
        int ch4 = in.read();
        if ((ch1 | ch2 | ch3 | ch4) < 0)
            throw new EOFException();
        return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
    }

当到达文件末尾时,read() 方法返回-1。这就是检测到 EOFExceptions 的方式。

关于java - 如何读取二进制文件直到文件结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7293483/

相关文章:

java - org/testng/ITestListener 已由更新版本的 Java 运行时(类文件版本 55.0)编译,仅识别最高版本 52

c++ - 无法将大的无符号整数正确写入二进制文件 - C++

C++为什么读取二进制文件会跳到最后

c# - 使用 SerialPort 禁用 EOF (0x1A)

c - getchar() 函数和 EOF

c - 如何在 Windows 上用 c 中的 ctrl+c 结束 while 循环?

java - 读取字符数组,一次一个字符

java - 不明白为什么我的 ||不管用

binary - 将存储在 Fortran 90 二进制文件中的数据转换为人类可读格式

java - 事件来到 Esper Engine 后阅读 Mysql 数据库?