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.

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

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

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.