2015-05-04 59 views
2

我见过的BufferedReader使用while循环通过文件的内容进行迭代,用代码或多或少是:的BufferedReader的readLine使用while循环

try { 
    FileReader fr = new FileReader(file); 
    Buffered Reader br = new BufferedReader(fr); 
    String line; 

    while ((line = br.readLine()) != null) { 
     // do something 
    } 
} catch() {} 

什么我不明白是怎么while循环在内部递增其计数器直到它读取了文档中的所有行。对我而言,上面的while循环意味着“如果第一行(行[0])不为空,则执行某些操作(大概无限次)”,并且永远不会超过文档的第一行。我不了解BufferedReader或.readLine()方法?

回答

2

我希望我的问题正确。你想知道BufferedReader如何确定在没有计数变量的情况下循环内部继续读取的位置?

如果您看一下BufferedReader.class,您会看到一个private int pos;计数器,每当从流中读取一个字符时,计数器就会增加。在public int read()。在readLine()中也是如此,不同之处在于pos递增,直到达到行末。

您可以使用reset()功能重置内部计数器(详情请参阅here)。

+0

是的,那正是我想问的。我看不到循环计数的任何方式,以便前进到输入文件的下一行。我查看了Oracle网站上的'BufferReader.class'页面,但是我无法在任何地方找到'private int pos'。你能给我一个链接,所以我可以看到它在哪里? (以满足我个人的好奇心)。谢谢。 – resu

+0

您可以在http://developer.classpath.org/doc/java/io/BufferedReader-source.html上查看BufferedReader的源代码(请参见第74行“pos”计数器)。或者:如果您使用Eclipse,只需在编辑器中选择BufferedReader并按F3即可:) – adsdf

0

内的括号中的线下面的while循环:

while ((line = br.readLine()) != null) 

(line = br.readLine()) != null 

而且方法readLine()将继续从文件读取下一行,一旦它到达的终点该文件返回null。所以它以这种方式工作。

在旁注中,while循环没有对计数器的限制,只需要一个布尔表达式,其值为true或false。

0

检查代码

while ((line = br.readLine()) != null) { 
    // do something 
} 

首先line被分配给任何br.readLine()返回时,则line进行比较空。括号强制执行该操作顺序。

变量line将随着程序循环遍历文件中的所有行,直到它到达文件末尾而继续占用下一行文本的值。此时,line被分配值null,然后终止循环。

什么我不明白是怎么while循环内部的递增计数器

有这个循环没有专柜。循环终止条件是line == null(另一种说法是它保持循环line != null)。当line为空时,循环结束。

对我来说,while循环以上的意思是“如果第一线(线[0])不为空

否,线不是数组,它是代表单个行的字符串该文件,并将该值被更新为每行从文件中读取。

在.NET中有一个different method

string[] allLines = File.ReadAllLines(path); 

不同的方法读取所有利将文件的内存一次写入内存。该方法适用于读取小文件,而您提供的方法更具有内存效率。它该文件的内容,只为当前行分配内存。这种方法对于大文件来说要优越得多。

请注意,缓冲读取器在循环语义中不起作用。它只是一种更高效地从磁盘读取文件的机制(或perhaps unnecessary overhead)。

0

首先,它有必要了解Filereader和Buffered Reader之间的区别。 Buffered Reader从字符输入流中读取文本,缓冲字符以便高效地读取字符,数组和行。 FileReader读取一行文本。一行被认为是由一个换行符或一个返回结束。 请记住,当文件中的第一行不为空时会执行。即使只有一个点,它也会读取它。 希望它有助于现在。 :) 评论下面的进一步细节。 祝您有愉快的一天。