【问题标题】:What's the difference between (reader.ready()) and using a for loop to read through a file? [closed](reader.ready()) 和使用 for 循环读取文件有什么区别? [关闭]
【发布时间】:2013-03-10 18:05:30
【问题描述】:

在我之前的问题中,我询问了循环文件的问题,并解决了它。但是,我意识到该方法未能读取最后一组行/记录。所以我把原来的for循环改成了while(reader.ready())。所以:

for循环:

     int numberOfLines = readLines();
     numberOfLines = numberOfLines / 6;

     for(int i=0;i < numberOfLines; i++)

将其更改为:

BufferedReader reader = new BufferedReader(new FileReader("test.dat"));

while(reader.ready())

两者之间有什么区别,更具体地说,.ready() 到底是做什么的?

【问题讨论】:

  • 你的“读者”变量是什么类型的?我以前从未见过这种动物。
  • 编辑它,我希望正确..
  • javadoc 是怎么说的?你有什么不明白的?
  • 我不太确定 ready() 有什么意义——如果你需要做它应该做的事情,你可能想使用 NIO。

标签: java for-loop while-loop


【解决方案1】:

来自the Javadoc

判断此流是否已准备好被读取。如果缓冲区不为空,或者底层字符流已准备好,则缓冲字符流已准备就绪。

回报:
如果保证下一个read() 不会阻塞输入,则为真,否则为假。请注意,返回 false 并不能保证下一次读取会阻塞。

因此,如果保证read 不会阻塞,则缓冲区将为ready

作为 JB Nizet points out,这确实并不一定意味着您已经到达文件的末尾。如果出于任何原因,您的流可能阻塞,则ready 将返回false

请尝试像这样读取您的文件:

String line = reader.readLine();
while (line != null) {
    // code code code
    line = reader.readLine();
}

【讨论】:

  • 阅读 ready() 的 javadoc。这并不意味着有东西要读。这意味着下一次读取保证不会阻塞。它根本不等同于“其他方式”,这是逐行读取文件的正确方式。
  • JB Nizet 击败我回答了为什么不投票
  • 好吧,如果read 会阻止输入,那么这意味着已经到达文件末尾,对吧?因此,如果保证不阻塞,那是否意味着它必须立即返回一些东西?即,有 有什么要读的吗?
  • 没有。如果到达文件末尾,readLine() 将返回 null。 ready() 将返回 false 如果还有要阅读的内容,但阅读可能会阻塞。
  • 文件末尾怎么还有要读的东西? (感谢您对我的包容)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 2013-11-14
相关资源
最近更新 更多