You might have noticed that many of the I/O classes take as an argument to their constructors another stream type. The term for building streams from streams is referred to as chaining. The idea is that you will read each stream in the best manner depending on the type of data. If the data is text, the best way to read it is through a BufferedReader, but if the data is a collection of primitive types, it is best read using a DataInputStream.