2013-07-19 4 views
12

Sto cercando di convertire il mio StringReader di nuovo ad un normale String, come mostrato:Come si converte un StringReader in una stringa?

String string = reader.toString(); 

Ma quando provo a leggere questa stringa fuori, in questo modo:

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

Tutto che ottenga è un valore puntatore, come questo:

[email protected] 

Sto facendo qualcosa di sbagliato nel leggere la stringa indietro?

+5

Chiaramente, lo sei. http://docs.oracle.com/javase/7/docs/api/java/io/StringReader.html –

+1

Impossibile recuperare la stringa da un correttore di barre senza utilizzare read (. – hexafraction

risposta

9

Il metodo toString di StringReader non restituisce i buffer interni StringReader.

Per ottenere questo è necessario leggere dallo StringReader.

Si consiglia di utilizzare il sovraccarico di lettura che accetta un array di caratteri. Le letture di massa sono più veloci delle letture di singoli caratteri.

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

Si sta stampando il toString() dell'oggetto StringReader effettivo, NON il contenuto dello String che sta leggendo il StringReader.

È necessario utilizzare i metodi read() e/oi metodi read(char[] cbuf, int off, int len) per leggere i caratteri effettivi nella stringa.

1

reader.toString(); vi darà i risultati della chiamata del metodo generico toString() da Object classe.

È possibile utilizzare il metodo read():

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

} while (i != -1); 
+0

Una lettura di massa con un array verrà essere più veloce della lettura di un singolo personaggio alla volta. –

0

Se si utilizza il metodo toString() in un oggetto StringReader si stampare la posizione di memoria dell'oggetto. Hai utilizzato uno di questi metodi:

read() Legge un singolo carattere.

read(char[] cbuf, int off, int len) Legge i caratteri in una porzione di un array.

Ecco un esempio:

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

metodo chiamante toString() darà l'oggetto della classe StringReader. Se yo vuole il suo contenuto, allora avete bisogno di chiamare il metodo lettura su StringReader come questo:

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

Per esercitazioni è possibile utilizzare questo link.

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

String string = IOUtils.toString(reader); 
4

o utilizzando CharStreams da Googles Guava libreria:

CharStreams.toString(stringReader); 
3

Se si preferisce non utilizzare librerie esterne:

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

Il motivo per il controllo hasNext() è che next() esplode con un NoSuchElementException se il lettore avvolge una stringa vuota (lunghezza zero).