The derived classes of FilterInputStream class takes input from a stream and filters it so that when you read from this stream, you get a filtered view of input. Similar is the case with FilterOutputStream class. Filtering merely means that the filter stream provides additional functionality such as buffering monitoring line numbers or aggregating data bytes into more meaningful primitive data type units. Thus filter streams have to work in tandem with a producer /consumer. The design of the filter classes allows multiple chained filters to be created using several layers of nesting. Each subsequent class accesses the output of the previous class through the in variable. This is called as Chaining of Streams.

The following is a sample program on Chaining of Streams using character stream classes. Here the FileReader actually reads from source file. The BufferedReader uses the FileReader object to read input from. The LineNumberBuffer reads from the BufferedReader object and allocates line numbers to each line.


public class DemoChanning {

  public static void main(String[] args) {

    String s;

    try {
      FileReader fr = new FileReader("C:\\rohit.txt");
      BufferedReader br = new BufferedReader(fr);
      LineNumberReader lr = new LineNumberReader(br);

      while ((s = lr.readLine()) != null)
        System.out.println(lr.getLineNumber() + " " + s);

    } catch (IOException e) {

Input File: rohit.txt


1 hi Mohit 
2 HOW IS your life going on?
3 it's gettting along fine.