18.    InputStream (clase abstracta) java.io.InputStream

Madre de un conjunto de clases para leer ficheros byte a byte.

La clase derivada más habitual es

java.io.FileInputStream

FileInputStream(File file)

constructor

FileInputStream(String nombre) 

constructor

 

Todas las clases derivadas de InputStream proporcionan estos métodos:

java.io.InputStream

int available()

una estimación del número de bytes que quedan por leer

void close()

cierra el fichero

int read()

lee un byte

devuelve el byte leído pasado a entero

devuelve –1 si el fichero se ha acabado

int read(byte[] bytes)

lee un número 'n' de bytes igual o menor que la longitud del array 'bytes'

devuelve el número de bytes leídos;
los bytes leídos están en las posiciones
[0 .. n-1] del array 'bytes'

devuelve –1 si el fichero se ha acabado

int read(byte[] bytes,

         int start,

         int n)

lee un número 'n' de bytes

devuelve el número de bytes leídos;
los bytes leídos están en las posiciones
[start .. start+n-1] del array 'bytes'

devuelve –1 si el fichero se ha acabado

 

Es habitual preparar un array de cierto tamaño, pecando por exceso, para ir leyendo montones de bytes. En cada caso particular habrá que decidir cómo se van leyendo bytes para hacer lo que haya que hacerles. El ejemplo siguiente lee el fichero entero, devolviendo todos los bytes en un array:

    /**

     * Lectura de todos los bytes de un fichero.

     *

     * @param fichero nombre del fichero del que queremos leer.

     * @return todos los bytes en el fichero.

     * @throws IOException si hay problemas al abrir o al escribir.

     */

    public byte[] leeTodosLosBytes(String fichero)

            throws IOException {

        File file = new File(fichero);

        int longitud = (int) file.length();

        InputStream is = new FileInputStream(fichero);

        byte[] total = new byte[longitud];

        int leidos = 0;

        while (leidos < longitud) {

            int n = is.read(total, leidos, 1000);

            if (n < 0)

                break;

            leidos += n;

        }

        is.close();

        return total;

    }                 

 

Java proporciona una clase derivada, BufferedInputStream, que proporciona la misma funcionalidad, pero realiza una gestión más eficiente del fichero, leyendo muchos bytes de golpe para que las llamadas a los métodos 'read()' sean más rápidas.

El ejemplo anterior probablemente funcione más deprisa escrito de la siguiente forma:

    public byte[] leeTodosLosBytes(String fichero)

            throws IOException {

        File file = new File(fichero);

        int longitud = (int) file.length();

        InputStream is =

                new BufferedInputStream(

                        new FileInputStream(fichero));

        byte[] total = new byte[longitud];

        int leidos = 0;

        while (leidos < longitud) {

            int n = is.read(total, leidos, 1000);

            if (n < 0)

                break;

            leidos += n;

        }

        is.close();

        return total;

    }             

 

InputStream lee bytes (8 bits). Si necesita leer caracteres (16 bits), debe utilizar la clase Reader.

Ver File, Reader, OutputStream.

Temas relacionados

Las Bibliotecas de Java