Jaka jest różnica między programem Reader a InputStream?

87

Jaka jest różnica między programem Reader a InputStream? A kiedy czego użyć? Jeśli mogę używać programu Reader do czytania znaków, dlaczego będę używał strumienia wejściowego, chyba do czytania obiektów?

sab
źródło
3
Jeśli chodzi o „Chyba czytać obiekty?”, Istnieją specjalne strumienie wejścia / wyjścia do odczytu / zapisu obiektów Java. Są to odpowiednio ObjectInputStream i ObjectOutputStream i są częścią większej struktury serializacji. java.sun.com/developer/technicalArticles/Programming/… Ale to tylko jedno użycie strumieni wejścia / wyjścia, inne mogą przesyłać dane przez gniazdo itp.
Mark Peters

Odpowiedzi:

138

InputStream to surowa metoda uzyskiwania informacji z zasobu. Przechwytuje dane bajt po bajcie bez wykonywania jakiegokolwiek tłumaczenia. Jeśli czytasz dane obrazu lub dowolny plik binarny, jest to strumień, którego należy użyć.

Czytnik jest przeznaczony do strumieni znaków. Jeśli czytane informacje to cały tekst, to Czytelnik zajmie się dekodowaniem znaków za Ciebie i da Ci znaki Unicode z surowego strumienia wejściowego. Jeśli czytasz dowolny typ tekstu, to jest strumień, którego należy użyć.

Możesz opakować InputStream i przekształcić go w czytnik przy użyciu klasy InputStreamReader.

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
Berin Loritsch
źródło
bezbłędna odpowiedź Berin! Dzięki!
Gaurav
18

InputStreams są używane do odczytywania bajtów ze strumienia. Są więc przydatne w przypadku danych binarnych, takich jak obrazy, wideo i zserializowane obiekty.

Z drugiej strony czytniki są strumieniami znaków, więc najlepiej nadają się do odczytu danych znakowych.

Vincent Ramdhanie
źródło
Kiedy używać read()bajtu po bajcie, a kiedy read(byte[])tablicy bajtów. Myślę, że tablica czytania jest zawsze lepsza. to czy możesz mi podać przykład, gdzie używać read()bajt po bajcie LUB read(byte[])tablicy bajtów. LUB BufferedInputStream.?
Asif Mushtaq
11

Myślę, że źródłem nieporozumień jest to, że InputStream.read()zwraca an, inta Reader.read()także zwraca int.

Różnica polega na tym, że InputStream.read()zwracają wartości bajtów z zakresu od 0 do 255 odpowiadające surowej zawartości strumienia bajtów i Reader.read()zwracają wartość znaku mieszczącą się w zakresie od 0 do 65357 (ponieważ istnieje 65358 różnych punktów kodowych Unicode)

InputStreamPozwala odczytać zawartość bajt po bajcie, na przykład zawartość „A ‡ A” są odczytywane jako strumień bajtów (5 każdego reprezentowanego jako intprzedziału od 0 do 255) powodując 97, 226, 128, 161i 97gdzie

a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)

ReaderPozwala odczytać znak po znaku zawartości więc zawartość „a ‡ A” są odczytywane jako 3 znaki 97, 8225i 97gdzie

a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97

Znak ‡ jest określany jako U + 2021 w Unicode

RubenLaguna
źródło
To powinna być akceptowana odpowiedź. Dziękuję za przykład
alegria
2

Tło InputStream i Reader:

We wczesnych latach javy jedynym sposobem wykonywania danych wejściowych konsoli było użycie strumienia bajtów (InputStream i OutputStream).

Przypadków użycia:

Obecnie użycie strumienia bajtów do odczytu strumienia konsoli jest również dopuszczalne. Jednak w przypadku zastosowań komercyjnych preferowaną metodą odczytu danych wejściowych konsoli jest użycie strumienia zorientowanego znakowo (Reader). Czytnik ułatwia umiędzynarodowienie i utrzymanie.

Uwaga: To jest tylko dodatkowa informacja dotycząca eksploracji kodów we / wy Java. Wzorzec projektowy implementacji we / wy Java jest zgodny ze wzorcem projektowym dekoratora. Jeśli znasz wzorzec projektowy dekoratora, możesz łatwo nadrobić zaległości w realizacji.

Atif
źródło
1

Jeden akceptuje bajty, a drugi akceptuje znaki.

Aaron McIver
źródło
0

InputStream akceptuje bajt , Reader akceptuje znak, w Javie jeden znak = dwa bajty, a czytnik używa bufora, InputStream nie używa. Wszystkie pliki są przechowywane na dysku lub przesyłane w oparciu o bajty, zawierają obraz i wideo, ale znak jest w pamięci, więc InputStream jest często używany.

LiLi
źródło