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