2013-03-10 92 views
1

在我之前的问题中,我问了一个循环遍历文件的问题,并解决了它。但是,我意识到该方法未能读取最后一组行/记录。所以我将原来的for循环更改为while(reader.ready())。所以:(reader.ready())和使用for循环读取文件有什么区别?

原始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()做?

+4

什么类型是你的“读者”变量?我从来没有见过这种动物。 – 2013-03-10 18:06:02

+0

编辑它,正确地我希望.. – Geuni 2013-03-10 18:07:34

+1

javadoc说什么?你不了解它吗? – 2013-03-10 18:18:04

回答

2

the Javadoc

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

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

因此,缓冲区将是ready如果read保证不阻止。

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

相反,尝试阅读您的文件是这样的:

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

阅读ready()的javadoc。这并不意味着有什么可读的。这意味着下一次读取被保证不会被阻止。它与“其他方式”完全不同,这是逐行读取文件的正确方法。 – 2013-03-10 18:24:03

+0

JB Nizet打我回答为什么downvote – 2013-03-10 18:24:37

+0

好吧,如果'read'会阻止输入,那就意味着文件已经到达了,对不对?因此,如果保证不阻止,这并不意味着它必须立即返回;即*有*要读的东西? – wchargin 2013-03-10 18:24:48