CodeGym /Java Blog /Acak /Membaca dari keyboard: "pembaca"
John Squirrels
Level 41
San Francisco

Membaca dari keyboard: "pembaca"

Dipublikasikan di grup Acak
Hai! Pelajaran dan tugas di Level 3 mengajari Anda cara menampilkan item di konsol, dan, bergerak ke arah lain, cara membaca data dari keyboard.
Membaca dari keyboard: "pembaca" - 1
Anda bahkan belajar menggunakan konstruk kompleks berikut untuk melakukannya:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Tapi ada satu pertanyaan yang belum kami jawab.

Bagaimana cara kerjanya?

Pada kenyataannya, program jarang sepenuhnya independen. Mereka berkomunikasi dengan program lain, sistem, Internet, dll. Yang kami maksud dengan "berkomunikasi", yang kami maksud adalah "bertukar data". Artinya, mereka menerima beberapa data eksternal dan juga mengirimkan data program internal ke suatu tempat. Contoh program pertukaran data berlimpah dalam kehidupan sehari-hari. Misalnya, banyak situs web yang mengizinkan Anda masuk menggunakan akun Facebook atau Twitter alih-alih mendaftar. Dalam situasi ini, dua program (mis. Twitter dan situs web tempat Anda masuk) bertukar data yang diperlukan. Hasil akhirnya adalah Anda berhasil masuk. Kata "stream"digunakan untuk menggambarkan proses pertukaran data. Dari mana nama ini berasal? Dalam pengalaman Anda, "aliran" mungkin lebih terkait dengan sungai daripada dengan pemrograman. Itu bukan kebetulan :) Aliran pada dasarnya adalah bagian data yang bergerak. Dengan kata lain, dalam pemrograman, bukan air yang mengalir — melainkan data dalam bentuk byte dan karakter. Kami dapat menerima bit data dari aliran data dan kemudian menggunakannya. Sekali lagi, kita akan menggunakan analogi air/aliran: Anda dapat mengambil air dari sungai untuk membuat sup, memadamkan api, atau menyirami bunga Anda. Stream memungkinkan Anda bekerja dengan sumber data apa pun: apakah Internet, sistem file komputer Anda, atau yang lainnya — tidak ada bedanya. Aliran adalah alat universal. Mereka mengizinkan program untuk menerima data dari mana saja (aliran input) dan mengirimkannya ke mana saja (aliran output). Tugas mereka sama: mengambil data dari satu tempat dan mengirimkannya ke tempat lain. Ada dua jenis aliran:
  1. Input stream digunakan untuk menerima data
  2. Aliran keluaran adalah untuk mengirim data.
Di Jawa, aliran ini diimplementasikan oleh kelas InputStreamdan OutputStream. Tetapi aliran dapat dikategorikan dengan cara lain. Selain aliran input dan output, kami juga berbicara tentang aliran byte dan aliran karakter . Artinya di sini harus cukup jelas: aliran byte mengirimkan informasi sebagai satu set byte, sedangkan aliran karakter mengirimkannya sebagai satu set karakter. Dalam pelajaran ini, kita akan membahas input stream. Saya akan memasang tautan dengan informasi tentang aliran keluaran di akhir pelajaran. Anda bisa membacanya sendiri :) Sekarang lihat kode ini:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Saat menjalani pelajaran, tidakkah menurut Anda kalimat ini cukup mengintimidasi? :) Itu tidak akan terjadi setelah kami menjelajahi cara kerjanya. Mari kita beres. Kita akan mulai dari akhir. System.inadalah InputStreamobjek, turunan dari kelas yang kita bicarakan sebelumnya. Ini adalah aliran input yang terhubung ke perangkat input sistem (keyboard). Omong-omong, Anda secara tidak langsung akrab dengan aliran ini. Lagi pula, Anda sering menggunakan "rekan kerja" - System.out! adalah aliran keluaranSystem.out sistem . Ini digunakan untuk mengeluarkan data ke konsol melalui metode favorit Anda , yang Anda gunakan terus-menerus :) adalah aliran untuk mengirim data ke konsol, sedangkanSystem.out.println()System.outSystem.inadalah untuk mendapatkan data dari keyboard. Semuanya sederhana :) Terlebih lagi, kita dapat membaca data dari keyboard tanpa konstruksi besar ini. Kita 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);
       }
   }
}
Kelas InputStream(ingat, System.inadalah InputStreamobjek) memiliki read()metode yang memungkinkan Anda membaca data. Ada satu masalah: terbaca bytes , bukan characters . Membosankan menggunakan huruf bahasa Inggris saja jadi mari kita coba membaca karakter Cina "魚" dari keyboard (salin saja huruf ini dari sini dan tempel ke konsol menggunakan ctrl + v di PC atau Command + v di Mac). Ngomong-ngomong, karakter ini berarti 'ikan'. Output konsol: 233 173 154 10 Simbol ini dan banyak bahasa Mandarin lainnya menempati 3 byte di memori komputer (tidak seperti huruf Latin, yang hanya menempati 1 byte). Dalam hal ini, 4 byte dibaca dari aliran: tiga byte pertama mewakili karakter "魚", dan byte lainnya mewakili baris baru (Enter). Karenanya, System.indalam bentuknya yang polos bukanlah pilihan bagi kami. Manusia (dengan pengecualian langka!) tidak tahu cara membaca byte. Tapi InputStreamReaderkelas datang untuk menyelamatkan! Mari kita lihat binatang apa ini.

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Kami lolos System.inke objek InputStreamReader . Nama kelas mengatakan itu! Kami membuat InputStreamReaderobjek dan meneruskan aliran input yang akan dibaca datanya. Pada kasus ini...

