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.