1. InputStreamReaderkelas

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:

kelas InputStreamReader

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 Readeryang membaca data dari file. Dan InputStreamReaderdari mana mendapatkan datanya? Itu benar - dari file InputStream.

Saat Anda membuat InputStreamReaderobjek, Anda harus meneruskan InputStreamobjek atau salah satu kelas turunannya. Contoh:

String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);

Kelas InputStreamReadermemiliki semua metode yang Readerdimiliki kelas, dan mereka bekerja dengan cara yang persis sama.

Perbedaan utama antara InputStreamReaderkelas dan, katakanlah, FileReaderdari mana mereka membaca data. FileReadermembaca data dari file (ya — itulah mengapa disebut FileReader), tetapi InputStreamReadermembaca data dari file InputStream.

Saat Anda membaca karakter dari FileReaderobjek menggunakan read()metode ini, karakter tersebut akan membaca dua byte dari file di disk dan mengembalikannya sebagai chars.

Ketika Anda membaca karakter dari sebuah InputStreamReaderobjek menggunakan read()metode ini, pada gilirannya membaca dua byte dari FileInputStreamobjek yang diteruskan ke sana, yang pada gilirannya membaca data dari file. Hasilnya adalah serangkaian panggilan ke read()metode.


2. BufferedReaderkelas

Kelas menarik lainnya yang mungkin sering Anda gunakan adalah BufferedReader. Ini juga merupakan "aliran perantara" yang membaca data dari aliran lain.

Seperti namanya, BufferedReaderkelas adalah subkelas dari Readerdan 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 Readerkelas.

Apa gunanya? Tidak seperti InputStreamReader, BufferedReaderkelas tidak mengonversi byte menjadi karakter: kelas tidak mengonversi apa pun. Sebaliknya, itu buffer data .

Ketika sebuah program membaca satu karakter dari sebuah BufferedReaderobjek, 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 BufferedReaderjuga 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.

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}
Buat FileReaderobjek. Sumber datanya adalah file.
Buat BufferedReaderobjek. Sumber datanya adalah FileReader.
Selama masih ada data di reader
Baca satu baris
Tampilkan baris tersebut
Poin penting:

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: Scannerkelas 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
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

Teman kita tidak lebih dari variabel statis kelas . Ini adalah siapa namanya .System.ininSystemInputStreamin

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.