## Trabajar con Canales Filtrados

Se puede añadir un canal filtrado a otro canal para filtrar los datos que se se están leyendo o escribiendo en el canal original. El paquete java.io contiene estos canales filtrados que son subclases de FilterInputStream o de FilterOutputStream:

- DataInputStream y DataOutputStream
- BufferedInputStream y BufferedOutputStream
- LineNumberInputStream
- PushbackInputStream
- PrintStream (este es un canal de salida)

Esta sección muestra cómo utilizar los canales filtrados a través de un ejemplo que utiliza DataInputStream y DataOutputStream. Además, esta sección muestra cómo escribir nuestros propios canales filtrados.

### Utilizar Canales Filtrados

> Para utilizar un canal filtrado de entrada (o salida), se añade el canal filtrado a otro canal de entrada (o salida). Se puede añadir un canal filtrado a otro canal cuando se crea. Por ejemplo, se puede añadir un DataInputStream al canal de entrada estandard de la siguiente forma:

>     DataInputStream dis = new DataInputStream(System.in.read());
>     String input;

>     while ((input = dis.readLine()) != null) {
>         . . . // Hacer algo interesante aquí
>     }

> Podrías hacer esto para poder utilizar los métodos más convenientes readXXX(), como readLine(), implementado por DataInputStream.

### Utilizar DataInputStream y DataOutputStream

> Esta página proporciona una explicación de un ejemplo de utilización de DataInputStream y DataOutputStream, dos canales filtrados que pueden leer y escribir datos de tipos primitivos de Java.

### Escribir Nuestros Propios Canales Filtrados

> La mayoría de los programadores encuentran la necesidad de implementar sus propios canales que filtren o procesen los datos que se están leyendo o escribiendo desde un canal. Algunas veces el procesamiento es independiente del formado de los datos, como un contador de los ítems de una cadena, y otras veces el procesamiento está relacionado directamente con los propios datos o el formato de los datos, como leer o escribir los datos contenidos en filas y columnas. Frecuentemente, estos programadores subclasifican FilterOutputStream y FileInputStream para conseguir sus objetivos.

Ozito