I guess, the difference is the same as between reader and inputstream: one is character-based, another is byte-based. For example, reader normally supports encoding…
Edit: Check this question: The difference between InputStream and InputStreamReader when reading multi-byte characters