The pattern that allows you to "chain" them is fairly simple and elloquent. The way it works is that you can stack streams to get specialized streams that do a lot of stuff with few amounts of calls, by adding another layer. For instance:
Compression, Encryption, Object, Buffer, Socket ...
And order doesn't matter, in that you can put them in more or less any order that is needed by your application (but make sure your doing what you want, and that your doing them in the right order when doing the oppisite direction).
If I encrypt, compress, write to file .. then on the way out I need to read from file, decompress and then decrypt (oppisite order).
It's good to know the ones you use a lot... But being a good programmer has less to do with memorizing libraries and more to do with knowing where to get good answers quickly. In general, you don't want to read all the documentation ever written on every language before writing a line of code, but rather to write a lot of code and know where to look things up when you get stuck.