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?
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);
import org.Apache.commons.io.IOUtils;
String string = IOUtils.toString(reader);
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).
Ou en utilisant CharStreams
de la bibliothèque Googles Guava:
CharStreams.toString(stringReader);
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);
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 .
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.
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();
}
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);
}