2012-08-10 83 views
1

當此代碼運行時,它會獲取網頁的內容。爲什麼我的Java字符串連接不起作用?

我想以串連整個字符串,而不是將它打印到控制檯,但是當我去掉下面的代碼,System.out.println(inputLine);什麼也不打印兩行和值fileText = null(但它與下面註釋行工作),

這個錯誤來自哪裏?

import java.net.*; 
import java.io.*; 

public class URLReader { 

    public static void main(String[] args) throws Exception { 

     URL oracle = new URL("http://www.oracle.com"); 
     BufferedReader in = new BufferedReader(
     new InputStreamReader(oracle.openStream())); 

     String fileText = ""; 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) 
      //fileText.concat(inputLine); 
      System.out.println(inputLine); 
     in.close(); 
     //System.out.println(fileText); 
    } 
} 
+2

是的,你是對的! 'concat'方法自1996年以來一直沒有工作,並且使用Java的1,000萬開發人員中沒有人注意到,這很好。 :P – 2012-08-10 16:23:28

+0

我會編輯問題標題以使其更友好 – 2012-08-10 16:26:07

+0

似乎是重複的。 http://stackoverflow.com/questions/5076740/whats-the-fastest-way-to-concatenate-two-strings-in-java似乎得到了問題的本質(如何連接一個Java字符串)甚至儘管相關問題是針對性能的。 – 2012-08-10 16:34:53

回答

10

String不變concat()將返回一個新String(檢查鏈接的文檔),這你不收集。

你應該利用StringBuilder來有效地建立一個字符串,然後調用toString()就可以了,一旦你完成得到他所得到的String。

例如

StringBuilder sb = new StringBuilder(); 
while (....) { 
    sb.append("more string data"); 
} 
String str = sb.toString(); 

可以追加Strings例如

str = str + "more string data"; 

但由於String的執行,效率不高。 A StringBuilder是爲了有效地執行級聯而構建的。如果您想知道您正在構建的String的尺寸,則可以通過其初始容量調整StringBuilder

您可能會看到一些消息來源引用StringBuffer。這是非常相似的,除了它比較老,並默認同步它的方法。在浪費的非線程環境中,一般建議是更喜歡StringBuilder

5

String是不變的,所以只是在String調用concat改變它:它返回一個新String與結果。

可以代替重新分配的結果:fileText = fileText.concat(inputLine);,但最好使用StringBuilder做串連,並從StringBuilder得到String

+0

此外,線條是評論.. ;-) – 2012-08-10 16:18:11

7

String是不可變的對象。您需要將連接值重新分配給字符串對象。只需撥打fileText.concat(inputLine);將不會更改fileText中的值。

fileText = fileText.concat(inputLine);

簡單,fileText += inputLine;應該工作了。

2

String s是不可變的。這意味着fileText.concat(inputLine);不會更改fileText的內容。而是concat()方法返回一個新的String與預期的數據。你需要捕獲這個返回值來得到你想要的。

1

變化fileText.concat(inputLine)變爲fileText = fileText.concat(inputLine)

此外,初始化String inputLine = null;

相關問題