2013-02-01 62 views
0

我有以下代碼。我想要做的就是將BufferedReader中的每一行直接讀入一個StringBuffer以減少內存開銷。一旦到達數據流的末尾,我希望它退出while循環。bufferedreader - 讀入stringbuffer而不是字符串

StringBuffer line = new StringBuffer(); 
     URL url = new URL("a url"); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); 
       int count = 0; 
       while(line.append(reader.readLine()) != null){ 
        System.out.println(line.toString()); 
        line.delete(0,line.length()); 
       } 

它讀取流精,但是當我到達流的末尾返回null並保持印刷空,但不退出循環。任何

+0

我認爲用'的(串線;(線= reader.readLine())= NULL;!){...}'只能創建引用。 –

+1

爲什麼讀入'StringBuffer'只會在打印出行後將其刪除。爲什麼不直接打印出來? –

+1

問:append()的結果如何爲空?答:它不能。 – EJP

回答

3

這個while(line.append(reader.readLine()) != null)基本上與說while(line.append(reader.readLine()).toString() != null)這是永遠不可能發生的相同。

您可能遇到的另一個問題是null實際上是被轉換爲文字String"null"。這就是爲什麼它打印 「空」,這個值是不實際null - 感到困惑......

相反,你可以試試...

String text = null; 
while((text = reader.readLine()) != null){ 
    line.append(text) 
    System.out.println(line.toString()); 
    line.delete(0,line.length()); 
} 

更新

雖然我在這裏,我可能會建議你實際上並沒有拯救你自己的任何東西。

readLine將創建String對象,您將其放入StringBuffer。你實際上並不是在保存任何內存,而是讓這個過程複雜化了。

如果您真的擔心在內存中創建大量String對象,請改爲使用BufferedReader#read(char[])。將結果字符數組追加到StringBuffer

此外,除非需要同步訪問StringBuffer,否則使用StringBuilder代替它會更快。

+0

我正在讀入一個字符串緩衝區和使用split(「,」)進入一個數組。我可能會讀取最多1000行,因此我希望保持內存使用率。但我會嘗試char的建議。 – user1958884

+0

您必須認識到'reader.readLine()'已經創建了一個String對象,所以您認爲使用'StringBuffer'獲得的任何好處都是可以協商的。說了'String = String + String'最後每個連接創建一個額外的String對象(我認爲在這個例子中是3),所以你保存你的自己一點點 – MadProgrammer

0

你可以嘗試同樣與此for循環:

for (String line; (line = reader.readLine()) != null;) { 
    System.out.println(line); // Or whatever 
} 
1

這完美的作品。你只需要抓住的NullPointerException

while(line.append(reader.readLine().toString()) != null){ 
+0

就我而言,它是否意識到' StringBuffer'會將'null'值轉換爲'null'的字符串字面值。 – MadProgrammer

+0

它適用於我。 – user1958884

+0

這很奇怪,導致'System.out.println(new StringBuffer()。append((String)null).toString()== null)'返回'false'對我來說 – MadProgrammer

相關問題