Java IO: SequenceInputStream
Jakob Jenkov |
The Java SequenceInputStream combines two or more other InputStream's into one. First
the SequenceInputStream will read all bytes from the first InputStream, then all bytes
from the second InputStream. That is the reason it is called a SequenceInputStream, since
the InputStream instances are read in sequence.
SequenceInputStream Example
It is time to see an example of how to use a SequenceInputStream.
Before you can use the SequenceInputStream you must import it in your Java class.
Here is how to import a SequenceInputStream:
import java.io.SequenceInputStream;
This import statement should be at the top of your Java class, right under the package declaration.
Now let us see how to use the SequenceInputStream. Here is a simple Java SequenceInputStream
example:
InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
InputStream input2 = new FileInputStream("c:\\data\\file2.txt");
SequenceInputStream sequenceInputStream =
new SequenceInputStream(input1, input2);
int data = sequenceInputStream.read();
while(data != -1){
System.out.println(data);
data = sequenceInputStream.read();
}
This Java code example first creates two FileInputStream instances. The FileInputStream extends
the InputStream class, so they can be used with the SequenceInputStream.
Second, this example creates a SequenceInputStream . The SequenceInputStream is given
the two FileInputStream instances as constructor parameters. This is how you tell the SequenceInputStream
to combine two InputStream instances.
The two InputStream instances combined with the SequenceInputStream can now be used as if
it was one coherent stream. When there is no more data to read from the second InputStream, the
SequenceInputStream read() method will return -1, just like any other InputStream
does.
Combining More Than Two InputStreams
You can combine more than two InputStream instances with the SequenceInputStream
in two ways. The first way is to put all the InputStream instances into a Vector,
and pass that Vector to the SequenceInputStream constructor. Here is an example of how
passing a Vector to the SequenceInputStream constructor looks:
InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
InputStream input2 = new FileInputStream("c:\\data\\file2.txt");
InputStream input3 = new FileInputStream("c:\\data\\file3.txt");
Vector<InputStream> streams = new Vector<>();
streams.add(input1);
streams.add(input2);
streams.add(input3);
SequenceInputStream sequenceInputStream =
new SequenceInputStream(streams.elements()))
int data = sequenceInputStream.read();
while(data != -1){
System.out.println(data);
data = sequenceInputStream.read();
}
sequenceInputStream.close();
The second method is to combine the InputStream instances two and two into SequenceInputStream
instances, and then combine these again with another SequenceInputStream. Here is how combining
more than two InputStream instances with multiple SequenceInputStream instances look:
SequenceInputStream sequenceInputStream1 =
new SequenceInputStream(input1, input2);
SequenceInputStream sequenceInputStream2 =
new SequenceInputStream(input3, input4);
SequenceInputStream sequenceInputStream =
new SequenceInputStream(
sequenceInputStream1, sequenceInputStream2)){
int data = sequenceInputStream.read();
while(data != -1){
System.out.println(data);
data = sequenceInputStream.read();
}
sequenceInputStream.close();
The resulting object graph looks like this:
Closing a SequenceInputStream
When you are finished reading data from the SequenceInputStream you should remember to close it.
Closing a SequenceInputStream will also close the InputStream instances which the
SequenceInputStream is reading.
Closing a SequenceInputStream is done by calling its close() method. Here is how
closing a SequenceInputStream looks:
sequenceInputStream.close();
You can also use the try-with-resources construct
introduced in Java 7. Here is how to use and close a SequenceInputStream looks with the try-with-resources
construct:
InputStream input1 = new FileInputStream("c:\\data\\file1.txt");
InputStream input2 = new FileInputStream("c:\\data\\file2.txt");
try(SequenceInputStream sequenceInputStream =
new SequenceInputStream(input1, input2)){
int data = sequenceInputStream.read();
while(data != -1){
System.out.println(data);
data = sequenceInputStream.read();
}
}
Notice how there is no longer any explicit close() method call. The try-with-resources construct
takes care of that.
Notice also that the two FileInputStream instances are not created inside
the try-with-resources block. That means that the try-with-resources block will not automatically close these
two FileInputStream instances. However, when the SequenceInputStream is closed
it will also close the InputStream instances it reads from, so the two FileInputStream
instances will get closed when the SequenceInputStream is closed.
| Tweet | |
Jakob Jenkov | |











