Obtener un OutputStream en una cadena

¿Cuál es la mejor manera de canalizar la salida de un java.io.OutputStream a una cadena en Java?

Digamos que tengo el método:

writeToStream(Object o, OutputStream out) 

Que escribe ciertos datos del objeto a la secuencia dada. Sin embargo, quiero obtener esta salida en una cadena lo más fácilmente posible.

Estoy considerando escribir una clase como esta (no probada):

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

Pero hay una manera mejor? ¡Solo quiero hacer una prueba!

Yo usaría un ByteArrayOutputStream . Y al finalizar puedes llamar:

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

o mejor

 baos.toString( codepage ); 

Para el constructor de cadenas, la codepage puede ser una cadena o una instancia de java.nio.charset.Charset . Un posible valor es java.nio.charset.StandardCharsets.UTF_8 .

El método toString acepta solo un parámetro String as codepage (stand Java 8).

Me gusta la biblioteca Apache Commons IO. Eche un vistazo a su versión de ByteArrayOutputStream , que tiene un método toString(String enc) y toByteArray() . El uso de componentes existentes y confiables como el proyecto Commons permite que su código sea más pequeño y más fácil de extender y reutilizar. Buena suerte.

Esto funcionó bien

  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(); } }; 

método call = >> marshaller.marshal( (Object) toWrite , (OutputStream) output);

luego, para imprimir la cadena o simplemente hacer referencia a la secuencia de “salida” como ejemplo, para imprimir la cadena a console = >> System.out.println(output);

FYI: mi método llamado marshaller.marshal(Object,Outputstream) es para trabajar con XML. Es irrelevante para este tema.

Esto es altamente derrochador para uso productivo, hay demasiadas conversiones y es un poco flojo. Esto fue codificado para demostrarle que es totalmente posible crear un OuputStream personalizado y generar una cadena. Pero solo usa Horcrux7 y todo está bien con solo dos llamadas a métodos.

Y el mundo vive en otro día …

Esto es lo que terminé haciendo:

 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()); } 

Donde os es un ByteArrayOutputStream .

¿Por qué no usas ByteArrayOutputStream ? Eso es lo que se supone que debes usar para este propósito.