Подтвердить что ты не робот

InputStream vs 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();  

Является ли Reader обрабатывающим данные особым образом?

Просто пытаюсь разобраться во всем аспекте потоковой передачи i/o в Java.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Таким образом, чтение их как int и преобразование в char на самом деле не оптимально.

Это основное различие, которое я считаю.

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

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

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

Приветствия,

Ответ 3

Из InputStreamReader javadoc:

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

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

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

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

Ответ 4

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

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

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

Ответ 5

InputstreamReader используется для чтения данных Unicode, которые вы не можете прочитать во входном потоке.

Ответ 6

InputStream помогает нам читать потоки байтов
а InputStreamReader помогает декодировать эти потоки байтов в потоки char, используя некоторые кодировки, такие как UTF-8 или другие.
Но для большей эффективности Java API рекомендует использовать BufferedReader также вместе с InputStream и InputStreamReader