What is practical usage of FilterOutputStream
in Java?
From javadocs:
This class is the superclass of all classes that filter output streams. These streams sit on top of an already existing output stream (the underlying output stream) which it uses as its basic sink of data, but possibly transforming the data along the way or providing additional functionality.
For me it seems to have same methods as OutputStream
(maybe it overrides them for some reason?). What kind of data "transformation" does it offer and when can one use it in own Java application?
Joshua Bloch in Effective Java Item 16: Favor composition over inheritance explains why inheritance is not always the best tool for the job. It is often more efficient to use Decorator pattern. FilterOutputStream and FilterInputStream are the base for implementing this pattern. For example I want to block OutputStream.close. This is what I could do
Now my class can accept any subclass of OutputStream and make it non-closeable.
It has the same methods as
OutputStream
, since it extendsOutputStream
. In fact, that is a very useful feature: you can supply aFilterOutputStream
anywhere anOutputStream
is expected.By default, a
FilterOutputStream
does not offer you any added functionality. As its Javadoc states:For example, you could extend
FilterOutputStream
and override thewrite(int b)
method in a way that it writes any byte you supply to it, except13
or10
. That way, you would have an outputstream that never contains newlines. It may not be of any use, but its just an example.CheckedInputStream
looked useful to me. It calculates a checksum based on data passed through it. I could see myself using that.Another example is the
DeflateOutputStream
which handles compressing data formatted correctly, automatically.I think you understand exactly what it's used for. Subclasses just manipulate data before forwarding it on to the underlying stream.
So as you suspected, it doesn't do much besides overrides the methods with a somewhat more useful implementation.
These classes are from Java 1.0, so they may not be designed in the best possible way. However, extending a
FilterStream
will still work just fine, in case you need to create your own (although there are ready-made filter streams (likeCheckedInputStream
,DigestInputStream
orCipherInputStream
) for plenty of things).