簡體   English   中英

為什么我的 Java 字符串連接不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM