这段代码运行时,获取网页的内容。
我想连接整个字符串而不是将其打印到控制台,但是当我取消注释下面代码中的两行时,
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
是 immutable 和 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
是为了有效地执行连接而构建的。如果您知道正在构建的 StringBuilder
的大小,则可以通过其初始容量调整 String
。
您可能会看到一些来源提到了
StringBuffer
。这非常相似,除了它更旧并且默认同步其方法。在浪费的非线程环境中,一般建议是更喜欢StringBuilder
.
String
是不可变的对象。您需要将连接的值重新分配给字符串对象。简单地调用fileText.concat(inputLine);
不会改变fileText
中的值。
fileText = fileText.concat(inputLine);
简单地说,
fileText += inputLine;
也应该有效。
String
是不可变的,所以只需在 concat
上调用 String
doesnot 改变它:它返回一个新的 String
结果。
您可以改为重新分配结果:
fileText = fileText.concat(inputLine);
,但由于您处于循环中,可能会进行大量串联,因此最好使用 StringBuilder
进行串联,并从中获得 String
StringBuilder
.
您好,您必须将 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
与预期的数据。你需要捕获这个返回值才能得到你想要的。
为此你最好使用
StringBuilder
。有点像
StringBuilder sb = new StringBuilder();
while (...)
sb.append(line);
它比
String
s的重复连接更有效。
更简单的解决方案是使用 Apache Commons IO library,特别是 IOUtils.toString(InputStream,String).
将
fileText.concat(inputLine)
更改为fileText = fileText.concat(inputLine)
.
另外,初始化
String inputLine = null;