Introducción al tratamiento de ficheros en Java. E/S java.io.*

Todo dato tiene un origen de entrada o un destino de salida. Un programa trabaja con datos que provienen de una entrada la cual puede ser un teclado o un archivo en disco a través de la red. Así mismo un programa genera resultados enviándolos a una salida la cual puede ser la pantalla un o archivo en disco. Como podemos comprender hay distintos orígenes de entrada y destinos de salida para los datos, en Java todos estos se consideran flujos (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 (input stream) por el cual recibimos datos desde el exterior de nuestro programa, o un flujo de salida (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. 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 InputStream y 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 y Writer de las cuales heredan otras sub-clases que implementan en formas mas concretas la misma tarea.

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.

Cualquiera de estos flujos pueden ser redirigidos hacia otras fuentes o destinos.