【问题标题】:How do I convert a StringReader to a String?如何将 StringReader 转换为字符串?
【发布时间】:2013-07-19 00:46:33
【问题描述】:

我正在尝试将我的StringReader 转换回普通的String,如图所示:

String string = reader.toString();

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

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

我得到的只是一个指针值,像这样:

java.io.StringReader@2c552c55

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

【问题讨论】:

标签: java string tostring stringreader


【解决方案1】:
import org.apache.commons.io.IOUtils;

String string = IOUtils.toString(reader);

【讨论】:

    【解决方案2】:

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

    您需要阅读StringReader 才能获得此信息。

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

    即。

    //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);
    

    【讨论】:

      【解决方案3】:

      如果您不想使用外部库:

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

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

      【讨论】:

        【解决方案4】:

        或者使用来自 Googles Guava 库的CharStreams

        CharStreams.toString(stringReader);
        

        【讨论】:

          【解决方案5】:

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

          您可以使用read() 方法:

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

          【讨论】:

          • 使用数组进行批量读取比一次读取单个字符要快。
          【解决方案6】:

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

          对于教程,您可以使用此link

          【讨论】:

            【解决方案7】:

            另一种本机 (Java 8+) 解决方案可能是将 StringReader 对象传递给 BufferedReaderstream 通过行:

            try (BufferedReader br = new BufferedReader(stringReader)) {
              br.lines().forEach(System.out::println);
            }
            

            【讨论】:

              【解决方案8】:

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

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

              【讨论】:

                【解决方案9】:

                如果您在StringReader 对象中使用toString() 方法,您将打印该对象的内存位置。您使用过以下方法之一:

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

                【讨论】:

                  【解决方案10】:

                  根据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());
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-12-31
                    • 2018-04-30
                    • 2014-05-26
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-05-16
                    相关资源
                    最近更新 更多