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.

Nick Heiner
fonte

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);
ChssPly76
fonte
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");
Asaph
fonte
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();
Kaelan Dawnstar
fonte
-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);

user7805633
fonte