|
|
Reading and Writing |
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.*; 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(); } }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.*; 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; } }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.
|
|
Reading and Writing |