2

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

我想连接整个字符串而不是将其打印到控制台,但是当我取消注释下面代码中的两行时,System.out.println(inputLine);什么也不打印(但它与下面注释的行一起使用)和 value 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);
    }
}
4

7 回答 7

12

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. 构建AStringBuilder是为了有效地执行连接。如果您知道要构建StringBuilder的大小,则可以通过其初始容量来调整 a 。String

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

于 2012-08-10T16:17:32.327 回答
8

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

fileText = fileText.concat(inputLine);

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

于 2012-08-10T16:17:59.297 回答
6

String是不可变的,所以仅仅调用concataString 并不会改变它:它返回一个String带有结果的 new。

您可以改为重新分配结果:fileText = fileText.concat(inputLine);,但由于您处于循环中,可能会进行大量连接,因此最好使用StringBuilder来进行连接,并StringStringBuilder.

于 2012-08-10T16:17:41.423 回答
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

于 2012-08-10T16:17:53.233 回答
2

Strings 是不可变的。这意味着fileText.concat(inputLine);不会更改fileText. 相反,该concat()方法返回一个String带有预期数据的新方法。你需要捕获这个返回值来得到你想要的。

于 2012-08-10T16:18:33.060 回答
1

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

另外,初始化String inputLine = null;

于 2012-08-10T16:20:09.887 回答
1

你应该更好地使用StringBuilder它。就像是

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

它比 s 的重复连接要有效得多String

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

于 2012-08-10T16:21:38.000 回答