21

我正在尝试将我的StringReaderback 转换为常规String,如图所示:

String string = reader.toString();

但是当我尝试读出这个字符串时,像这样:

System.out.println("string: "+string);

我得到的只是一个指针值,如下所示:

java.io.StringReader@2c552c55

我在读回字符串时做错了什么?

4

10 回答 10

28
import org.apache.commons.io.IOUtils;

String string = IOUtils.toString(reader);
于 2014-10-27T05:38:49.713 回答
12

的方法StringReadertoString返回StringReader内部缓冲区。

您需要阅读StringReader以获取此信息。

我建议使用接受字符数组的 read 重载。批量读取比单字符读取快。

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);
于 2013-07-19T16:29:41.390 回答
5

如果您不想使用外部库:

 Scanner scanner = new Scanner(reader).useDelimiter("\\A");
 String str = scanner.hasNext() ? scanner.next() : "";

hasNext()检查的原因是如果阅读器包装一个空白(零长度)字符串,则会next()爆炸。NoSuchElementException

于 2016-11-30T23:50:54.143 回答
5

或使用CharStreamsGoogles Guava 库:

CharStreams.toString(stringReader);
于 2016-01-11T10:21:46.850 回答
1

调用 toString() 方法将给出 StringReader 类的对象。如果你想要它的内容,那么你需要像这样调用 StringReader 上的 read 方法:

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();
      }
   }
}

对于教程,您可以使用此链接

于 2013-07-19T16:33:03.470 回答
1

reader.toString();将为您提供从类中调用泛型toString()方法的结果。Object

您可以使用以下read()方法:

int i;               
do {
    i = reader.read();
    char c = (char) i;
    // do whatever you want with the char here...

} while (i != -1);   
于 2013-07-19T16:31:17.040 回答
1

另一个本机(Java 8+)解决方案可能是将StringReader对象传递给 aBufferedReader并通过以下行进行流式传输

try (BufferedReader br = new BufferedReader(stringReader)) {
  br.lines().forEach(System.out::println);
}
于 2018-06-21T13:29:09.693 回答
0

您正在打印toString()实际StringReader对象的,而不是正在读取的String内容StringReader

您需要使用read()和/或read(char[] cbuf, int off, int len)方法来读取字符串中的实际字符。

于 2013-07-19T16:29:31.087 回答
0

如果您toString()StringReader对象中使用该方法,您将打印对象的内存位置。你有你使用这种方法之一:

read() 读取单个字符。

read(char[] cbuf, int off, int len) 将字符读入数组的一部分。

这里有一个例子:

     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();
    }
于 2013-07-19T16:31:18.283 回答
0

根据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());
于 2021-02-12T17:30:38.690 回答