如何判断读取器是否已到达文件末尾(EOF)?

8

我的代码需要读取文件的全部内容。目前我正在使用以下代码:

BufferedReader r = new BufferedReader(new FileReader(myFile));
while (r.ready()) {
  String s = r.readLine();
  // do something with s
}
r.close();

如果文件当前为空,则s为null,这是不好的。是否有任何具有atEOF()方法或等效方法的Reader?
4个回答

6
文档中写道:

public int read() throws IOException
返回: 读取的字符作为0到65535(0x00-0xffff)范围内的整数,如果已到达流的末尾,则返回-1。

因此,在Reader中应该像这样检查EOF

// Reader r = ...;
int c;
while (-1 != (c=r.read()) {
    // use c
}

在使用 BufferedReader 和 readLine() 时,可能会出现以下情况:
String s;
while (null != (s=br.readLine())) {
    // use s
}

因为 readLine() 在遇到文件结束符时会返回 null。


除非位置被明确重置,否则读取后的字符或行不会再次到达。这看起来像是从流中丢弃字节。(特别是如果用户想要在不消耗更多字节的情况下检查EOF) - Kcits970
@Kcits 这就是为什么每个情况下都要声明一个变量;在比较之前,该变量被写入:while (-1 != (c=r.read())) - 18446744073709551615

3
使用这个函数:
public static boolean eof(Reader r) throws IOException {
    r.mark(1);
    int i = r.read();
    r.reset();
    return i < 0;
}

2
只有当Reader支持mark()reset()时才会。 - user207421

1

ready() 方法不起作用。您必须从流中读取并检查返回值,以查看是否已到达 EOF。


好的,在许多情况下它确实可以工作,但它不能满足回答这个问题所需的要求。 - user207421

1

你所尝试做的标准模式是:

BufferedReader r = new BufferedReader(new FileReader(myFile));
String s = r.readLine();
while (s != null) {
    // do something with s
    s = r.readLine();
}
r.close();

4
ready() 方法只是用来判断下一次读取是否会阻塞。如果 Reader 已经到达文件末尾,下一次调用不会阻塞;它会立即返回一个 EOF 指示(readline 返回 null,read 返回 -1)。 - President James K. Polk
1
更好的选择是使用do-while而不是while。 - Melody Horn
BufferedReader.readLine() 的 JavaDoc 表示它返回“包含行内容的字符串...或 null(如果已到达流的末尾)”。 - Raedwald
如果我的文件包含null作为字符串,会发生什么?我无法读取完整的文件,这可能是原因吗? - uniruddh
1
@I-droid,“null”和“null”是两个非常不同的东西。 - maaartinus
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接