Escribir cadena en la secuencia de salida

139

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?

yart
fuente
2
No estoy seguro, pero parece que está intentando reinventar la rueda aquí, ¿ha examinado la API base de Java y la API de IO de Commons?
posdef el

Respuestas:

149

Las secuencias ( InputStreamy OutputStream) 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 el String.getBytes(Charset)método, pero debe evitarlo String.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 a PrintWriter), que realiza la conversión por usted cuando llama a su método write(String)(o print(String)). El contenedor correspondiente para InputStreams es un lector .

PrintStreames una OutputStreamimplementació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 una PrintStreamimplementación de alguna otra transmisión. No hay peligro de doble codificación.

Ejemplo de PrintWriter con OutputStream:

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
    p.println("Hello");
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
}
MForster
fuente
3
Entonces usar PrintWriteres como usar String.getBytes(). Utiliza cualquier codificación aleatoria que sea la predeterminada de la JVM. Entonces solo funciona si tienes suerte.
Christoffer Hammarström
106

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

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

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

Peter Knego
fuente
3
Anexar con la siguiente línea. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Sahil Patel
32

Puede crear un PrintStream envolviendo su OutputStream y luego simplemente llamarlo print (String):

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();
Illarion Kovalchuk
fuente
2
¿Qué juego de caracteres utiliza PrintStream para convertir a bytes?
Dean Hiller
20

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
Antonio
fuente
3
Tenga en cuenta que también w.close()se cerrará out.
Franklin Yu el
12

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.

NG.
fuente