Java: PrintStream a String?

115

Tengo una función que toma un objeto de cierto tipo, y una PrintStreamen la que imprimir, y genera una representación de ese objeto. ¿Cómo puedo capturar la salida de esta función en una cadena? Específicamente, quiero usarlo como toStringmétodo.

Nick Heiner
fuente

Respuestas:

193

Utilice a ByteArrayOutputStreamcomo búfer:

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
fuente
10
No olvide cerrar PrintStream para liberar todos los recursos.
tobr
9
Sugeriría usarlo PrintStream ps = new PrintStream(baos,true,"utf-8");para evitar el caos del
juego de
5
Uso new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);disponible desde 1.7 , no arroja
earcam
2
@tobr ciertamente es una buena regla general, pero ByteArrayOutputStream.close()" no tiene ningún efecto ", ya que no hay recursos para liberar además de la matriz de respaldo que será manejada por el recolector de basura.
dimo414
ByteArrayOutputStreamtiene toString(String charsetName), pero solo acepta el argumento String. También tenga en cuenta que ByteArrayOutputStream está sincronizado , lo que probablemente no sea deseable
no se asuste el
31

Puede construir un PrintStream con un ByteArrayOutputStream pasado al constructor que luego puede usar para tomar el texto escrito en PrintStream.

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

Una unificación de respuestas anteriores, esta respuesta funciona con Java 1.7 y posteriores. Además, agregué código para cerrar Streams.

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 Estrella del Alba
fuente
-3

Defina e inicialice una variable de escáner llamada inSS que crea una secuencia de cadena de entrada utilizando la variable de cadena myStrLine.

Respuesta: Escáner inSS = nuevo escáner (myStrLine);

usuario7805633
fuente