Tengo varios oyentes de salida que están implementando OutputStream. Puede ser una escritura PrintStream en stdout o en un archivo, o puede estar escribiendo en la memoria o en cualquier otro destino de salida; por lo tanto, especifiqué OutputStream como (un) argumento en el método.
Ahora, he recibido la cadena. ¿Cuál es la mejor manera de escribir en transmisiones aquí?
¿Debo usar Writer.write (message.getBytes ())? Puedo darle bytes, pero si la secuencia de destino es una secuencia de caracteres, ¿se convertirá automáticamente?
¿Necesito usar algunas corrientes de puente aquí en su lugar?
Respuestas:
Las secuencias (
InputStream
yOutputStream
) transfieren datos binarios . Si desea escribir una cadena en una secuencia, primero debe convertirla a bytes o, en otras palabras, codificarla . Puede hacerlo manualmente (como sugiere) utilizando elString.getBytes(Charset)
método, pero debe evitarloString.getBytes()
, ya que utiliza la codificación predeterminada de la JVM, que no puede predecirse de manera confiable de forma portátil.Sin embargo, la forma habitual de escribir datos de caracteres en una secuencia es envolver la secuencia en un
Writer
, (a menudo aPrintWriter
), que realiza la conversión por usted cuando llama a su métodowrite(String)
(oprint(String)
). El contenedor correspondiente para InputStreams es un lector .PrintStream
es unaOutputStream
implementación especial en el sentido de que también contiene métodos que codifican cadenas automáticamente (usa un escritor internamente). Pero sigue siendo una corriente. Puede envolver su transmisión de forma segura con un escritor, sin importar si se trata de unaPrintStream
implementación de alguna otra transmisión. No hay peligro de doble codificación.Ejemplo de PrintWriter con OutputStream:
fuente
PrintWriter
es como usarString.getBytes()
. Utiliza cualquier codificación aleatoria que sea la predeterminada de la JVM. Entonces solo funciona si tienes suerte.OutputStream escribe bytes, String proporciona caracteres. Necesita definir Charset para codificar la cadena al byte []:
Cambie
UTF-8
a un juego de caracteres de su elección.fuente
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Puede crear un PrintStream envolviendo su OutputStream y luego simplemente llamarlo print (String):
fuente
Por diseño se debe hacer de esta manera:
fuente
w.close()
se cerraráout
.Envuelva su OutputStream con un PrintWriter y use los métodos de impresión en esa clase. Toman una cuerda y hacen el trabajo por ti.
fuente
Puede usar Apache Commons IO :
fuente
IOUtils.write(String data, OutputStream output, Charset encoding)
se implementa comooutput.write(data.getBytes(Charsets.toCharset(encoding)))
, por lo que puede hacerlo si una cadena codificada no cabe en una matriz de bytes