web-dev-qa-db-fra.com

Comment convertir un StringReader en une chaîne?

J'essaie de convertir ma StringReader en une String régulière, comme indiqué:

String string = reader.toString();

Mais quand j'essaie de lire cette chaîne, comme ceci:

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

Tout ce que je reçois est une valeur de pointeur, comme ceci:

Java.io.StringReader@2c552c55

Est-ce que je fais quelque chose de mal en lisant la chaîne? 

17
Zibbobz

La méthode StringReader de toString ne renvoie pas les tampons internes StringReader

Vous aurez besoin de lire la StringReader pour l'obtenir.

Je recommande d'utiliser la surcharge de read qui accepte un tableau de caractères. Les lectures en bloc sont plus rapides que les lectures à un seul caractère.

c'est à dire.

//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);
11
William Morrison
import org.Apache.commons.io.IOUtils;

String string = IOUtils.toString(reader);
24
ottago

Si vous préférez ne pas utiliser de bibliothèques externes:

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

La raison de la vérification hasNext() est que next() explose avec une NoSuchElementException si le lecteur enveloppe une chaîne vide (de longueur nulle).

5
Bohemian

Ou en utilisant CharStreams de la bibliothèque Googles Guava: 

CharStreams.toString(stringReader);
4
johnm

reader.toString(); vous donnera les résultats de l'appel de la méthode toString() générique à partir de la classe Object.

Vous pouvez utiliser la méthode read():

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

} while (i != -1);   
1
jh314

L'appel de la méthode toString () donnera l'objet de la classe StringReader. Si vous voulez que le contenu soit contenu, vous devez appeler la méthode read sur StringReader comme ceci:

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

Pour les tutoriels, vous pouvez utiliser ce link .

1
Ankur Lathi

Vous imprimez le toString() de l'objet StringReader réel, PAS le contenu de la String que StringReader lit. 

Vous devez utiliser les méthodes read() et/ou read(char[] cbuf, int off, int len) pour lire les caractères réels dans String.

0
Kirsten Koa

Si vous utilisez la méthode toString() dans un objet StringReader, vous imprimerez la position en mémoire de l'objet. Vous devez utiliser l'une de ces méthodes:

read() Lit un seul caractère.

read(char[] cbuf, int off, int len) Lit les caractères dans une partie d'un tableau.

Voici un exemple:

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

Une autre solution native (Java 8+) pourrait être de passer l'objet StringReader à un BufferedReader et stream par les lignes:

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