¿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.