问题
When this code runs, it gets the content of a webpage.
I wanted to concatenate that entire string rather than printing it to the console but when I uncomment the two lines in the code below, System.out.println(inputLine);
prints nothing (but it worked with the line below commented) and the value fileText = null
,
where does this error come from?
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);
}
}
回答1:
String
is immutable and concat() will return a new String
(check the linked doc), which you're not collecting.
You should make use of a StringBuilder to build a string efficiently, and then call toString()
on that once you're complete to get he resultant String.
e.g.
StringBuilder sb = new StringBuilder();
while (....) {
sb.append("more string data");
}
String str = sb.toString();
You can append Strings
e.g.
str = str + "more string data";
but it's not very efficient, due to the implementation of String
. A StringBuilder
is built in order to perform concatenation efficiently. You can tune a StringBuilder
via its initial capacity if you have an idea of the size of String
you're building.
You may see some sources refer to a StringBuffer
. That's very similar, except it's older and synchronises its methods by default. In a non-threaded environment that's wasteful and the general advice is to prefer StringBuilder
.
回答2:
String
is immutable object. You need to reassign the concatenated value to a string object. Simply calling fileText.concat(inputLine);
will not change the value in fileText
.
fileText = fileText.concat(inputLine);
Simply, fileText += inputLine;
should work too.
回答3:
String is immutable, so just calling concat
on a String
doesn't change it: it returns a new String
with the result.
You can instead re-assign the result: fileText = fileText.concat(inputLine);
, but since you're in a loop, potentially doing lots of concatenation, it's better to use StringBuilder to do the concatenations, and get a String
from the StringBuilder
.
回答4:
Hello you must assign the return value of fileText.concat(String) to a variable. In your case to fileText again. The solution for you is:
fileText = fileText.concat(inputLine);
Have a further look at the Java API -> http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/String.html
回答5:
String
s are immutable. This means that fileText.concat(inputLine);
does not change the contents of fileText
. Rather the concat()
method returns a new String
with the expected data. You need to capture this return value to get what you want.
回答6:
You should better use StringBuilder
for that. Something like
StringBuilder sb = new StringBuilder();
while (...)
sb.append(line);
It's far more efficient than repeated concatenation of String
s.
Even simpler solution is to use Apache Commons IO library, in particular IOUtils.toString(InputStream,String).
回答7:
change fileText.concat(inputLine)
to fileText = fileText.concat(inputLine)
.
Also, initialize String inputLine = null;
来源:https://stackoverflow.com/questions/11905531/why-doesnt-my-java-string-concatenation-work