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. 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
..
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.
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,]}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
.
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.
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
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.
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