Java: PrintStream zu String?

115

Ich habe eine Funktion, die ein Objekt eines bestimmten Typs und ein PrintStreamzu druckendes Objekt verwendet und eine Darstellung dieses Objekts ausgibt. Wie kann ich die Ausgabe dieser Funktion in einem String erfassen? Insbesondere möchte ich es wie in einer toStringMethode verwenden.

Nick Heiner
quelle

Antworten:

193

Verwenden Sie a ByteArrayOutputStreamals Puffer:

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);
ChssPly76
quelle
10
Vergessen Sie nicht, den PrintStream zu schließen, um alle Ressourcen freizugeben.
20.
9
Ich würde vorschlagen, zu verwenden PrintStream ps = new PrintStream(baos,true,"utf-8");, um Zeichensatz-Chaos zu vermeiden
Dr. Max Völkel
5
Verwendung new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);seit 1.7 verfügbar , es wirft nicht
earcam
2
@tobr ist sicherlich eine gute Faustregel, aber ByteArrayOutputStream.close()" hat keine Auswirkung ", da außer dem Backing-Array, das vom Garbage Collector behandelt wird, keine Ressourcen frei sind.
dimo414
ByteArrayOutputStreamhat toString(String charsetName), aber nur String-Argument akzeptieren. Beachten Sie auch, dass ByteArrayOutputStream synchronisiert ist , was wahrscheinlich nicht wünschenswert ist
keine Panik
31

Sie können einen PrintStream mit einem an den Konstruktor übergebenen ByteArrayOutputStream erstellen, mit dem Sie später den in den PrintStream geschriebenen Text abrufen können.

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

Diese Antwort ist eine Vereinheitlichung früherer Antworten und funktioniert mit Java 1.7 und höher. Außerdem habe ich Code hinzugefügt, um die Streams zu schließen.

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();
Kaelan Dawnstar
quelle
-3

Definieren und initialisieren Sie eine Scannervariable mit dem Namen inSS, die mithilfe der String-Variablen myStrLine einen Eingabe-String-Stream erstellt.

Antwort: Scanner inSS = neuer Scanner (myStrLine);

user7805633
quelle