Obter um OutputStream em uma string

Qual é a melhor maneira de canalizar a saída de um java.io.OutputStream para uma String em Java?

Digamos que eu tenha o método:

writeToStream(Object o, OutputStream out) 

Que grava certos dados do object para o stream fornecido. No entanto, eu quero obter essa saída em uma String o mais facilmente possível.

Estou pensando em escrever uma aula assim (não testada):

 class StringOutputStream extends OutputStream { StringBuilder mBuf; public void write(int byte) throws IOException { mBuf.append((char) byte); } public String getString() { return mBuf.toString(); } } 

Mas há um caminho melhor? Eu só quero fazer um teste!

Eu usaria um ByteArrayOutputStream . E no final você pode ligar:

 new String( baos.toByteArray(), codepage ); 

ou melhor

 baos.toString( codepage ); 

Para o construtor String, a codepage pode ser uma String ou uma instância de java.nio.charset.Charset . Um valor possível é java.nio.charset.StandardCharsets.UTF_8 .

O método toString aceita apenas um parâmetro String como codepage (suporte Java 8).

Eu gosto da biblioteca Apache Commons IO. Dê uma olhada na sua versão do ByteArrayOutputStream , que possui um toString(String enc) e toByteArray() . Usar componentes existentes e confiáveis, como o projeto Commons, permite que seu código seja menor e mais fácil de ser estendido e adaptado. Boa sorte.

Isso funcionou muito bem

  OutputStream output = new OutputStream() { private StringBuilder string = new StringBuilder(); @Override public void write(int b) throws IOException { this.string.append((char) b ); } //Netbeans IDE automatically overrides this toString() public String toString(){ return this.string.toString(); } }; 

method call = >> marshaller.marshal( (Object) toWrite , (OutputStream) output);

em seguida, para imprimir a string ou obtê-la, basta referenciar o próprio stream “output” Como exemplo, para imprimir a string para o console = >> System.out.println(output);

FYI: my method call marshaller.marshal(Object,Outputstream) é para trabalhar com XML. É irrelevante para este tópico.

Isso é um grande desperdício para uso em produção, há uma conversão demais e é um pouco solto. Isso foi codificado apenas para provar a você que é totalmente possível criar um OuputStream personalizado e gerar uma string. Mas basta ir Horcrux7 e tudo é bom com apenas duas chamadas de método.

E o mundo vive em outro dia ….

Aqui está o que acabei fazendo:

 Obj.writeToStream(toWrite, os); try { String out = new String(os.toByteArray(), "UTF-8"); assertTrue(out.contains("testString")); } catch (UnsupportedEncondingException e) { fail("Caught exception: " + e.getMessage()); } 

Onde os é um ByteArrayOutputStream .

Por que você não usa um ByteArrayOutputStream ? Isso é o que você deveria usar para esse propósito.