The io classes that contain the
word "Stream" are for bytes. The ones that say "Reader" or "Writer" are for characters.
Basically, you start with an input or an output stream (like System.in for example). Then you can "wrap" other classes around it to add different levels of functionality to your stream.
For example, say you want to read input from the keyboard, one line at a time. How would you do it? System.in is an InputStream and doesn't have methods to read a line of text. You would do something like this:
The trick to this is that there are two classes that form a "bridge" between byte streams and character streams. These classes include the words "Stream" as well as "Reader" or "Writer". They are InputStreamReader and OutputStreamWriter. They take byte streams as arguments and add character stream functionality to them. So if you are starting with a raw byte stream like System.in, you need to use InputStreamReader to move over to character streams. Then you can use whatever character stream class you like to add more methods to your Reader/Writer.
HTH