Eu tenho uma função que pega um objeto de um certo tipo, e um PrintStream
para 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 toString
método.
Eu tenho uma função que pega um objeto de um certo tipo, e um PrintStream
para 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 toString
método.
Respostas:
Use um ByteArrayOutputStream
como 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.
ByteArrayOutputStream
tem 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);