Stream is a metaphor in computer world, and it is also pervasive in our life. As for stream, I at first think of stream of water, which has two ends, one to flow in and one to flow out. Actually stream can be conceived as an abstract model, which is much like a pipe, that has one end for input and one end for output, but it is different from pipe because a stream can only have one end. In this perspective, anything that has flow direction can be abstracted as a stream. For example, a file can be read from or written to, thus a file can be viewed as a stream of bytes. A network interface can be conceived as a stream, for we can read data from it or write data to it. Even a string can be seen as a stream, for we can put chars or read chars from the string.
By abstracting an object as a stream, we have several advantages:
1) We have simplify the interface of the object that it exposes to the outside world, since a stream has very simple interfaces such as read, write, flush, geek. Simple interface means fewer coupling and fewer dependance and fewer bugs.
2) The model of stream is flexible. We can do some cache work in implementing a stream such as to improving the efficiency of the read/write operations. We can do some encoding or decoding work with a stream to fullfill some specific requirement. We can also concatenate several streams together, and one stream's output is the input of another stream, and each stream can do its specific job.