22

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?

Luiggi Mendoza
85.9k16 gold badges159 silver badges353 bronze badges
asked Jul 19, 2013 at 16:26
2

10 Answers 10

28
import org.apache.commons.io.IOUtils;
String string = IOUtils.toString(reader);
answered Oct 27, 2014 at 5:38

1 Comment

See @Kiran's answer for a Java 9+ solution that does not use external libraries.
11

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);
answered Jul 19, 2013 at 16:29

1 Comment

See @Kiran's answer for a Java 9+ solution that is much simpler.
5

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.

answered Nov 30, 2016 at 23:50

Comments

4

Or using CharStreams from Googles Guava library:

CharStreams.toString(stringReader);
Stefan van den Akker
7,0497 gold badges52 silver badges69 bronze badges
answered Jan 11, 2016 at 10:21

1 Comment

See @Kiran's answer for a Java 9+ solution that does not use external libraries.
2

As per https://www.tutorialspoint.com/java/io/stringwriter_tostring.htm

StringReader sr = new StringReader("hello");
StringWriter sw = new StringWriter();
sr.transferTo(sw);
System.out.println(sw.toString());
answered Feb 12, 2021 at 17:30

1 Comment

This is the right answer for Java 10+. Note that Reader gained this method in Java 10 and InputStream gained this method in Java 9. Under the hood, this takes advantage of a character buffer of size 8192 bytes in both cases and uses StringBuffer.append in the StringWriter. This version will not have issues with removing line endings.
1

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); 
answered Jul 19, 2013 at 16:31

1 Comment

A bulk read with an array will be faster than reading a single character at a time.
1

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.

answered Jul 19, 2013 at 16:33

Comments

1

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);
}
answered Jun 21, 2018 at 13:29

Comments

0

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.

answered Jul 19, 2013 at 16:29

Comments

0

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();
 }
answered Jul 19, 2013 at 16:31

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.