new InputStreamReader(System.in)
... kami beri tahu, "Anda akan membaca data dari aliran input sistem (dari keyboard)". Tapi ini bukan satu-satunya fungsinya! Tidak InputStreamReaderhanya menerima data dari aliran. Itu juga mengubah aliran byte menjadi aliran karakter . Dengan kata lain, Anda tidak perlu lagi mengonversi data dari "satu dan nol" menjadi "bahasa yang dapat dibaca manusia". InputStreamreadermelakukan segalanya untuk Anda. Tentu saja, InputStreamReadertidak terbatas pada membaca data dari konsol. Ia juga dapat membaca data 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 kita membuat FileInputStream(satu jenis InputStream), meneruskan jalur file, dan meneruskan aliran itu sendiri ke InputStreamReader. Sekarang akan dapat membaca data dari file (jika file benar-benar ada di jalan, tentu saja). Kami juga menggunakan metode InputStreamReaderkelas read()untuk membaca data (sumber data tidak penting: konsol, file, atau tempat lain). Apa perbedaan antara System.in.read()dan InputStreamReader.read()?\ Mari kita coba lagi membaca karakter "魚" dengan InputStreamReader. Saya mengingatkan Anda tentang apa yang sebenarnya dibaca oleh System.in.read(): 233 173 154 10 Dan bagaimana cara InputStreamReaderkerjanya?

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: 39770 10 Perbedaannya langsung terlihat. Byte terakhir (mewakili baris baru) tetap tidak berubah (angka 10), tetapi karakter "魚" diubah menjadi satu kode "39770". Inilah artinya membaca karakter! Jika Anda tidak percaya bahwa 39770 mewakili huruf "魚", mudah untuk meyakinkan diri sendiri :)
import java.io.IOException;

public class Main {

   public static void main(String[] args) throws IOException {

       char x = 39770;
       System.out.println(x);
   }
}
Keluaran konsol: Tetapi jika InputStreamReadersangat bagus, mengapa kita juga membutuhkannya BufferedReader? InputStreamReadertahu cara membaca data dan mengubah byte menjadi karakter. Apa lagi yang bisa kita minta? Mengapa Pembaca lain? :/ Jawabannya sangat sederhana: untuk performa dan kenyamanan yang lebih baik . Mari kita mulai dengan kinerja. Saat BufferedReadermembaca data, ia menggunakan area khusus yang disebut buffer, tempat ia "menyimpan" karakter yang dibacanya. Pada akhirnya, ketika karakter ini diperlukan dalam program, mereka akan diambil dari buffer, bukan langsung dari sumber data (keyboard, file, dll.). Ini menghemat banyak sumber daya. Untuk memahami cara kerjanya, bayangkan seorang kurir di sebuah perusahaan besar. Kurir duduk di kantor, menunggu seseorang membawa paket untuk dikirim. Setiap kali dia menerima paket baru, dia bisa langsung berangkat. Tapi mungkin ada banyak paket di siang hari. Dia harus melakukan banyak perjalanan antara kantor dan alamat pengiriman. Sebaliknya, kurir meletakkan sebuah kotak di kantornya. Semua orang memasukkan paket mereka ke dalam kotak. Sekarang kurir dapat dengan tenang mengambil kotak itu dan berpindah dari satu alamat ke alamat lainnya. Ini sangat menghemat waktu, karena dia tidak harus kembali ke kantor setiap saat. Dalam contoh ini, kotak hanyalah penyangga, dan kantor adalah sumber data. Jauh lebih mudah bagi kurir untuk mengambil paket dari satu kotak saat melakukan pengiriman daripada harus kembali ke kantor setiap saat. Dia juga akan menghemat bensin. Demikian pula, dalam sebuah program, jauh lebih sedikit sumber daya untuk mengambil data dari buffer daripada merujuk ke sumber data setiap saat. Sebagai akibat,BufferedReader+ InputStreamReaderlebih cepat dari InputStreamReadersendirian . Kami telah mempertimbangkan kinerja. Bagaimana dengan kenyamanan? Keuntungan utamanya adalah Bufferedreaderdapat membaca data tidak hanya satu karakter pada satu waktu (meskipun dapat melakukan ini dengan metodenya read()), tetapi juga seluruh baris sekaligus! Ini dilakukan dengan menggunakan readLine()metode;

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: CodeGym adalah situs web terbaik untuk mempelajari Java! Kami membaca baris ini dari keyboard: CodeGym adalah situs web terbaik untuk mempelajari Java! Ini sangat berguna saat membaca data dalam jumlah besar. Membaca satu atau dua baris teks karakter demi karakter masih layak dilakukan. Tapi membaca di "War and Peace" satu huruf pada satu waktu akan agak bermasalah :)

Lebih banyak bacaan:

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION