Streams have been around since from the first version of Java. You have inputstreams and outputstreams that take care of reading and writing byte streams to data sinks. Since the JDK1.1, you have a new form of reading and writing data: readers and writers. Instead of using byte streams (8 bits), they use character streams (16 bit) to properly read and write Unicode.