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. |