[英]Why doesn't my Java string concatenation work?
當此代碼運行時,它會獲取網頁的內容。
我想連接整個字符串而不是將其打印到控制台,但是當我取消注釋下面代碼中的兩行時, 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);
}
}
String
是不可變的, concat()將返回一個新的String
(檢查鏈接的文檔),您沒有收集它。
您應該使用StringBuilder有效地構建字符串,然后在完成后調用toString()
以獲得結果字符串。
例如
StringBuilder sb = new StringBuilder();
while (....) {
sb.append("more string data");
}
String str = sb.toString();
您可以附加Strings
,例如
str = str + "more string data";
但由於String
的實現,它不是很有效。 構建StringBuilder
是為了有效地執行串聯。 如果您知道要構建的String
的大小,則可以通過其初始容量調整StringBuilder
。
您可能會看到一些來源引用了StringBuffer
。 這非常相似,除了它更舊並且默認同步其方法。 在非線程環境中,這是一種浪費,一般的建議是更喜歡StringBuilder
。
String
是不可變對象。 您需要將連接的值重新分配給字符串對象。 只需調用fileText.concat(inputLine);
不會更改fileText
中的值。
fileText = fileText.concat(inputLine);
簡單地說, fileText += inputLine;
也應該工作。
String
是不可變的,因此僅在String
上調用concat
不會更改它:它會返回一個帶有結果的新String
。
您可以改為重新分配結果: fileText = fileText.concat(inputLine);
,但由於您處於循環中,可能會進行大量串聯,因此最好使用StringBuilder
進行串聯,並從StringBuilder
獲取String
。
您好,您必須將 fileText.concat(String) 的返回值分配給一個變量。 在你的情況下再次 fileText 。 適合您的解決方案是:
fileText = fileText.concat(inputLine);
進一步查看 Java API -> http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/String.html
String
是不可變的。 這意味着fileText.concat(inputLine);
不會更改fileText
的內容。 而是concat()
方法返回一個包含預期數據的新String
。 你需要捕獲這個返回值才能得到你想要的。
將fileText.concat(inputLine)
更改為fileText = fileText.concat(inputLine)
。
另外,初始化String inputLine = null;
您最好為此使用StringBuilder
。 就像是
StringBuilder sb = new StringBuilder();
while (...)
sb.append(line);
它比String
的重復連接更有效。
更簡單的解決方案是使用Apache Commons IO library ,特別是IOUtils.toString(InputStream,String) 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.