Как мне преобразовать StringReader в String?

Я пытаюсь преобразовать мой StringReader вернуться к обычному String, как показано:

String string = reader.toString();

Но когда я пытаюсь прочитать эту строку, вот так:

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

Все, что я получаю, это значение указателя, например:

java.io.StringReader@2c552c55

Я делаю что-то не так, читая строку назад?

10 ответов

Решение

StringReader"s toString метод не возвращает StringReader внутренние буферы.

Вам нужно будет прочитать из StringReader чтобы получить это.

Я рекомендую использовать перегрузку чтения, которая принимает массив символов. Массовое чтение выполняется быстрее, чем чтение одного символа.

то есть.

//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);
import org.apache.commons.io.IOUtils;

String string = IOUtils.toString(reader);

Если вы предпочитаете не использовать внешние библиотеки:

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

Причина для hasNext() проверить это next() взрывается с NoSuchElementException если читатель переносит пустую строку (нулевой длины).

Или используя CharStreams из библиотеки Googles Guava:

CharStreams.toString(stringReader);

Согласно 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());

Другим нативным (Java 8+) решением может быть передача StringReader возражать против BufferedReader и поток через линии:

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

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

Вызов метода toString() даст объект класса StringReader. Если вам нужно его содержимое, вам нужно вызвать метод read в StringReader следующим образом:

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

Для обучения вы можете использовать эту ссылку.

Если вы используете метод 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();
    }

Вы распечатываете toString() фактического StringReader объект, а не содержимое String что StringReader читает.

Вам нужно использовать read() и / или read(char[] cbuf, int off, int len) методы для чтения фактических символов в строке.

Другие вопросы по тегам