¿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 en 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 (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? ¡Solo quiero hacer una prueba!
Respuestas:
Yo usaría a
ByteArrayOutputStream
. Y al finalizar puedes llamar:o mejor:
Para el
String
constructor,codepage
puede ser unaString
o una instancia de java.nio.charset.Charset . Un valor posible es java.nio.charset.StandardCharsets.UTF_8 .El método
toString()
acepta solo aString
comocodepage
parámetro (stand Java 8).fuente
defaultCharset
no es mejor que ignorar por completo el juego de caracteres: debe averiguar qué es antes de usarlotoString
StandardCharsets.UTF_8
es unCharset
, no unString
. Además, el parámetro se llamacharsetName
, nocodepage
.Me gusta la biblioteca Apache Commons IO. Eche un vistazo a su versión de ByteArrayOutputStream , que también tiene un
toString(String enc)
métodotoByteArray()
. 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.fuente
Esto funcionó bien
llamada al método = >>
marshaller.marshal( (Object) toWrite , (OutputStream) output);
luego para imprimir la cadena u obtenerla, simplemente haga referencia a la secuencia de "salida" en sí misma Como ejemplo, para imprimir la cadena en la consola = >>
System.out.println(output);
FYI: mi llamada al método
marshaller.marshal(Object,Outputstream)
es para trabajar con XML. Es irrelevante para este tema.Esto es muy 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 simplemente siga Horcrux7 y todo está bien con solo dos llamadas a métodos.
Y el mundo vive otro día ...
fuente
Esto es lo que terminé haciendo:
Donde os es a
ByteArrayOutputStream
.fuente
"UTF-8"
conStandardCharsets.UTF_8
.Java 14 - https://docs.oracle.com/
fuente