2015-05-04 58 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讀取一行文本。一行被認爲是由一個換行符或一個返回結束。 請記住,當文件中的第一行不爲空時會執行。即使只有一個點,它也會讀取它。 希望它有助於現在。 :) 評論下面的進一步細節。 祝您有愉快的一天。