我需要读取包含 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();
只读取 a
和 b
。
最佳答案
这确实很正常。您正在尝试读取字节,而不是整数。 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/