Java: PrintStream para String?


115

Eu tenho uma função que pega um objeto de um certo tipo, e um PrintStreampara o qual imprimir, e produz uma representação desse objeto. Como posso capturar a saída desta função em uma String? Especificamente, quero usá-lo como um toStringmétodo.

Respostas:


193

Use um ByteArrayOutputStreamcomo 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
Não se esqueça de fechar o PrintStream para liberar todos os recursos.
tobr de

9
Eu sugeriria usar PrintStream ps = new PrintStream(baos,true,"utf-8");para evitar o caos do conjunto de caracteres
Dr. Max Völkel

5
Uso new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);disponível desde 1.7 , ele não joga
câmera de ouvido de

2
@tobr certamente é uma boa regra, mas ByteArrayOutputStream.close()" não tem efeito ", já que não há recursos para liberar além do array de apoio que será tratado pelo coletor de lixo.
dimo414

ByteArrayOutputStreamtem toString(String charsetName), mas aceita apenas o argumento String. Observe também que ByteArrayOutputStream está sincronizado , o que provavelmente não é desejável
não entre em pânico

31

Você pode construir um PrintStream com um ByteArrayOutputStream passado para o construtor que pode ser usado posteriormente para capturar o texto escrito no PrintStream.

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

5

Uma unificação das respostas anteriores, esta resposta funciona com Java 1.7 e posteriores. Além disso, adicionei código para fechar o 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 inicialize uma variável Scanner chamada inSS que cria um fluxo de string de entrada usando a variável String myStrLine.

Resp: Scanner inSS = new Scanner (myStrLine);

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.