servletoutputstream example java string io stream

example - outputstream to string java



Obtener un OutputStream en una cadena (4)

¿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 tan fácilmente como sea posible.

Estoy considerando escribir una clase como esta (sin probar):

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? ¡Sólo quiero hacer una prueba!


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 .


Esto funcionó muy 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 para obtenerla, simplemente haga referencia a la secuencia de "salida" Como ejemplo, para imprimir la cadena en la consola = >> System.out.println(output);

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

Esto es un gran desperdicio para el uso productivo, hay demasiadas conversiones y es un poco flojo. Esto solo se codificó para demostrarle que es totalmente posible crear un OuputStream personalizado y generar una cadena. Pero vaya por Horcrux7 y todo está bien con solo dos llamadas de método.

Y el mundo vive en otro día ....


Me gusta la biblioteca IO de Apache Commons. Eche un vistazo a su versión de ByteArrayOutputStream , que tiene un método toString(String enc) así como 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.


Yo usaría un ByteArrayOutputStream . Y al terminar 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 valor posible es java.nio.charset.StandardCharsets.UTF_8 .

El método toString solo acepta una cadena como parámetro de codepage (stand Java 8).