Creo que a las otras respuestas les falta un punto/pregunta importante.
¿Realmente debería utilizar un OutputStream?
Las jerarquías de clase OutputStream
y InputStream
son para escribir y leer datos orientados a bytes. Pero Java Strings no está orientado a bytes. Están orientados a caracteres (en una primera aproximación) y los caracteres en Java son unidades de código Unicode de 16 bits.
Cuando escribe caracteres en una secuencia de bytes, la JVM tiene que hacer una conversión a codificar los caracteres como bytes. De hecho, hay muchas maneras posibles de hacer esto. Por ejemplo, UTF-8 codificará cada carácter en la secuencia como uno o más bytes, Latin-1 o ASCII codificará un subconjunto de caracteres como bytes únicos y convertirá a otros en (probablemente) signos de interrogación. Y así.
Ahora bien, es posible escribir algo como esto:
public void print(String s){
o.write(s.getBytes());
}
pero tiene un problema.El problema es que el método getBytes()
en un String
usa el esquema de codificación de caracteres predeterminado de la JVM para realizar la conversión. Y esto (el esquema de codificación predeterminado) depende del entorno en el que se lanzó la JVM. Entonces ese código, hace cosas diferentes dependiendo del entorno. Ahora usted podría arreglar eso especificando el juego de caracteres:
public void print(String s){
o.write(s.getBytes("UTF-8"));
}
pero que consigue engorroso si llama getBytes en muchos lugares.
Si está realizando una gran cantidad de salida basada en texto, una mejor idea es utilizar la API Writer
en lugar de la API OutputStream
. La API Writer
y sus implementaciones se ocupan de la conversión bajo el capó ... y de manera más consistente y eficiente.
El punto final es que hay otras API que pueden ser útiles para realizar salidas basadas en texto.
- El
BufferedWriter
clase (y también BufferedOutputStream
) soporte de salida eficiente mediante la introducción de almacenamiento en búfer en memoria en el proceso de salida. Esto ahorra llamadas al sistema, especialmente si está realizando muchas pequeñas operaciones de escritura.
- La clase
PrintWriter
proporciona una gran cantidad de métodos prácticos y también elimina la necesidad de manejar IOExceptions. (Si ocurre una IOException, el PrintWriter
lo anota. Hay un método para probar si se ha producido una excepción. Esto puede ser útil o peligroso, dependiendo de lo que esté haciendo ...)
Debería 1) mira la API de OutputStream y usa los métodos disponibles, y 2) si tienes un error, publica el error aquí para que no tengamos que adivinar cuál es el problema. –
Por ejemplo, la API le mostrará que no hay un método OutputStream llamado write (...) que tome un parámetro String, por lo que no puede crear uno y esperar que funcione. En su lugar, debe usar los métodos disponibles. –