I/O: Leer y Escibir

SequenceInputStream crea un s�lo stream de entrada desde varias fuentes de entrada. Este programa de ejemplo Concatenate, usa SequenceInputStream para implementar la utilidad de concatenaci�n que secuencialmente concatena ficheros en el orden que son listados en la l�nea de comandos:

Esta es la clase controladora de la utilidad Concatenate:

import java.io.*;

public class Concatenate {
    public static void main(String[] args) throws IOException {
        ListOfFiles mylist = new ListOfFiles(args);

        SequenceInputStream s = new SequenceInputStream(mylist);
        int c;

        while ((c = s.read()) != -1)
           System.out.write(c);

        s.close();
    }
}

Lo primero que hace esta clase es crear un objeto ListOfFiles llamado mylist que es inicializado con los argumentos de la l�nea de comandos introducidos por el usuario. Los argumentos de la l�nea de comandos listan los ficheros a concatenar. Se usa mylist para inicializar SequenceInputStream que usa mylist para obtener un nuevo InputStream para cada ficheros de lista:

import java.util.*;
import java.io.*;

public class ListOfFiles implements Enumeration {

    private String[] listOfFiles;
    private int current = 0;

    public ListOfFiles(String[] listOfFiles) {
        this.listOfFiles = listOfFiles;
    }

    public boolean hasMoreElements() {
        if (current < listOfFiles.length)
            return true;
        else
            return false;
    }

    public Object nextElement() {
        InputStream in = null;

        if (!hasMoreElements())
            throw new NoSuchElementException("No more files.");
        else {
            String nextElement = listOfFiles[current];
            current++;
            try {
                in = new FileInputStream(nextElement);
            } catch (FileNotFoundException e) {
                System.err.println("ListOfFiles: Can't open " + nextElement);
            }
        }
        return in;
    }
}

ListOfFiles implementa el interface Enumeration. Veremos como esto entra en juego cuando pasemos por el resto del programa.

Despu�s el m�todo main crea el SequenceInputStream, lee un byte cada vez. Cuando el SequenceInputStream necesita un InputStream de una nueva fuente (como para el primer byte le�do o cuando alcanza el final del inputstream actual), llama a nextElement sobre el objeto Enumeration para obetener el siguiente InputStream. ListOfFiles crea objetos FileInputStream enforma de lazo, lo que significa que siempre que SequenceInputStream llama a nextElement, ListOfFiles abre un FileInputStream sobre el siguiente nombre de ficheros de la lista y devuelve el stream. Cuando el ListOfFiles llega al final de los ficheros a leer (no tiene m�s elementos), nextElement devuelve null, y la llamada al m�todo read de SequenceInputStream devuelve -1 para indicar el final de la entrada.

Concatenate simplemente hace eco de todos los datos leidos desde el SequenceInputStream a la salida est�ndar.

Prueba Esto:

Intenta ejecutar Concatenate sobre los ficheros farrago.txt y words.txt que han sido usados como entradas para otros ejemplos de esta lecci�n.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO