Java: da PrintStream a String?


115

Ho una funzione che prende un oggetto di un certo tipo e un PrintStreamda cui stampare e restituisce una rappresentazione di quell'oggetto. Come posso catturare l'output di questa funzione in una stringa? Nello specifico, voglio usarlo come in un toStringmetodo.

Risposte:


193

Usa a ByteArrayOutputStreamcome buffer:

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final String utf8 = StandardCharsets.UTF_8.name();
    try (PrintStream ps = new PrintStream(baos, true, utf8)) {
        yourFunction(object, ps);
    }
    String data = baos.toString(utf8);

10
Non dimenticare di chiudere PrintStream per liberare tutte le risorse.
— tobr

9
Suggerirei di utilizzare PrintStream ps = new PrintStream(baos,true,"utf-8");per evitare il caos del set di caratteri
— Dr. Max Völkel

5
Uso new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);disponibile dalla 1.7 , non lancia
— earcam

2
@tobr è sicuramente una buona regola pratica, ma ByteArrayOutputStream.close()" non ha effetto ", in quanto non ci sono risorse da liberare oltre all'array di supporto che verrà gestito dal garbage collector.
— dimo414

ByteArrayOutputStreamha toString(String charsetName), ma accetta solo l'argomento String. Nota anche che ByteArrayOutputStream è sincronizzato , il che probabilmente non è desiderabile
— niente panico

31

È possibile costruire un PrintStream con un ByteArrayOutputStream passato al costruttore che è possibile utilizzare in seguito per acquisire il testo scritto in PrintStream.

ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");

5

Un'unificazione delle risposte precedenti, questa risposta funziona con Java 1.7 e successivi. Inoltre, ho aggiunto il codice per chiudere gli stream.

final Charset charset = StandardCharsets.UTF_8;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos, true, charset.name());
yourFunction(object, ps);
String content = new String(baos.toByteArray(), charset);
ps.close();
baos.close();


-3

Definire e inizializzare una variabile Scanner denominata inSS che crea un flusso di stringhe di input utilizzando la variabile String myStrLine.

Risposta: Scanner inSS = nuovo scanner (myStrLine);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.