为什么我的Java字符串连接不起作用?

gui*_*rin 2 java string concat

当此代码运行时,它将获取网页的内容.

我想连接整个字符串而不是将它打印到控制台但是当我在下面的代码中取消注释两行时,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*new 12

String不可变的,concat()将返回一个新的String(检查链接的文档),你没有收集.

你应该使用StringBuilder来有效地构建一个字符串,然后toString()在你完成后调用它来获得它的结果String.

例如

StringBuilder sb = new StringBuilder();
while (....) {
   sb.append("more string data");
}
String str = sb.toString();
Run Code Online (Sandbox Code Playgroud)

可以附加Strings例如

   str = str + "more string data";
Run Code Online (Sandbox Code Playgroud)

但由于实施的原因,效率不高String.StringBuilder构建A 是为了有效地执行连接.StringBuilder如果String您对构建的大小有所了解,可以通过其初始容量调整a .

您可能会看到一些来源引用a StringBuffer.这是非常相似的,除了它更旧并默认同步其方法.在非线程环境中,这是浪费的,而且一般的建议是偏好的StringBuilder.


dev*_*ang 8

String是不可变对象.您需要将连接值重新分配给字符串对象.简单地打电话fileText.concat(inputLine);不会改变价值fileText.

fileText = fileText.concat(inputLine);

简单地说,也fileText += inputLine;应该工作.


pb2*_*b2q 6

String是不可变的,所以只是调用concata String 不会改变它:它返回一个String带结果的new .

您可以代替重新分配的结果:fileText = fileText.concat(inputLine);,但最好用StringBuilder做串连,并获得了String来自StringBuilder.