Introducción al tratamiento de ficheros en Java. E/S java.io.*
Paquete java.io
Todo dato tiene un origen de entrada o un destino de salida (convenientemente en inglés: I/O). Un programa trabaja con datos que provienen de una entrada la cual puede ser un teclado, un archivo en disco o un socket a través de la red. Así mismo un programa genera resultados enviándolos a una salida la cual puede ser la pantalla, un archivo en disco o un socket a través de la red. Como podemos comprender hay distintos orígenes de entrada y destinos de salida para los datos, en Java todos estos se consideran flujos (en inglés: streams) de datos para los cuales disponemos, en la API estándar, del paquete java.io especializado en la tarea de poder controlar estos flujos con cierta abstracción sobre el origen de los mismos, gracias a esto siempre podemos recurrir al mismo grupo de clases independientemente del caso a tratar.
Flujos de entrada y salida
Así que en Java podemos tener un flujo de entrada (en ingles: input stream) por el cual recibimos datos desde el exterior de nuestro programa, o un flujo de salida (en ingles: output stream) el cual envía nuestros datos hacia un cierto destino
Existen dos tipos de flujos según el tipo de dato:
- Flujos binarios – byte (8-bit): Es el tipo de flujo mas primitivo y portable, de echo cualquier otro tipo de flujo esta construido sobre este porque hablando a bajo nivel todas las operaciones de I/O son flujos de bytes. Nos permitirá trabajar adecuadamente con datos binarios tales como archivos de imagen, sonido, etc. Las clases principales para manejar estos flujos son las clases abstractas InputStreamy OutputStream de las cuales heredan otras sub-clases que implementan en formas mas concretas la misma tarea.
- Flujos de caracteres – char (16-bit): Es un tipo de flujo de caracteres en codificación Unicode, listo para la internacionalización, ideal para trabajar con texto plano. Las clases principales para manejar estos flujos son las clases abstractas Reader yWriter de las cuales heredan otras sub-clases que implementan en formas mas concretas la misma tarea. Cualquiera de estas clases realiza la conversión correspondiente de byte a char para leer o de char a byte para escribir.
Lectura y Escritura
- Lectura -
La clase InputStream:
int read() - Lee el próximo byte del flujo representado en un entero. Devuelve -1 si no quedan mas datos que leer.
int read(byte[] b) - Lee un arreglo de bytes del flujo.
int read(byte[] b, int off, int len) – Lee un arreglo de bytes del flujo, desde y hasta la posición indicada.
La clase Reader:
int read() – Lee el próximo carácter del flujo representado en un entero. Devuelve -1 si no quedan mas datos que leer.
int read(char[] cbuf) – Lee un arreglo de caracteres del flujo.
int read(char[] cbuf, int off, int len) – Lee un arreglo de caracteres del flujo, desde y hasta la posición indicada.
- Escritura -
La clase OutputStream:
void write(int b) – Escribe un solo byte en el flujo.
void write(byte[] b) – Escribe un arreglo de bytes en el flujo.
void write(byte[] b, int off, int len) – Escribe una porción de un arreglo de bytes en el flujo.
La clase Writer:
void write(int c) – Escribe un solo carácter en el flujo.
void write(char[] cbuf) – Escribe un arreglo de caracteres en el flujo.
void write(char[] cbuf, int off, int len) - Escribe una porción de un arreglo de caracteres en el flujo.
Entrada y Salida estándar
La clase System, en el paquete java.lang de la API estándar, posee referencias estáticas hacia tres objetos que representan flujos de datos ya abiertos y preparados para poder usarse. Estos flujos son:
InputStream in (InputStream) – Flujo de entrada estándar. Típicamente corresponde al teclado.
PrintStream out (OutputStream) – Flujo de salida estándar. Típicamente corresponde a la pantalla.
PrintStream err (OutputStream) – Flujo de salida estándar de errores. Típicamente corresponde a la pantalla.
java.io.IOException
Es un tipo de excepción generalizada que es lanzada cuando algún tipo de operación I/O ah fallado. Esta excepción debe de ser tratada ya sea manejándola con un bloque de código try-catch en el mismo momento que se realice la operación o dejando que se propague hacia arriba en la pila de llamadas utilizando throws IOException.