InputStream and OutputStream are indeed for reading and writing bytes (binary data).
Readers and Writers are for reading and writing text. Text is ofcourse ultimately also stored as bytes on disk, but those bytes have to be interpreted a certain way to convert them into characters. How that interpretation is done is defined by the character encoding. There are many different character encodings, for example UTF-8, ISO-8859-1 etc.
A Reader reads data from an underlying InputStream and interprets the bytes using a specific character encoding to convert the bytes into chars. A Writer uses a specific character encoding to convert chars into bytes.
The number of bytes that one character takes up can be variable. For example in
UTF-8 one character takes up between 1 and 4 bytes.