可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to convert my StringReader
back to a regular String
, as shown:
String string = reader.toString();
But when I try to read this string out, like this:
System.out.println("string: "+string);
All I get is a pointer value, like this:
java.io.StringReader@2c552c55
Am I doing something wrong in reading the string back?
回答1:
The StringReader
's toString
method does not return the StringReader
internal buffers.
You'll need to read from the StringReader
to get this.
I recommend using the overload of read which accepts a character array. Bulk reads are faster than single character reads.
ie.
//use string builder to avoid unnecessary string creation.
StringBuilder builder = new StringBuilder();
int charsRead = -1;
char[] chars = new char[100];
do{
charsRead = reader.read(chars,0,chars.length);
//if we have valid chars, append them to end of string.
if(charsRead>0)
builder.append(chars,0,charsRead);
}while(charsRead>0);
String stringReadFromReader = builder.toString();
System.out.println("String read = "+stringReadFromReader);
回答2:
import org.apache.commons.io.IOUtils;
String string = IOUtils.toString(reader);
回答3:
If you prefer not to use external libraries:
Scanner scanner = new Scanner(reader).useDelimiter("\\A");
String str = scanner.hasNext() ? scanner.next() : "";
The reason for the hasNext()
check is that next()
explodes with a NoSuchElementException
if the reader wraps a blank (zero-length) string.
回答4:
Or using CharStreams
from Googles Guava library:
CharStreams.toString(stringReader);
回答5:
reader.toString();
will give you the results of calling the generic toString()
method from Object
class.
You can use the read()
method:
int i;
do {
i = reader.read();
char c = (char) i;
// do whatever you want with the char here...
} while (i != -1);
回答6:
Calling toString() method will give the object of StringReader class. If yo want it's content then you need to call the read method on StringReader like this:
public class StringReaderExample {
public static void main(String[] args) {
String s = "Hello World";
// create a new StringReader
StringReader sr = new StringReader(s);
try {
// read the first five chars
for (int i = 0; i < 5; i++) {
char c = (char) sr.read();
System.out.print("" + c);
}
// close the stream
sr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
For tutorials you can use this link.
回答7:
Another native (Java 8+) solution could be to pass the StringReader
object to a BufferedReader
and stream trough the lines:
try (BufferedReader br = new BufferedReader(stringReader)) {
br.lines().forEach(System.out::println);
}
回答8:
You're printing out the toString()
of the actual StringReader
object, NOT the contents of the String
that the StringReader
is reading.
You need to use the read()
and/or the read(char[] cbuf, int off, int len)
methods to read the actual chars in the String.
回答9:
If you use the method toString()
in a StringReader
object you will print the memory position of the object. You have yo use one of this method:
read()
Reads a single character.
read(char[] cbuf, int off, int len)
Reads characters into a portion of an array.
Here an example:
String s = "Hello World";
// create a new StringReader
StringReader sr = new StringReader(s);
try {
// read the first five chars
for (int i = 0; i < s.length(); i++) {
char c = (char) sr.read();
System.out.print("" + c);
}
// close the stream
sr.close();
} catch (IOException ex) {
ex.printStackTrace();
}