| I/O stream classes can represent sources of 
              input data and destinations for output data. We saw, for 
              example, that disk files become sources 
              via FileInputStream 
              and a byte array can become the 
              destination of a stream via the ByteArrayOutputStream 
              class.  We emphasized that wrapper classes add greater functionality 
              to the streams they contain. However, you can also look at the wrapper 
              classes as filters. A stream filter monitors, transforms, 
              or is some way processes the data as the stream flows through it 
              on the way from a source to a destination. The BufferedInputStream 
              and BufferedOutputStream 
              classes, for example, hold data in buffers until they are full before 
              letting the data out. They extend the classes named FilterInputStream 
              and FilterOutputStream, 
              respectively.  The class heirarchy 
              diagram shown in the Java I/O Overview 
              shows the subclasses of the FilterInputStream 
              and FilterOutputStream. 
              The FilterInputStream 
              class wraps an InputStream 
              object passed via its constructor:   
              protected FilterInputStream 
                (InputStream in_stream)   The FilterInputStream 
              class overrides all of the same methods in InputStream 
              but they simply invoke the corresponding methods in the in_stream 
              object. The FilterInputStream 
              does nothing itself and is meant to be extended. A subclass overrides 
              some or all of the methods to carry out the desired action on the 
              data. For example, BufferedInputStream 
              overrides all but one of the read() 
              methods in FilterInputStream. 
              Similarly, FilterOutputStream 
              is intended to be subclassed by a class such as BufferedOutputStream 
              that overrides some or all of its methods to carry out operations 
              on the outgoing data.  Java I/O can be somewhat overwhelming at first but 
              it allows for a great deal of modularity and high level abstraction 
              that can actually bring clarity to program design. The concepts 
              of sources, destinations, and filters helps especially to make sense 
              of the large number of classes in Java I/O. We discuss in Chapter 
              9: Tech how to make histograms into stream sources and stream 
              destinations and how to filter data going to a histogram.   
              References & Web 
                Resources Latest update: Nov. 14, 2004  |