Они, по сути, не одинаковы, но делают разные вещи для разных типов данных.
InputStream
и OutputStream
работа в байтах .Вы будете использовать их при работе с нетекстовой информацией (например, с изображением).
Reader
и Writer
работают с символами.Вы будете использовать их при работе с текстовой информацией.
Так что "да" и "нет".:-) InputStream
и Reader
оба предназначены для чтения информации (поток байтов или поток символов соответственно), а OutputStream
и Writer
оба предназначены для записи информации (поток байтов или поток)символов соответственно).То, что вы используете, зависит от того, с какими данными вы имеете дело.Потоки ориентированы на байты.Читатели / писатели ориентированы на символы.
Между двумя типами данных существуют классы мостов:
InputStreamReader
читает из InputStream
и преобразует байты в символы, используя CharSet
(один предоставлен явно или по имени). OutputStreamWriter
выполняет обратное преобразование: преобразует символы в байты (снова через CharSet
)и записывает байты в OutputStream
.
... но большинство Reader
/ Writer
подклассов считывают / записывают в источники / места назначения, которые уже символна основе, и поэтому не имеют дело с байтами вообще.Например, StringReader
читает символы из строки.Поскольку источник (строка) уже основан на символах, Reader
никогда не имеет дело с байтами, только с символами.