InputStream vs InputStreamReader

Jakie są korzyści z używania InputStream przez InputStreamReader lub odwrotnie.

Oto przykład InputStream w akcji:

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();
A oto przykład użycia InputStreamReader (oczywiście z pomocą 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();  
Czy czytnik przetwarza dane w sposób szczególny? Próbuję ogarnąć cały aspekt strumieniowania danych w Javie.
 50
Author: Bahramdun Adil, 2010-07-07

6 answers

Reprezentują one nieco inne rzeczy.

InputStream jest klasą przodka wszystkich możliwych strumieni bajtów, sama w sobie nie jest przydatna, ale wszystkie podklasy (jak FileInputStream, których używasz) świetnie radzą sobie z danymi binarnymi.

Z drugiej strony, InputStreamReader (i jego ojciec Reader) są używane specjalnie do radzenia sobie ze znakami (więc ciągami znaków), aby z wdziękiem obsługiwać kodowanie znaków (utf8, iso-8859-1 itd.).

Prosta odpowiedź brzmi: jeśli potrzebujesz danych binarnych możesz użyć InputStream (również konkretnego jak DataInputStream), jeśli chcesz pracować z tekstem użyj InputStreamReader..

 76
Author: Jack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 12:11:53

Well {[0] } służy do bezpośredniego odczytu znaków.

Więc odczytanie ich jako int, a następnie konwersja na char nie jest optymalne.

To jest główna różnica, w którą wierzę.

InputStream daje Ci bajty, a InputStreamReader daje Ci już znaki, więc odczytuje InputStream 8 bitów na raz.

Ponadto, jeśli czytasz duże fragmenty tekstu, możesz nawet zawinąć InputStreamReader w BufferedReader, co zapewnia kilka fajnych metod, powiedzmy, że czytasz całe wiersze na raz.

To ci pomaga ?

Możesz również przeczytać ten artykuł: https://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

Zdrówko, zdrówko, zdrówko, zdrówko, zdrówko,]}
 26
Author: Trefex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-19 12:51:12

Z InputStreamReader javadoc:

Klasa do zamiany strumienia bajtów na strumień postaci. Dane odczytane z strumień wejściowy źródła jest konwertowany na znaki albo domyślne, albo dostarczony konwerter znaków. Na domyślne kodowanie jest pobierane z "plik.encoding " właściwość systemu. {@code InputStreamReader} zawiera bufor bajtów odczytywanych ze źródła stream i zamienia je w postacie w razie potrzeby.

Dla InputStreams, które faktycznie zawierają znaki w znanym kodowaniu, użyj czytnika. W przeciwnym razie po prostu dostajesz bajty i będziesz musiał wykonać konwersję na znak 'ręcznie'.

Różnica między dwiema metodami read:

InputStream::read odczytuje pojedynczy byte i zwraca go jako int podczas gdy InputStreamReader::read odczytuje pojedynczy char (z poszanowaniem kodowania) i zwraca to jako int.

 9
Author: Andreas_D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-07 13:14:21

Jeśli chcesz odczytać dane binarne użyj InputStream.

Jeśli chcesz odczytać ciągi ze strumienia binarnego, użyj InputStreamReader. Jeden z jego konstruktorów pozwala określić zestaw znaków.

Z tego powodu nie należy używać programu FileReader, ponieważ używa on domyślnej platformy dla zestawu znaków, co w wielu przypadkach jest niepraktyczne.

 5
Author: Alexander Pogrebnyak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-07 13:10:33

InputStream pomaga nam odczytywać strumienie bajtów
a także mając na uwadze InputStreamReader pomaga dekodować te strumienie bajtów na strumienie znaków przy użyciu niektórych zestawów znaków, takich jak UTF-8 lub inne.
Ale dla większej wydajności Java API zaleca użycie BufferedReader również wraz z InputStreami InputStreamReader

 2
Author: AbSak-The Humble Learner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-26 05:09:15

InputstreamReader jest używany do odczytu danych Unicode, których nie można odczytać w inputstream.

 1
Author: Asthme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-20 04:47:41