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.