|
|
Input and Output Streams |
TheSequenceInputStreamcreates a single input stream from multiple input sources. This example program, Concatenate, uses
SequenceInputStreamto implement a concatenation utility that sequentially concatenates files together in the order they are listed on the command line.This is the controlling class of the
Concatenateutility:The first thing that theimport java.io.*; class Concatenate { public static void main(String[] args) { ListOfFiles mylist = new ListOfFiles(args); try { SequenceInputStream s = new SequenceInputStream(mylist); int c; while ((c = s.read()) != -1) { System.out.write(c); } s.close(); } catch (IOException e) { System.err.println("Concatenate: " + e); } } }Concatenateutility does is create aListOfFilesobject namedmylistwhich is initialized from the command line arguments entered by the user. The command line arguments list the files to be concatenated together.mylistis used to initialize theSequenceInputStreamwhich usesmylistto get a newInputStreamfor every filename listed by the user.ListOfFiles implements theimport java.util.*; import java.io.*; class ListOfFiles implements Enumeration { String[] listOfFiles; int current = 0; ListOfFiles(String[] listOfFiles) { this.listOfFiles = listOfFiles; } public boolean hasMoreElements() { if (current < listOfFiles.length) return true; else return false; } public Object nextElement() { InputStream is = null; if (!hasMoreElements()) throw new NoSuchElementException("No more files."); else { try { String nextElement = listOfFiles[current]; current++; is = new FileInputStream(nextElement); } catch (FileNotFoundException e) { System.out.println("ListOfFiles: " + e); } } return is; } }Enumerationinterface. You'll see how this comes into play as we walk through the rest of the program.
After the
mainmethod creates theSequenceInputStream, it reads from it one byte at a time. When theSequenceInputStreamneeds anInputStreamfrom a new source (such as for the first byte read or when it runs off the end of the current input stream), it callsnextElementon theEnumerationobject to get the next InputStream.ListOfFilescreatesFileInputStreamobjects lazily, meaning that wheneverSequenceInputStreamcallsnextElement,ListOfFilesopens aFileInputStreamon the next filename in the list and returns the stream. When theListOfFilesruns out of files to read (it has no more elements),nextElementreturns null, and the call toSequenceInputStream'sreadmethod returns -1 to indicate the end of input.
Concatenatesimply echos all the data read from theSequenceInputStreamto the standard output.
Try this: Try runningConcatenateon thefarrago.txtandwords.txtfiles which are used as input to other examples in this lesson.
|
|
Input and Output Streams |