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