我有一个大文件(英文维基百科文章只有数据库作为XML文件)。我正在使用BufferedReader
一次阅读一个字符。伪代码是:
file = BufferedReader...
while (file.ready())
character = file.read()
这实际上有效吗?或者ready
只有在等待硬盘返回数据时才会返回false
,而实际上只有EOF
到达时才会返回if (file.read() == -1)
?我试图使用{{1}},但似乎遇到了一个我无法找到的无限循环。
我只是想知道它是否正在阅读整个文件,因为我的统计数据显示已经阅读了444,380个维基百科页面,但我认为还有更多的文章。
答案 0 :(得分:9)
Reader.ready()
方法不用于测试文件结尾。相反,它是一种测试调用read()
是否会阻止的方法。
检测到您已达到EOF的正确方法是检查read
来电的结果。
例如,如果您一次只读一个字符,read()
方法会返回int
,如果您已达到最后,该字符将是有效字符或-1
-of文件。因此,您的代码应如下所示:
int character;
while ((character = file.read()) != -1) {
...
}
答案 1 :(得分:2)
无法保证读取整个输入。 ready()
只是告诉您底层流是否准备好了一些内容。例如,如果它通过网络套接字或文件进行抽象,则可能意味着没有任何可用的缓冲数据尚未。