Halo! Dalam kuliah dan tugas, kami mempelajari cara mengeluarkan data ke konsol, dan sebaliknya - membaca data dari keyboard. Anda bahkan belajar menggunakan konstruksi rumit untuk ini:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Tapi kami masih belum menjawab satu pertanyaan pun.
Bagaimana cara kerjanya?
Faktanya, program apa pun seringkali tidak ada dengan sendirinya. Itu dapat berkomunikasi dengan program lain, sistem, Internet, dll. Yang kami maksud dengan kata “berkomunikasi” pertama-tama adalah “pertukaran data”. Artinya, menerima beberapa data dari luar, dan sebaliknya, mengirimkan data Anda sendiri ke suatu tempat. Banyak sekali contoh pertukaran data antar program, bahkan dalam kehidupan sehari-hari. Jadi, di banyak situs, alih-alih mendaftar, Anda bisa masuk menggunakan akun Facebook atau Twitter Anda. Dalam situasi ini, dua program, katakanlah, Twitter dan situs tempat Anda mencoba mendaftar, bertukar data yang diperlukan satu sama lain, setelah itu Anda melihat hasil akhirnya - otorisasi berhasil. Istilah “ aliran ” sering digunakan untuk menggambarkan proses pertukaran data dalam pemrograman . Dari mana asal nama ini? “Aliran” lebih diasosiasikan dengan sungai atau aliran sungai dibandingkan dengan pemrograman. Sebenarnya, ini bukan tanpa alasan :) Aliran pada dasarnya adalah bagian data yang bergerak. Artinya, dalam pemrograman, bukan air yang “mengalir” di sepanjang aliran, melainkan data berupa byte dan karakter. Dari aliran data, kita dapat menerima data sebagian dan melakukan sesuatu dengannya. Sekali lagi, mari kita gunakan analogi “air mengalir”: Anda bisa mengambil air dari sungai untuk memasak sup, mematikan api, atau menyiram bunga. Dengan menggunakan stream, Anda dapat bekerja dengan sumber data apa pun: Internet, sistem file komputer Anda, atau yang lainnya - tidak masalah. Streaming adalah alat universal. Mereka mengizinkan program untuk menerima data dari mana saja (aliran masuk) dan mengirimkannya ke mana saja (aliran keluar). Tugas mereka adalah satu - mengambil data di satu tempat dan mengirimkannya ke tempat lain. Aliran dibagi menjadi dua jenis:- Aliran masuk ( Input ) - digunakan untuk menerima data
- Aliran keluar ( Keluaran ) - untuk mengirim data.
InputStream
, dan aliran data keluar diimplementasikan di kelas OutputStream
. Tapi ada cara lain untuk membagi utas. Mereka dibagi tidak hanya menjadi masuk dan keluar, tetapi juga menjadi byte dan karakter . Di sini maknanya jelas tanpa penjelasan: aliran byte mengirimkan informasi dalam bentuk sekumpulan byte, dan aliran karakter mengirimkan informasi dalam bentuk kumpulan karakter. Dalam kuliah ini kita akan membahas secara detail tentang aliran masuk. Dan saya akan melampirkan informasi tentang tautan keluar di bagian akhir, dan Anda dapat membacanya sendiri :) Jadi, kode kami:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Anda mungkin berpikir bahkan saat membaca ceramah bahwa hal itu terlihat cukup menakutkan? :) Tapi ini hanya sampai kita mengetahui cara kerjanya. Ayo perbaiki sekarang! Mari kita mulai dari akhir. System.in
adalah objek kelas InputStream
yang kita bicarakan di awal. Ini adalah aliran masuk, dan terikat ke perangkat input sistem - keyboard. Ngomong-ngomong, kamu secara tidak langsung sudah mengenalnya. Lagi pula, Anda sering menggunakan "rekan" nya dalam pekerjaan Anda - System.out
! System.out
- ini adalah aliran keluaran data sistem , digunakan untuk keluaran ke konsol dengan cara System.out.println()
yang selalu Anda gunakan :) System.out
- aliran untuk mengirim data ke konsol, dan System.in
- untuk menerima data dari keyboard. Sederhana saja :) Selain itu: untuk membaca data dari keyboard, kita dapat melakukannya tanpa konstruksi besar ini dan cukup menulis: System.in.read()
;
public class Main {
public static void main(String[] args) throws IOException {
while (true) {
int x = System.in.read();
System.out.println(x);
}
}
}
Di kelas InputStream
(dan System.in
, izinkan saya mengingatkan Anda, merupakan objek kelas InputStream
) ada metode read()
yang memungkinkan Anda membaca data. Satu masalah: terbaca bytes , bukan character . Mari kita coba membaca huruf Rusia “Ya” dari keyboard. Keluaran konsol:
Я
208
175
10
Huruf Rusia memakan 2 byte di memori komputer (tidak seperti huruf Inggris, yang hanya memakan 1 byte). Dalam hal ini, 3 byte dibaca dari aliran: dua byte pertama mewakili huruf "I", dan yang lainnya adalah pemisah baris (Enter). Oleh karena itu, pilihan untuk menggunakan "telanjang" System.in
tidak cocok untuk kita. Manusia (dengan pengecualian yang jarang!) tidak dapat membaca byte. Di sinilah kelas berikutnya datang membantu kita - InputStreamReader
! Mari kita cari tahu jenis hewan apa ini.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Kami meneruskan aliran System.in
ke InputStreamReader
. Secara umum, jika Anda menerjemahkan namanya ke dalam bahasa Rusia, semuanya tampak jelas - “pembaca aliran masuk”. Sebenarnya, itulah gunanya! Kami membuat objek kelas InputStreamReader
dan meneruskannya aliran masuk yang darinya ia harus membaca data. Pada kasus ini...
new InputStreamReader(System.in)
...kami memberitahukannya: "Anda akan membaca data dari aliran input sistem (keyboard)." Tapi ini bukan satu-satunya fungsinya! InputStreamReader
tidak hanya menerima data dari aliran. Itu juga mengubah aliran byte menjadi aliran karakter . Dengan kata lain, Anda tidak perlu lagi khawatir untuk menerjemahkan data yang dibaca dari bahasa "komputer" ke bahasa "manusia" - InputStreamReader
ini akan melakukan segalanya untuk Anda. InputStreamReader
, tentunya bisa membaca data tidak hanya dari konsol saja, tapi juga dari tempat lain. Misalnya dari file:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
}
}
Di sini kami membuat aliran data masuk FileInputStream
(ini adalah salah satu varietasnya InputStream
), meneruskan jalur ke file ke dalamnya, dan meneruskan aliran itu sendiri InputStreamReader
. Sekarang ia akan dapat membaca data dari file ini, tentu saja jika file di jalur ini ada. Untuk membaca data (tidak peduli dari mana, dari konsol, file, atau di mana pun), kelas InputStreamReader
juga menggunakan ekstensi read()
. Apa perbedaan antara System.in.read()
dan InputStreamReader.read()
? Mari kita coba menghitung huruf “I” yang sama menggunakan InputStreamReader
. Izinkan saya mengingatkan Anda, inilah yang saya pikirkan System.in.read()
:
Я
208
175
10
Bagaimana dia bisa melakukan pekerjaan yang sama InputStreamReader
?
public class Main {
public static void main(String[] args) throws IOException {
InputStreamReader reader = new InputStreamReader(System.in);
while (true) {
int x = reader.read();
System.out.println(x);
}
}
}
Keluaran konsol:
Я
1071
10
Perbedaannya langsung terlihat. Byte terakhir - untuk jeda baris - tetap tidak berubah (angka 10), tetapi huruf "I" yang dibaca diubah menjadi satu kode "1071". Ini membaca dengan simbol! Jika Anda tiba-tiba tidak percaya bahwa kode 1071 berarti huruf “I”, Anda dapat dengan mudah memverifikasinya :)
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
char x = 1071;
System.out.println(x);
}
}
Keluaran konsol:
Я
Namun jika InputStreamReader
itu sangat bagus, mengapa Anda membutuhkan lebih banyak BufferedReader
? InputStreamReader
dapatkah membaca data dan mengubah byte menjadi karakter - apa lagi yang kita perlukan? Mengapa Pembaca lain? :/ Jawabannya sangat sederhana - untuk produktivitas yang lebih tinggi dan kenyamanan yang lebih baik . Mari kita mulai dengan kinerja. Saat membaca data, BufferedReader menggunakan area khusus - buffer, di mana ia “menambahkan” karakter yang dibaca. Akibatnya, ketika kita membutuhkan karakter-karakter ini dalam program, karakter-karakter tersebut akan diambil dari buffer, dan tidak langsung dari sumber data (keyboard, file, dll), dan ini menghemat banyak sumber daya. Untuk memahami cara kerjanya, bayangkan, misalnya, pekerjaan seorang kurir di sebuah perusahaan besar. Kurir duduk di kantor dan menunggu paket dibawa kepadanya untuk dikirim. Setiap kali dia menerima parsel baru, dia bisa langsung berangkat. Namun mungkin ada banyak paket di siang hari, dan dia harus melakukan perjalanan antar kantor dan alamat setiap saat. Sebaliknya, kurir menempatkan sebuah kotak di kantor tempat setiap orang dapat menaruh parselnya. Sekarang kurir dapat dengan tenang mengambil kotak itu dan pergi ke alamatnya - ini akan menghemat banyak waktu, karena dia tidak harus kembali ke kantor setiap saat. Kotak dalam contoh ini justru merupakan buffer, dan kantor adalah sumber datanya. Jauh lebih mudah bagi kurir untuk mengambil surat dari kotak biasa saat mengantarkannya daripada pergi ke kantor setiap saat. Ini juga akan menghemat bensin. Hal yang sama terjadi pada sebuah program - mengambil data dari buffer jauh lebih hemat sumber daya dibandingkan mengakses sumber data setiap saat. Itu sebabnya BufferedReader
+ InputStreamReader
bekerja lebih cepat dari sekedar InputStreamReader
. Kami sudah memilah performanya, tapi bagaimana dengan kenyamanan? Keuntungan utamanya adalah BufferedReader
ia dapat membaca data tidak hanya satu karakter dalam satu waktu (walaupun read()
ia juga memiliki metode untuk tujuan ini), tetapi juga seluruh baris! Ini dilakukan dengan menggunakan readLine()
;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = reader.readLine();
System.out.println("We read this line from the keyboard:");
System.out.println(s);
}
}
Keluaran konsol:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
Ini sangat berguna ketika membaca data dalam jumlah besar. Satu atau dua baris teks masih bisa dibaca karakter demi karakter. Tapi menghitung “Perang dan Damai” satu huruf pada satu waktu akan menjadi masalah :) Sekarang pekerjaan thread menjadi lebih jelas bagi Anda. Untuk studi lebih lanjut, berikut sumber tambahan untuk Anda:
Di sini Anda dapat membaca lebih lanjut tentang arus masuk dan keluar. Ulasan video BufferedReader
dari salah satu siswa kami. Ya, siswa kami tidak hanya belajar sendiri, tetapi juga merekam video pendidikan untuk orang lain! Jangan lupa suka dan berlangganan saluran kami :)
- BufferedReader/InputStreamReader - salah satu kuliah JavaRush yang didedikasikan untuk
BufferedReader
danInputStreamReader
- Pembaca Aliran Masukan Kelas
- Class BufferedReader - Dokumentasi Oracle tentang kelas
BufferedReader
danInputStreamReader
.
GO TO FULL VERSION