Java's stream-based I/O is built upon four abstract classes: InputStream, OutputStream, Reader, and Writer. They are used to create several concrete stream subclasses.
InputStream and OutputStream are designed for byte streams. Reader and Writer are designed for character streams.
The byte stream classes and the character stream classes form separate hierarchies.
You use the character stream classes when working with characters or strings. You use the byte stream classes when working with bytes or other binary objects.