Java has two kinds of classes for I/O: streams and readers/writers.
Streams (InputStream, OutputStream and everything that extends these) are for reading and writing binary data: to read or write bytes from for example a file exactly as they are stored.
Readers and writers are a layer on top of streams, and these are for reading and writing text. Readers and writers convert from raw bytes to and from Unicode characters.
So, use streams when you need to read or write the bytes exactly as they appear in a file, and use readers and writers to read and write text files.