1. InputStreamReader
kelas
Fitur lain yang menarik dari aliran adalah Anda dapat menggabungkan beberapa aliran menjadi rantai . Aliran dapat membaca data tidak hanya dari sumber data internalnya, tetapi juga dari aliran lain .
Ini adalah mekanisme yang sangat kuat di Java, yang memungkinkan untuk membuat skenario pembacaan data yang kompleks dengan menghubungkan satu aliran ke aliran lainnya. Skema seperti itu terlihat seperti ini:
Ketika sebuah program membaca data dari aliran data, aliran data pada gilirannya membaca data dari sumber datanya, yang merupakan aliran data atau file lain, misalnya.
Terlebih lagi, setiap aliran data tidak hanya membaca dan memberikan data, tetapi juga dapat mengubahnya atau melakukan berbagai operasi di atasnya. Contoh yang baik dari "aliran perantara" semacam itu adalah kelasnya InputStreamReader
.
Kami sudah tahu kelas yang disebut FileReader
- itu adalah Reader
yang membaca data dari file. Dan InputStreamReader
dari mana mendapatkan datanya? Itu benar - dari file InputStream
.
Saat Anda membuat InputStreamReader
objek, Anda harus meneruskan InputStream
objek atau salah satu kelas turunannya. Contoh:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
Kelas InputStreamReader
memiliki semua metode yang Reader
dimiliki kelas, dan mereka bekerja dengan cara yang persis sama.
Perbedaan utama antara InputStreamReader
kelas dan, katakanlah, FileReader
dari mana mereka membaca data. FileReader
membaca data dari file (ya — itulah mengapa disebut FileReader
), tetapi InputStreamReader
membaca data dari file InputStream
.
Saat Anda membaca karakter dari FileReader
objek menggunakan read()
metode ini, karakter tersebut akan membaca dua byte dari file di disk dan mengembalikannya sebagai chars
.
Ketika Anda membaca karakter dari sebuah InputStreamReader
objek menggunakan read()
metode ini, pada gilirannya membaca dua byte dari FileInputStream
objek yang diteruskan ke sana, yang pada gilirannya membaca data dari file. Hasilnya adalah serangkaian panggilan ke read()
metode.
2. BufferedReader
kelas
Kelas menarik lainnya yang mungkin sering Anda gunakan adalah BufferedReader
. Ini juga merupakan "aliran perantara" yang membaca data dari aliran lain.
Seperti namanya, BufferedReader
kelas adalah subkelas dari Reader
dan memungkinkan Anda membaca karakter . Namun yang paling menarik adalah Anda juga perlu mengirimkannya sumber data berupa aliran dari mana karakter dapat dibaca , yaitu aliran yang mewarisi Reader
kelas.
Apa gunanya? Tidak seperti InputStreamReader
, BufferedReader
kelas tidak mengonversi byte menjadi karakter: kelas tidak mengonversi apa pun. Sebaliknya, itu buffer data .
Ketika sebuah program membaca satu karakter dari sebuah BufferedReader
objek, objek tersebut membaca sejumlah besar karakter dari aliran sumbernya sekaligus. Dan menyimpannya secara internal.
Saat karakter berikutnya dibaca dari objek BufferedReader
, ia hanya mengambil karakter berikutnya dari array buffer internal dan mengembalikannya tanpa mengakses sumber data. Hanya ketika semua karakter dalam buffer habis barulah dibaca dalam array besar karakter lainnya.
Kelas BufferedReader
juga memiliki metode yang sangat berguna — String readLine()
, yang memungkinkan Anda membaca seluruh rangkaian data dari aliran sumber sekaligus. Anda dapat menggunakan metode ini untuk, katakanlah, membaca file dan menampilkan kontennya di layar baris demi baris. Contoh:
Kami secara khusus menulis beberapa kode ringkas untuk mengilustrasikan betapa nyamannya hal ini. Kode ini juga dapat ditulis dengan sedikit lebih detail.
|
Buat FileReader objek. Sumber datanya adalah file. Buat BufferedReader objek. Sumber datanya adalah FileReader . Selama masih ada data di reader Baca satu baris Tampilkan baris tersebut |
Jika Anda menggabungkan beberapa aliran, maka close()
metode ini hanya perlu dipanggil pada salah satunya. Aliran itu akan memanggil metode pada sumber datanya, dan seterusnya, hingga close()
dipanggil pada aliran data akhir.
3. Membaca dari konsol
Dan satu lagi fakta menarik: Scanner
kelas tidak lebih dari aliran masukan perantara yang membaca data dari System.in
, yang juga merupakan aliran data.
Berikut adalah dua cara untuk membaca baris dari konsol:
Kelas pemindai | kelas BufferedReader dan BufferedWriter |
---|---|
|
|
Teman kita tidak lebih dari variabel statis kelas . Ini adalah siapa namanya .System.in
in
System
InputStream
in
Jadi hampir sejak awal studi Java Anda tentang CodeGym, Anda telah bekerja dengan aliran data dan membangun rantai darinya. Tetapi sekarang Anda akan melakukannya dengan lebih sadar.
GO TO FULL VERSION