"Halo, Amigo! Hari ini kita akan berkenalan dengan input/output stream . Kami memilih topik ini beberapa hari yang lalu, tetapi hari ini kita akan menjelajahinya secara menyeluruh. Input/output stream dibagi menjadi 4 kategori:"

1) Aliran dibagi menurut arahnya: aliran masukan dan aliran keluaran

2) Aliran dibagi menurut tipe datanya: yang bekerja dengan byte dan yang bekerja dengan karakter .

Di sini divisi-divisi ini direpresentasikan dalam sebuah tabel:

Aliran masukan Aliran keluaran
Bekerja dengan byte InputStream OutputStream
Bekerja dengan karakter Pembaca Penulis

Jika sebuah objek mengimplementasikan antarmuka InputStream , maka itu mendukung kemampuan untuk membaca byte secara berurutan darinya.

Jika sebuah objek mengimplementasikan antarmuka OutputStream , maka objek tersebut mendukung kemampuan untuk menulis byte secara berurutan.

Jika suatu objek mengimplementasikan antarmuka Pembaca , maka itu mendukung kemampuan untuk membaca karakter (karakter) secara berurutan darinya.

Jika sebuah objek mengimplementasikan antarmuka Writer , maka objek tersebut mendukung kemampuan untuk menulis karakter (karakter) secara berurutan.

Arus Input/Output - 1

Aliran keluaran seperti printer. Kami dapat mengeluarkan dokumen ke printer. Kami dapat menampilkan data ke aliran keluaran.

Untuk bagiannya, aliran input dapat dibandingkan dengan pemindai, atau mungkin stopkontak listrik. Dengan scanner, kita bisa membawa dokumen ke komputer kita. Atau kita dapat menyambungkannya ke stopkontak listrik dan menerima listrik darinya. Kami dapat menerima data dari input stream.

"Di mana mereka digunakan?"

"Kelas-kelas ini digunakan di mana-mana di Java. Teman akrab kita System.in adalah variabel InputStream statis yang dinamai dalam kelas Sistem ."

"Serius?! Jadi selama ini saya menggunakan InputStream dan bahkan tidak menyadarinya. Apakah System.out juga merupakan aliran?"

"Ya, System.out adalah variabel PrintStream statis (turunan dari OutputStream ) di kelas System."

"Maksudmu, aku selalu menggunakan aliran dan bahkan tidak mengetahuinya?"

"Ya, dan itu memberi tahu kita betapa nyaman aliran ini. Anda cukup mengambil satu dan menggunakannya."

"Tapi Anda tidak bisa mengatakan itu tentang System.in. Kami terus-menerus harus menambahkan BufferedReader atau InputStreamReader ke dalamnya."

"Itu benar. Tapi ada juga alasan untuk itu."

Ada banyak tipe data, dan banyak cara untuk bekerja dengannya. Jadi jumlah kelas I/O standar bertambah dengan sangat cepat, meskipun mereka melakukan semuanya dengan cara yang hampir sama. Untuk menghindari kerumitan ini, pengembang Java menggunakan prinsip abstraksi dan membagi kelas menjadi banyak bagian kecil.

Tetapi Anda dapat menghubungkan bagian-bagian ini dengan cara yang koheren dan mendapatkan fungsionalitas yang sangat kompleks, jika Anda membutuhkannya. Lihatlah contoh ini:

Keluarkan string ke konsol
System.out.println("Hello");
Simpan aliran keluaran konsol dalam variabel terpisah.
Keluarkan string ke aliran.
PrintStream console = System.out;
console.println("Hello");
Buat array byte dinamis (memperluas) di memori.
Sambungkan ke aliran keluaran baru (objek PrintStream).
Keluarkan string ke aliran.
ByteArrayOutputStream stream = new ByteArrayOutputStream();
PrintStream console = new PrintStream(stream);
console.println("Hello");

"Sejujurnya, ini seperti set Lego. Hanya saja tidak jelas bagi saya apa yang dilakukan kode ini."

"Jangan khawatir tentang itu untuk saat ini. Semuanya pada waktunya sendiri."

Inilah yang saya ingin Anda ingat: Jika sebuah kelas mengimplementasikan antarmuka OutputStream, Anda dapat menulis byte ke dalamnya. Hampir persis seperti Anda mengeluarkan data ke konsol. Apa yang dilakukannya dengan itu adalah urusannya. Dengan "Lego kit" kami, kami tidak peduli dengan tujuan masing-masing bagian. Kami peduli dengan fakta bahwa banyaknya pilihan suku cadang memungkinkan kami membangun hal-hal keren seperti itu.

"Oke. Lalu dari mana kita mulai?"