If the data is purely character data
you should use Reader and Writer.
If the data is binary you should use InputStream and OutputStream.
InputStream and OutputStream can handle character data as well, but they can mess up the encoding. That's why LineNumberInputStream and StringBufferWriter are deprecated.
Readers and Writers can also handle binary data technically (especially when used with InputStreamReader and OutputStreamWriter), but they will return chars and not bytes.