2009-12-09 3 views
1

В чем разница между Reader и InputStream?
Или, другими словами, какая разница между «потоком байтов» и «потоком символов»?
Интересно, когда я должен использовать InputStream или Reader в противном случае, не могли бы вы предложить материал для
меня для понимания вопроса?основной вопрос ввода-вывода

ответ

0

в простом разговоре: Откройте интересующий файл в блокноте или какой-либо другой текстовый редактор. Может вы читаете, как будто это естественный язык? Тогда вам, скорее всего, понадобится Reader, чтобы прочитать его также на Java, в итоге вы получите Strings. Вы вместо этого видите какой-то «мусор»? Затем вам понадобится InputStream, чтобы прочитать его на Java, вы получите байт-массивы (или потоки). Известными примерами двоичных файлов являются файлы изображений (gif, jpg, png и т. Д.) И офисные документы (doc, xls, ppt, pdf и т. Д.).

Вы также можете использовать InputStream, чтобы открыть текстовые файлы, но вы действительно не хотите использовать Reader для открытия двоичных файлов, потому что нет никаких средств кодирования символов. То же самое относится к использованию OutputStream и Writer. Ни в коем случае не используйте Writer для создания двоичных файлов.

2

Основной вопрос I/O приводит к Basic I/O tutorial :)

InputStream/OutputStream ручки байт, Reader/Writer обрабатывают многобайтовые символы.

1

В основном работа читателя с типом char полезна для читаемого человеком текста.

Reader:

... класс для чтения символьных потоков ...

работа потока непосредственно с типом byte полезными для двоичных данных.

InputStream:

..class [..], представляющий входной поток байтов ...

Ссылка читать дальше: Java I/O streams

Цитата:

Если вы не работаете с двоичными данными, такими как изображения и звуковые файлы, вы должны использовать чтения и записи (потоки символов) для чтения и записи информации по следующим причинам:

-Они может обрабатывать любой символ в Набор символов Unicode (в то время как потоки байтов ограничены 8-разрядными байтами ISO-Latin-1).

-Они облегчаются интернационализацией, поскольку они не зависят от конкретной кодировки символов.

-Они используют методы буферизации внутри и, следовательно, потенциально намного эффективнее, чем потоки байтов.

Статья датируется 98 годом, но она по-прежнему действительна.

0

От Java - Primitive Data Types:

байт: Тип байт данных представляет собой 8-разрядное знаковое двоичное дополнение целое. Он имеет минимальное значение -128 и максимальное значение 127 (включительно).Тип данных байтов может быть полезен для , сохраняя память в больших массивах, где экономия памяти на самом деле имеет значение. Их также можно использовать вместо int , где их лимиты помогают уточнить ваш код; тот факт, что диапазон значений переменной ограничен, может быть формой документации.

char: Тип данных char - это один 16-разрядный символ Юникода. Он имеет минимальное значение '\ u0000' (или 0) и максимальное значение '\ uffff' (или 65535 включительно).

8

Один из них представляет собой последовательность байтов (двоичных данных), а другую - последовательность символов (текст). Байты и персонажи совершенно разные вещи (не верьте стандарту C, это ложь!). Вы можете конвертировать между ними, используя кодировку символов - это то, что, например, InputStreamReader.

Далее материал для чтения: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

0

InputStreams сделки на самом низком уровне с исходными данными. Читатели находятся на чуть более высоком уровне абстракции, имея дело с символами (которые в конечном счете кодируются в базовом потоке байтов)

0

Существует хороший обзор различий в различных InputStream, OutputStreams, Reader's и Writer здесь, как часть более крупной обучающей программы, охватывающей Java IO:

http://tutorials.jenkov.com/java-io/overview.html