##
STREAMS DE ENTRADA

Hay muchas clases dedicadas a la obtención de entrada desde un fichero. Este es el esquema de la jerarquía de clases de entrada por fichero:

### Objetos FileInputStream

Los objetos FileInputStream típicamente representan ficheros de texto accedidos en orden secuencial, byte a byte. Con FileInputStream, se puede elegir acceder a un byte, varios bytes o al fichero completo.

#### Apertura de un FileInputStream

Para abrir un FileInputStream sobre un fichero, se le da al constructor un String o un objeto File:

        FileInputStream mi FicheroSt;
        miFicheroSt = new FileInputStream( "/etc/kk" );

También se puede utilizar:

        File miFichero FileInputStream miFicheroSt;
        miFichero = new File( "/etc/kk" );
        miFicheroSt = new FileInputStream(
        miFichero );

#### Lectura de un FileInputStream

Una vez abierto el FileInputStream, se puede leer de él. El método read() tiene muchas opciones:

`int read();`

> Lee un byte y devuelve -1 al final del stream.

`int read( byte b[] );`

> Llena todo el array, si es posible. Devuelve el número de bytes leídos o -1 si se alcanzó el final del stream.

`int read( byte b[],int offset,int longitud );`

> Lee longitud bytes en `b` comenzando por `b[offset]`. Devuelve el número de bytes leídos o -1 si se alcanzó el final del stream.

#### Cierre de FileInputStream

Cuando se termina con un fichero, existen dos opciones para cerrarlo: explícitamente, o implícitamente cuando se recicla el objeto (el garbage collector se encarga de ello).

Para cerrarlo explícitamente, se utiliza el método close():

        miFicheroSt.close();

#### Ejemplo: Visualización de un fichero

Si la configuración de la seguridad de Java permite el acceso a ficheros, se puede ver el contenido de un fichero en un objeto TextArea. El código siguiente contiene los elementos necesarios para mostrar un fichero:

        FileInputStream fis;
        TextArea ta;

        public void init() {
            byte b[] = new byte[1024];
            int i;

            // El buffer de lectura se debe hacer lo suficientemente grande
            // o esperar a saber el tamaño del fichero
            String s;

            try {
                fis = new FileInputStream( "/etc/kk" );
            } catch( FileNotFoundException e ) {
                /* Hacer algo */
                }

            try {
                i = fis.read( b );
            } catch( IOException e ) {
                /* Hacer algo */
                }

            s = new String( b,0 );
            ta = new TextArea( s,5,40 );
            add( ta );
            }

Hemos desarrollado un ejemplo, Agenda.java, en el que partimos de un fichero agenda que dispone de los datos que nosotros deseamos de nuestros amigos, como son: nombre, teléfono y dirección. Si tecleamos un nombre, buscará en el fichero de datos si existe ese nombre y presentará la información que se haya introducido. Para probar, intentar que aparezca la información de Pepe.

### Objetos DataInputStream

Los objetos DataInputStream se comportan como los FileInputStream. Los streams de datos pueden leer cualquiera de las variables de tipo nativo, como floats, ints o chars. Generalmente se utilizan DataInputStream con ficheros binarios.

#### Apertura y cierre de DataInputStream

Para abrir y cerrar un objeto DataInputStream, se utilizan los mismos métodos que para FileInputStream:

    DataInputStream miDStream;
    FileInputStream miFStream;

    // Obtiene un controlador de fichero
    miFStream = new FileInputStream "/etc/ejemplo.dbf" );
    //Encadena un fichero de entrada de datos
    miDStream = new DataInputStream( miFStream );

    // Ahora se pueden utilizar los dos streams de entrada para
    // acceder al fichero (si se quiere...)
    miFStream.read( b );
    i = miDStream.readInt();

    // Cierra el fichero de datos explícitamente
    //Siempre se cierra primero el fichero stream de mayor nivel
    miDStream.close();
    miFStream.close();

#### Lectura de un DataInputStream

Al acceder a un fichero como DataInputStream, se pueden utilizar los mismos métodos read() de los objetos FileInputStream. No obstante, también se tiene acceso a otros métodos diseñados para leer cada uno de los tipos de datos:

        byte readByte()
        int readUnsignedByte()
        short readShort()
        int readUnsignedShort()
        char readChar()
        int readInt()
        long readLong()
        float readFloat()
        double readDouble()
        String readLine()

Cada método leerá un objeto del tipo pedido.

Para el método String readLine(), se marca el final de la cadena con \n, \r, \r\n o con EOF.

Para leer un long, por ejemplo:

        long numeroSerie;
        ...
        numeroSerie = miDStream.readLong();

### Streams de entrada de URLs

Además del acceso a ficheros, Java proporciona la posibilidad de acceder a URLs como una forma de acceder a objetos a través de la red. Se utiliza implícitamente un objeto URL al acceder a sonidos e imágenes, con el método getDocumentBase() en los applets:

        String imagenFich = new String( "imagenes/pepe.gif" );
        imagenes[0] = getImage( getDocumentBase(),imagenFich );

No obstante, se puede proporcionar directamente un URL, si se quiere:

        URL imagenSrc;
        imagenSrc = new URL( "http://enterprise.com/~info" );
        imagenes[0] = getImage( imagenSrc,"imagenes/pepe.gif" );

#### Apertura de un Stream de entrada de URL

También se puede abrir un stream de entrada a partir de un URL. Por ejemplo, se puede utilizar un fichero de datos para un applet:

        ImputStream is;
        byte buffer[] = new byte[24];
        is = new URL( getDocumentBase(),datos).openStream();

Ahora se puede utilizar is para leer información de la misma forma que se hace con un objeto FileInputStream:

        is.read( buffer,0,buffer.length );

NOTA: Debe tenerse muy en cuenta que algunos usuarios pueden haber configurado la seguridad de sus navegadores para que los applets no accedan a ficheros.

|  | ##### [Anterior] [Indice] [Siguiente]