2012-08-10 49 views
1

当此代码运行时,它会获取网页的内容。为什么我的Java字符串连接不起作用?

我想以串连整个字符串,而不是将它打印到控制台,但是当我去掉下面的代码,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); 
    } 
} 
+2

是的,你是对的! 'concat'方法自1996年以来一直没有工作,并且使用Java的1,000万开发人员中没有人注意到,这很好。 :P – 2012-08-10 16:23:28

+0

我会编辑问题标题以使其更友好 – 2012-08-10 16:26:07

+0

似乎是重复的。 http://stackoverflow.com/questions/5076740/whats-the-fastest-way-to-concatenate-two-strings-in-java似乎得到了问题的本质(如何连接一个Java字符串)甚至尽管相关问题是针对性能的。 – 2012-08-10 16:34:53

回答

10

String不变concat()将返回一个新String(检查链接的文档),这你不收集。

你应该利用StringBuilder来有效地建立一个字符串,然后调用toString()就可以了,一旦你完成得到他所得到的String。

例如

StringBuilder sb = new StringBuilder(); 
while (....) { 
    sb.append("more string data"); 
} 
String str = sb.toString(); 

可以追加Strings例如

str = str + "more string data"; 

但由于String的执行,效率不高。 A StringBuilder是为了有效地执行级联而构建的。如果您想知道您正在构建的String的尺寸,则可以通过其初始容量调整StringBuilder

您可能会看到一些消息来源引用StringBuffer。这是非常相似的,除了它比较老,并默认同步它的方法。在浪费的非线程环境中,一般建议是更喜欢StringBuilder

5

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

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

+0

此外,线条是评论.. ;-) – 2012-08-10 16:18:11

7

String是不可变的对象。您需要将连接值重新分配给字符串对象。只需拨打fileText.concat(inputLine);将不会更改fileText中的值。

fileText = fileText.concat(inputLine);

简单,fileText += inputLine;应该工作了。

2

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

1

变化fileText.concat(inputLine)变为fileText = fileText.concat(inputLine)

此外,初始化String inputLine = null;

相关问题