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.
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:
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);
PrintStream ps = new PrintStream(baos,true,"utf-8");para evitar o caos do conjunto de caracteres
new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);disponível desde 1.7 , ele não joga
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.
ByteArrayOutputStreamtem toString(String charsetName), mas aceita apenas o argumento String. Observe também que ByteArrayOutputStream está sincronizado , o que provavelmente não é desejável
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");
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();
Talvez esta pergunta possa ajudá-lo: Obter um OutputStream em uma String
Subclasse OutputStream e envolva-o em PrintStream
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);