## Introducción a los Canales de I/O

El paquete java.io contiene dos clases, InputStream y OutputStream, de las que derivan la mayoría de las clases de este paquete.

La clase InputStream es una superclase abstracta que proporciona un interface de programación mínimo y una implementación parcial del canal de entrada. La clase InputStream define métodos para leer bytes o arrays de bytes, marcar posiciones en el canal, saltar bytes de la entrada, conocer el número de bytes disponibles para ser leidos, y resetear la posición actual dentro del canal. Un canal de entrada se abre automáticamente cuando se crea. Se puede cerrar un canal explicitamente con el método close(), o puede dejarse que se cierre implicitamente cuando se recolecta la basura, lo que ocurre cuando el objeto deja de referenciarse.

La clase OutputStream es una superclase abstracta que proporciona un interface de programación mínimo y una implementación parcial de los canales de salida. Un canal de salida se abre automáticamente cuando se crea. Se puede cerrar un canal explicitamente con el método close(), o se puede dejar que se cierre implicitamente cuando se recolecta la basura, lo que ocurre cuando el objeto deja de referenciarse.

El paquete java.io contiene muchas subclases de InputStream y OutputStream que implementan funciones especificas de entrada y salida. Por ejempo, FileInputStream y FileOutputStream son canales de de entrada y salida que operan con ficheros en el sistema de ficheros nativo.

### Canales Simples de I/O

> Lo siguiente es una introducción a las clases no abstractas que descienden directamente desde InputStream y OutputStream:
> FileInputStream y FileOutputStream
>   Leen o escriben datos en un fichero del sistema de ficheros nativo.

> PipedInputStream y PipedOutputStream
>   Implementan los componentes de entrada y salida de una tubería. Las tuberías se utilizan para canalizar la salida de un programa hacia la entrada de otro. Un PipedInputStream debe ser conectado a un PipedOutputStream y un PipedOutputStream debe ser conectado a un PipedInputStream.

> ByteArrayInputStream y ByteArrayOutputStream
>   Leen o escriben datos en un array de la memoria.

> SequenceInputStream
>   Concatena varios canales de entrada dentro de un sólo canal de entrada.

> StringBufferInputStream
>   Permite a los programas leer desde un StringBuffer como si fuera un canal de entrada.

### Canales Filtrados

> FilterInputStream y FilterOutputStream son subclases de InputStream y OutputStream, respectivamente, y también son clases abstractas. Estas clases definen el interface para los canales filtrados que procesan los datos que están siendo leido o escritos. Por ejemplo, los canales filtrados BufferedInputStream y BufferedOutputStream almacenan datos mientras los leen o escriben para aumentar su velocidad.
> DataInputStream y DataOutputStream
>   Lee o escribe datos primitivos de Java en un máquina independiente del formato.

> BufferedInputStream y BufferedOutputStream
>   Almacena datos mientras los lee o escribe para reducir el número de accesos requeridos a la fuente original. Los canales con buffer son más eficientes que los canales similares sin buffer.

> LineNumberInputStream
>   Tiene en cuenta los números de línea mientras lee.

> PushbackInputStream
>   Un canal de entrada con un buffer de un byte hacia atrás. Algunas veces cuando se leen bytes desde un canal es útil chequear el siguiente caracter para poder decir lo que hacer luego. Si se chequea un carácter del canal, se necesitará volver a ponerlo en su sitio para que pueda ser leido y procesado normalmente.

> PrintStream
>   Un canal de salida con los métodos de impresión convenientes.

### Y el Resto...

> Además de la clases streams, el paquete java.io contiene estas otras clases:
> File
>   Representa un fichero en el sistema de ficheros nativo. Se puede crear un objeto File para un fichero en el sistema de ficheros nativo y luego pedirle al objeto la información que se necesite sobre el fichero (como su path completo).

> FileDescriptor
>   Representa un manejador de fichero (o descriptor) para abrir un fichero o una conexión.

> RandomAccessFile
>   Representa un fichero de acceso aleatorio.

> StreamTokenizer
>   Divide el contenido de un canal en Token (partes). Los Tokens son la unidad más pequeña reconocida por el algoritmo de analisis de texto (como son palabras, símbolos, etc...). Un Objeto StreamTokenize puede ser utilizado para analizar cualquier fichero de texto. Por ejemplo, podrías utilizarlo para dividir un fichero fuente de Java en nombres de variables, etc.. o un fichero HTML en etiquetas de HTML.

> Y finalmente el paquete java.io define tres interfaces:

> DataInput y DataOutput
>   Estos dos interfaces describen canales que pueden leer o escribir datos de tipos primitivos de Java en máquinas independientes del formato. DataInputStream, DataOutputStream, y RandomAccessFile implementan estos interfaces.

> FilenameFilter
>   El método list() de la clase File utiliza un objeto FilenameFilter para determinar los ficheros a listar en un directorio. Este interface acepta ficheros basándose en sus nombres. Se podría utilizar FileNameFilter para implementar un sencilla expresión de busqueda al estio de los comodines como fichero.* , etc...

Ozito