Escribir una cadena en la secuencia de salida

Tengo varios oyentes de salida que están implementando OutputStream. Puede ser una escritura de PrintStream en la salida estándar o en un archivo, o puede escribir 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 el String. ¿Cuál es la mejor manera de escribir a los flujos 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 algunos arroyos puente aquí en su lugar?

Streams ( InputStream y OutputStream ) transfieren datos binarios . Si desea escribir una cadena en una secuencia, primero debe convertirla en bytes, o en otras palabras, codificarla . Puede hacerlo manualmente (como sugiera) usando el String.getBytes(Charset) , pero debe evitar el método String.getBytes() , ya que utiliza la encoding predeterminada de la JVM, que no se puede predecir de manera confiable en Una forma portátil.

Sin embargo, la forma habitual de escribir datos de caracteres en un flujo es envolver el flujo en un Writer (a menudo un PrintWriter ), que realiza la conversión cuando usted llama a su método de write(String) (o print(String) ) . El envoltorio correspondiente para InputStreams es un lector .

PrintStream es una implementación especial de OutputStream en el sentido de que también contiene métodos que codifican cadenas automáticamente (usa un escritor internamente). Pero sigue siendo una stream. Puede envolver de forma segura su flujo con un escritor, sin importar si es un PrintStream o alguna otra implementación de flujo. No hay peligro de doble encoding.

Ejemplo de PrintWriter con OutputStream:

 try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) { p.println("Hello"); } catch (FileNotFoundException e1) { e1.printStackTrace(); } 

OutputStream escribe bytes, String proporciona caracteres. Debe definir Charset para codificar la cadena a byte []:

 outputStream.write(string.getBytes(Charset.forName("UTF-8"))); 

Cambie UTF-8 a un conjunto de caracteres de su elección.

Puede crear un entorno PrintStream alrededor de OutputStream y luego llamar a print (Cadena):

 final OutputStream os = new FileOutputStream("/tmp/out"); final PrintStream printStream = new PrintStream(os); printStream.print("String"); printStream.close(); 

Por diseño se debe hacer de esta manera:

 OutputStream out = ...; try (Writer w = new OutputStreamWriter(out, "UTF-8")) { w.write("Hello, World!"); } // or w.close(); //close will auto-flush 

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.

Puedes usar Apache Commons IO :

 try (OutputStream outputStream = ...) { IOUtils.write("data", outputStream, "UTF-8"); } 
  • IOUtils.write (datos de cadena, salida de OutputStream, encoding de cadena)