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

问题描述 投票:0回答:7

这段代码运行时,获取网页的内容。

我想连接整个字符串而不是将其打印到控制台,但是当我取消注释下面代码中的两行时,

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);
    }
}
java string concatenation
7个回答
12
投票

String
immutableconcat() 将返回一个新的
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
是为了有效地执行连接而构建的。如果您知道正在构建的
StringBuilder
的大小,则可以通过其初始容量调整
String

您可能会看到一些来源提到了

StringBuffer
。这非常相似,除了它更旧并且默认同步其方法。在浪费的非线程环境中,一般建议是更喜欢
StringBuilder
.


8
投票

String
是不可变的对象。您需要将连接的值重新分配给字符串对象。简单地调用
fileText.concat(inputLine);
不会改变
fileText
中的值。

fileText = fileText.concat(inputLine);

简单地说,

fileText += inputLine;
也应该有效。


6
投票

String
是不可变的,所以只需在
concat
上调用
String
doesnot 改变它:它返回一个新的
String
结果。

您可以改为重新分配结果:

fileText = fileText.concat(inputLine);
,但由于您处于循环中,可能会进行大量串联,因此最好使用
StringBuilder
进行串联,并从中获得
String
StringBuilder
.


4
投票

您好,您必须将 fileText.concat(String) 的返回值分配给一个变量。在你的情况下再次 fileText 。 适合您的解决方案是:

fileText = fileText.concat(inputLine); 

进一步了解 Java API -> http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/String.html


2
投票

String
是不可变的。这意味着
fileText.concat(inputLine);
不会改变
fileText
的内容。而是
concat()
方法返回一个新的
String
与预期的数据。你需要捕获这个返回值才能得到你想要的。


1
投票

为此你最好使用

StringBuilder
。有点像

StringBuilder sb = new StringBuilder();
while (...)
    sb.append(line);

它比

String
s的重复连接更有效。

更简单的解决方案是使用 Apache Commons IO library,特别是 IOUtils.toString(InputStream,String).


1
投票

fileText.concat(inputLine)
更改为
fileText = fileText.concat(inputLine)
.

另外,初始化

String inputLine = null;

© www.soinside.com 2019 - 2024. All rights reserved.