Apa perbedaan antara Reader dan InputStream?

87

Apa perbedaan antara Reader dan InputStream? Dan kapan harus menggunakan apa? Jika saya dapat menggunakan Pembaca untuk membaca karakter mengapa saya akan menggunakan inputstream, saya kira untuk membaca objek?

sab
sumber
3
Mengenai "Saya kira membaca objek?", Ada aliran Input / Output khusus untuk membaca / menulis objek Java. Mereka masing-masing adalah ObjectInputStream dan ObjectOutputStream, dan merupakan bagian dari kerangka kerja serialisasi yang lebih besar. java.sun.com/developer/technicalArticles/Programming/… Tapi itu hanya satu penggunaan aliran input / output, yang lain bisa mengirim data melalui soket, dll.
Mark Peters

Jawaban:

138

InputStream adalah metode mentah untuk mendapatkan informasi dari sumber daya. Ini mengambil data byte demi byte tanpa melakukan terjemahan apa pun. Jika Anda membaca data gambar, atau file biner apa pun, inilah aliran yang akan digunakan.

Pembaca dirancang untuk aliran karakter. Jika informasi yang Anda baca semuanya teks, maka Pembaca akan menangani pengodean karakter untuk Anda dan memberi Anda karakter unicode dari aliran input mentah. Jika Anda membaca jenis teks apa pun, inilah aliran yang akan digunakan.

Anda dapat menggabungkan InputStream dan mengubahnya menjadi Reader dengan menggunakan kelas InputStreamReader.

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
Berin Loritsch
sumber
jawaban sempurna Berin! Terima kasih!
Gaurav
18

InputStreams digunakan untuk membaca byte dari aliran. Jadi mereka berguna untuk data biner seperti gambar, video dan objek berseri.

Pembaca di sisi lain adalah aliran karakter sehingga paling baik digunakan untuk membaca data karakter.

Vincent Ramdhanie
sumber
Kapan menggunakan read()byte demi byte dan kapan menggunakan read(byte[])array byte. Karena saya pikir membaca array selalu lebih baik. maka dapatkah Anda memberi saya contoh di mana menggunakan read()byte demi byte ATAU read(byte[])array byte. ATAU BufferedInputStream.?
Asif Mushtaq
11

Saya kira sumber kebingungannya adalah yang InputStream.read()mengembalikan intdan Reader.read()juga mengembalikan int.

Perbedaannya adalah bahwa InputStream.read()mengembalikan nilai byte antara 0 dan 255 sesuai dengan konten mentah aliran byte dan Reader.read()mengembalikan nilai karakter antara 0 dan 65357 (karena ada 65358 titik kode unicode yang berbeda)

Sebuah InputStreammemungkinkan Anda membaca isi byte dengan byte, misalnya isi "sebuah ‡ a" dibaca sebagai aliran 5 byte (masing-masing diwakili sebagai intantara 0 dan 255) yang mengakibatkan 97, 226, 128, 161dan 97di mana

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)

A Readermemungkinkan Anda membaca konten karakter demi karakter sehingga konten "a ‡ a" dibaca sebagai 3 karakter 97, 8225dan di 97mana

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

Karakter ‡ disebut sebagai U + 2021 di Unicode

RubenLaguna
sumber
Ini harus menjadi jawaban yang diterima. Terima kasih atas contohnya
alegria
2

Latar Belakang InputStream & Pembaca:

Pada masa-masa awal java, satu-satunya cara untuk melakukan input konsol adalah dengan menggunakan aliran byte (InputStream dan OutputStream).

Kasus penggunaan:

Saat ini, menggunakan aliran byte untuk membaca aliran konsol juga dapat diterima. Namun, untuk aplikasi komersial, metode yang disukai untuk membaca input konsol adalah dengan menggunakan aliran berorientasi karakter (Pembaca). Pembaca membuat Anda lebih mudah untuk menginternasionalkan dan memelihara.

Catatan: Ini hanyalah informasi tambahan untuk menjelajahi kode-kode Java I / O yaitu, pola desain implementasi Java I / O mengikuti pola desain dekorator. Jika Anda terbiasa dengan pola desain dekorator maka Anda dapat dengan mudah mengejar ketinggalan penerapannya.

Atif
sumber
1

Satu menerima byte dan yang lain menerima karakter.

Aaron McIver
sumber
0

InputStream menerima byte , Pembaca menerima karakter, Dalam Java, satu karakter = dua byte, dan Pembaca menggunakan buffer, InputStream tidak digunakan. Semua file disimpan dalam disk atau transfer berdasarkan byte, termasuk gambar dan video, tetapi karakter ada di memori, sehingga InputStream sering digunakan.

LiLi
sumber