2010-11-01 9 views
96

Tengo varios oyentes de salida que están implementando OutputStream. Puede ser una escritura de PrintStream a stdout o a 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.Escribir cadena en la secuencia de salida

Ahora, he recibido el String. ¿Cuál es la mejor manera de escribir en transmisiones aquí?

¿Debo simplemente usar Writer.write (message.getBytes())? Puedo darle bytes, pero si la secuencia de destino es una secuencia de caracteres, ¿se convertirá automáticamente?

¿Debo usar aquí algunos enlaces de puente?

+1

No estoy seguro, pero esto suena como si estuviera tratando de reinventar la rueda aquí, has mirado a través de la J ava Base API, así como Commons IO API? – posdef

Respuesta

118

Streams (InputStream y OutputStream) transferencia de datos binarios. Si desea escribir una cadena en una secuencia, primero debe convertirla a bytes o, en otras palabras, codificar. Puede hacerlo manualmente (como sugiere) utilizando el método String.getBytes(Charset), pero debe evitar el método String.getBytes(), porque utiliza la codificación predeterminada de la JVM, que no se puede predecir de manera confiable de forma portátil.

La forma habitual de escribir los datos de caracteres a una corriente, no obstante, es envolver el flujo en un Writer, (a menudo un PrintWriter), que hace la conversión para que cuando se llama a su método write(String) (o print(String)). El contenedor correspondiente para InputStreams es Reader.

PrintStream es una implementación especial OutputStream en el sentido de que también contiene métodos que codifican cadenas de manera automática (utiliza una grabadora internamente). Pero sigue siendo un flujo. Puede ajustar de forma segura su transmisión con un escritor, sin importar si es PrintStream o alguna otra implementación de 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(); 
} 
11

Envuelva su OutputStream con un PrintWriter y use los métodos de impresión en esa clase. Toman una Cadena y hacen el trabajo por ti.

29

Puede crear una envoltura alrededor de su PrintStream OutputStream y luego simplemente llamar a su impresión (String):

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

¿Qué conjunto de caracteres usa PrintStream para convertir a bytes? –

73

OutputStream escribe bytes, de cadena proporciona caracteres. Es necesario definir Juego de caracteres para codificar la cadena de byte []:

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

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

+0

Agregue la siguiente línea. 'ByteArrayOutputStream outputStream = new ByteArrayOutputStream();' –

11

By design que se va a 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 
+1

Tenga en cuenta que 'w.close()' cerrará 'out' también. –

Cuestiones relacionadas