1. OutputStream
clase
Recientemente exploramos flujos de entrada. Es hora de hablar de flujos de salida.
La OutputStream
clase es la clase principal para todas las clases que admiten la salida de bytes. Esta es una clase abstracta que no hace nada por sí misma, pero tiene clases descendientes para cada ocasión.
Suena extremadamente complicado. En pocas palabras, esta clase opera con bytes y no, por ejemplo, con caracteres u otros tipos de datos. Y el hecho de que sea abstracto hace que normalmente no lo usemos, sino una de sus clases descendientes. Por ejemplo, FileOutputStream
y similares.
Pero volvamos a la OutputStream
clase. Esta clase tiene métodos que todas sus clases descendientes deben implementar. Aquí están los principales:
Métodos | Descripción |
---|---|
|
Escribe un byte (no un int ) en la secuencia. |
|
Escribe una matriz de bytes en la secuencia |
|
Escribe parte de una matriz de bytes en la secuencia |
|
Escribe todos los datos almacenados en el búfer en la secuencia |
|
Cierra la corriente |
Cuando crea un objeto de una clase que hereda InputStream
, generalmente especifica un objeto de origen del que InputStream
lee los datos. Cuando crea un objeto de una clase que hereda OutputStream
, también suele especificar el objeto de destino o la secuencia en la que se escribirán los datos.
Repasemos brevemente todos los métodos de la OutputStream
clase:
write(int b)
método
Este método escribe un byte (no un int
) en el flujo de salida. El valor pasado se convierte en un byte y los primeros tres bytes de int se descartan.
write(byte[] buffer)
método
Escribe la matriz dada de bytes en el flujo de salida. Eso es todo.
write(byte[] buffer, int offset, int length)
método
Escribe una parte de la matriz de bytes pasada en el flujo de salida. La variable de compensación indica el índice del primer elemento de la matriz y length
es la longitud del subconjunto que se escribirá.
flush()
método
El flush()
método se usa para forzar que cualquier dato potencialmente almacenado en el búfer en el flujo actual se escriba en el flujo de destino. Esto es relevante cuando se usa almacenamiento en búfer y/o múltiples objetos de flujo dispuestos en una cadena.
close()
método
Escribe cualquier dato no escrito en el objeto de destino. No es necesario llamar al close()
método si usa un try-with-resources
bloque.
Ejemplo de copia de un archivo
Código | Nota |
---|---|
|
InputStream para leer de un archivo OutputStream para escribir en un archivo Búfer en el que leeremos los datos Siempre que haya datos en el flujo Leer datos en el búfer Escribir los datos del búfer en el segundo flujo |
2. Writer
clase
La Writer
clase es exactamente igual que la OutputStream
clase, pero solo una diferencia una vez más: funciona con caracteres ( char
) en lugar de bytes.
Esta es una clase abstracta: no puede crear objetos de la Writer
clase. Su objetivo principal es ser una clase principal común para cientos de clases descendientes y brindarles métodos comunes para trabajar con flujos de caracteres.
Métodos de la Writer
clase (y todas sus clases descendientes):
Métodos | Descripción |
---|---|
|
Escribe un carácter (no un int ) en la secuencia. |
|
Escribe una matriz de caracteres en la secuencia. |
|
Escribe parte de una matriz de caracteres en la secuencia |
|
Escribe una cadena en la secuencia. |
|
Escribe parte de una cadena en la secuencia |
|
Escribe todos los datos almacenados en el búfer en la secuencia |
|
Cierra la corriente |
Los métodos son muy similares a los métodos de la OutputStream
clase, pero funcionan con caracteres en lugar de bytes.
Descripción de los métodos:
write(int b)
método
Este método escribe un solo carácter ( char
—no un int
) en el flujo de salida. El valor pasado se convierte en a char
y los dos primeros bytes se descartan.
write(char[] buffer)
método
Escribe la matriz dada de caracteres en el flujo de salida.
write(char[] buffer, int offset, int length)
método
Escribe una parte de la matriz de caracteres pasada en el flujo de salida. La offset
variable indica el índice del primer elemento de la matriz y length
es la longitud del subconjunto que se escribirá.
write(String str)
método
Escribe la cadena dada en el flujo de salida.
write(String str, int offset, int length)
método
Escribe una parte de la cadena dada en el flujo de salida: la cadena se convierte en una matriz de caracteres. La offset
variable indica el índice del primer elemento de la matriz y length
es la longitud del subconjunto que se escribirá.
flush()
método
El flush()
método se usa para forzar que cualquier dato potencialmente almacenado en el búfer en el flujo actual se escriba en el flujo de destino. Esto es relevante cuando se usa almacenamiento en búfer y/o múltiples objetos de flujo dispuestos en una cadena.
close()
método
Escribe cualquier dato no escrito en el objeto de destino. No es necesario llamar al close()
método si usa un try-with-resources
bloque.
Ejemplo de un programa que copia un archivo de texto:
Código | Nota |
---|---|
|
Reader para leer de un archivo Writer para escribir en un archivo Búfer en el que leeremos los datos Siempre que haya datos en el flujo Leer datos en un búfer Escribir los datos del búfer en el segundo flujo |
StringWriter
clase
Hay otra clase interesante que hereda la Writer
clase: se llama StringWriter
. Contiene una cadena mutable: un StringBuffer
objeto. Y cada vez que "escribe" algo en el StringWriter
objeto, el texto simplemente se agrega a su búfer interno.
Ejemplo:
Código | Nota |
---|---|
|
StringWriter Se crea un flujo de caracteres de destino ( ) Se escribe una cadena en el búfer dentro de StringWriter Se escribe una cadena en el búfer dentro de StringWriter Conversión del contenido de un objeto en una cadena |
En este caso, la StringWriter
clase es esencialmente un contenedor sobre la StringBuffer
clase, pero la StringWriter
clase es un descendiente de la Writer
clase de flujo y se puede usar en cadenas de objetos de flujo. Esta es una propiedad bastante útil en la práctica.
3. PrintStream
clase
Las clases de flujo de salida también se pueden poner en una cadena con flujos intermediarios que escriben datos en el flujo de destino que se les pasa. La vista general de la interacción de estos flujos se ve así:
El más interesante y versátil de todos los flujos de salida intermedios es PrintStream
. Tiene decenas de métodos y hasta 12 constructores.
La PrintStream
clase hereda la FilterOutputStream
clase, que hereda OutputStream
. Eso significa que la PrintStream
clase tiene todos los métodos de las clases principales además de sus propios métodos . Aquí están los más interesantes:
Métodos | Descripción |
---|---|
|
Convierte el objeto pasado en una cadena y lo envía a la secuencia de destino. |
|
Convierte el objeto pasado en una cadena y lo envía a la secuencia de destino. Agrega un salto de línea al final |
|
Envía un carácter de salto de línea al flujo de destino |
|
Construye y genera una cadena basada en la cadena de formato y los argumentos pasados; similar al String.format() método |
¿Y dónde están estas decenas de métodos, preguntas?
Bueno, tiene muchas variantes de los métodos print()
y println()
con diferentes parámetros. Se pueden resumir en esta tabla.
No profundizaremos en estos métodos, porque ya los conoces bien. ¿Puedes adivinar a lo que me refiero?
¿ Recuerdas System.out.println()
? Pero se puede escribir en dos líneas:
Código | Salida de consola |
---|---|
|
|
Nuestro comando favorito es una llamada al método en la variable estática de la clase. Y el tipo de esta variable es .System.out.println()
println()
out
System
PrintStream
¡En muchos niveles de CodeGym, y en casi todas las tareas, has estado llamando a métodos de la PrintStream
clase sin siquiera saberlo!
Uso práctico
Java tiene esta interesante clase llamada ByteArrayOutputStream
, que es una matriz de bytes que crece dinámicamente y que hereda OutputStream
.
Un ByteArrayOutputStream
objeto y PrintStream
un objeto se pueden encadenar así:
Código | Descripción |
---|---|
|
Cree un búfer de escritura en la memoria. Envuelva el búfer en un PrintStream objeto . Escriba datos en la consola. ¡Convierta la matriz en una cadena! Salida de la consola:
|
GO TO FULL VERSION