In any IO, we have a streaming apps as a base class hierarchy. The difference between these are that object streams can have anything like the integers, strings, any arbitrary objects and why streams have only bytes. You can say, build a library that wraps another stream, say you build an SSH client that creates a tunnel and it exposes that as a stream. As long as you are able to consume a stream, you don't have to care how the stream works internally or what other streams it wraps. A good example of a stream wrapper is the TLS support. That's right there.