InputStream по сравнению с InputStreamReader

Каково преимущество использования InputStream InputStreamReader, или наоборот.

Вот пример InputStream в действии:

InputStream input = new FileInputStream("c:\\data\\input-text.txt");

int data = input.read();
while(data != -1) {
  //do something with data...
  doSomethingWithData(data);

  data = input.read();
}
input.close();

И вот пример использования InputStreamReader (очевидно, с помощью InputStream):

InputStream inputStream = new FileInputStream("c:\\data\\input.txt");
Reader      reader      = new InputStreamReader(inputStream);

int data = reader.read();
while(data != -1){
    char theChar = (char) data;
    data = reader.read();
}

reader.close();  

Читатель обрабатывает данные специальным способом?

Просто пытаясь получить мою голову вокруг целого i/o потоковая передача аспекта данных в Java.

53
задан Bahramdun Adil 1 August 2016 в 17:46
поделиться

4 ответа

Они представляют собой несколько разные вещи.

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

С другой стороны, InputStreamReader (и его отец Reader ) используются специально для работы с символами (то есть строками), поэтому они обрабатывают кодировки кодировки (utf8, iso-8859 -1 и т. Д.) Изящно.

Простой ответ: если вам нужны двоичные данные, вы можете использовать InputStream (также специальный, например DataInputStream ), если вам нужно работать с текстом, используйте InputStreamReader ..

83
ответ дан 7 November 2019 в 08:29
поделиться

Хорошо InputStreamReader используется для прямого чтения символов.

Поэтому чтение их как int и последующее преобразование в char не совсем оптимально.

Я считаю, что это главное различие.

InputStream дает вам байты, а InputStreamReader дает вам уже символы, поэтому он читает InputStream 8 бит за раз.

Кроме того, если вы читаете большие куски текста, вы даже можете заключить InputStreamReader в BufferedReader , который предоставляет вам несколько хороших методов, позволяющих, скажем, читать целые строки. однажды.

Это вам поможет?

Вы также можете прочитать эту статью: https://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

Ура,

27
ответ дан 7 November 2019 в 08:29
поделиться

Если вы хотите читать двоичные данные, используйте InputStream.

Если вы хотите читать строки из двоичного потока, используйте InputStreamReader. Один из его конструкторов позволяет указать набор символов.

По этой причине не используйте FileReader, поскольку он использует платформу по умолчанию для набора символов, что во многих случаях нецелесообразно.

5
ответ дан 7 November 2019 в 08:29
поделиться

Из документации InputStreamReader:

Класс для преобразования байтового потока в поток символов. Данные, прочитанные из исходный входной поток преобразуется в символы либо по умолчанию, либо предусмотрен конвертер символов. В кодировка по умолчанию взята из Системное свойство file.encoding. {@code InputStreamReader} содержит буфер байтов, прочитанных из источника поток и конвертирует их в символы по мере необходимости.

Для InputStreams, которые фактически содержат символы в известной кодировке, используйте средство чтения. В противном случае вы просто получите байты, и вам придется выполнить преобразование в char «вручную».

Разница между двумя методами чтения :

InputStream :: read считывает один байт и возвращает его как int , а InputStreamReader :: read считывает один char (с учетом кодировки) и возвращает его как int .

9
ответ дан 7 November 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: