JavaRush /Blog Java /Random-MS /Membaca dari papan kekunci - "pembaca"

Membaca dari papan kekunci - "pembaca"

Diterbitkan dalam kumpulan
hello! Dalam kuliah dan tugasan, kami belajar cara mengeluarkan data ke konsol, dan sebaliknya - membaca data dari papan kekunci. Membaca dari papan kekunci - "pembaca" - 1Anda juga belajar menggunakan pembinaan yang kompleks untuk ini:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Tetapi kami masih belum menjawab satu soalan.

Bagaimana ini berfungsi?

Malah, mana-mana program paling kerap tidak wujud dengan sendirinya. Ia boleh berkomunikasi dengan program lain, sistem, Internet, dll. Dengan perkataan "berkomunikasi" kami pertama sekali bermaksud "pertukaran data". Iaitu, terima beberapa data dari luar, dan, sebaliknya, hantar data anda sendiri ke suatu tempat. Terdapat banyak contoh pertukaran data antara program, walaupun dalam kehidupan seharian. Jadi, di banyak tapak, bukannya mendaftar, anda boleh log masuk menggunakan akaun Facebook atau Twitter anda. Dalam keadaan ini, dua program, katakan, Twitter dan tapak di mana anda cuba mendaftar, bertukar-tukar data yang diperlukan antara satu sama lain, selepas itu anda melihat hasil akhir - kebenaran yang berjaya. Istilah " aliran " sering digunakan untuk menerangkan proses pertukaran data dalam pengaturcaraan . Dari mana datangnya nama ini? "Aliran" lebih dikaitkan dengan sungai atau aliran berbanding dengan pengaturcaraan. Sebenarnya, ini bukan tanpa sebab :) Strim adalah, pada dasarnya, sekeping data yang bergerak. Iaitu, dalam pengaturcaraan, bukan air yang "mengalir" di sepanjang aliran, tetapi data dalam bentuk bait dan aksara. Daripada aliran data, kami boleh menerima data dalam bahagian dan melakukan sesuatu dengannya. Sekali lagi, mari kita gunakan analogi "mengalir air": anda boleh mencedok air dari sungai untuk memasak sup, memadamkan api, atau menyiram bunga. Menggunakan strim, anda boleh bekerja dengan mana-mana sumber data: Internet, sistem fail komputer anda atau sesuatu yang lain - tidak mengapa. Strim ialah alat universal. Mereka membenarkan program menerima data dari mana-mana sahaja (strim masuk) dan menghantarnya ke mana-mana (strim keluar). Tugas mereka adalah satu - untuk mengambil data di satu tempat dan menghantarnya ke tempat lain. Aliran dibahagikan kepada dua jenis:
  1. Aliran masuk ( Input ) - digunakan untuk menerima data
  2. Aliran keluar ( Output ) - untuk menghantar data.
Aliran data masuk dalam Java dilaksanakan dalam kelas InputStream, dan aliran data keluar dalam kelas OutputStream. Tetapi ada cara lain untuk membahagikan benang. Mereka dibahagikan bukan sahaja kepada masuk dan keluar, tetapi juga kepada bait dan watak . Di sini maknanya jelas tanpa penjelasan: aliran bait menghantar maklumat dalam bentuk satu set bait, dan aliran aksara menghantar maklumat dalam bentuk satu set aksara. Dalam kuliah ini kita akan menerangkan secara terperinci tentang aliran masuk. Dan saya akan melampirkan maklumat tentang pautan keluar pada penghujungnya, dan anda boleh membacanya sendiri :) Jadi, kod kami:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Anda mungkin berfikir semasa membaca kuliah bahawa ia kelihatan agak menakutkan? :) Tetapi ini hanya sehingga kita mengetahui bagaimana perkara ini berfungsi. Jom betulkan sekarang! Mari kita mulakan dari akhir. System.inialah objek kelas InputStreamyang kita bincangkan pada mulanya. Ini ialah aliran masuk, dan ia terikat pada peranti input sistem - papan kekunci. By the way, secara tak langsung korang kenal dia. Lagipun, anda sering menggunakan "rakan sekerja"nya dalam kerja anda - System.out! System.out- ini ialah aliran keluaran data sistem , ia digunakan untuk output ke konsol dalam kaedah System.out.println()yang anda sentiasa gunakan :) System.out- aliran untuk menghantar data ke konsol, dan System.in- untuk menerima data daripada papan kekunci. Ia mudah :) Selain itu: untuk membaca data dari papan kekunci, kita boleh lakukan tanpa pembinaan besar ini dan hanya 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);
       }
   }
}
Dalam kelas InputStream(dan System.in, biar saya ingatkan anda, adalah objek kelas InputStream) terdapat kaedah read()yang membolehkan anda membaca data. Satu masalah: ia membaca bait , bukan aksara . Mari cuba baca huruf Rusia "Ya" dari papan kekunci. Output konsol:
Я
208
175
10
Huruf Rusia menggunakan 2 bait dalam ingatan komputer (tidak seperti huruf Inggeris, yang hanya menggunakan 1). Dalam kes ini, 3 bait telah dibaca daripada strim: dua yang pertama mewakili huruf "I" kami, dan yang satu lagi ialah pemisah baris (Enter). Oleh itu, pilihan untuk menggunakan "telanjang" System.intidak sesuai dengan kami. Manusia (dengan pengecualian yang jarang berlaku!) tidak boleh membaca bait. Di sinilah kelas seterusnya datang untuk membantu kami - InputStreamReader! Mari kita fikirkan jenis haiwan ini.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Kami melepasi aliran System.inke InputStreamReader. Secara umum, jika anda menterjemah namanya ke dalam bahasa Rusia, semuanya kelihatan jelas - "pembaca aliran masuk". Sebenarnya, itulah gunanya! Kami mencipta objek kelas InputStreamReaderdan menyampaikannya aliran masuk yang mana ia harus membaca data. Dalam kes ini...
new InputStreamReader(System.in)
...kami memberitahunya: "anda akan membaca data daripada aliran input sistem (papan kekunci)." Tetapi ini bukan satu-satunya fungsinya! InputStreamReaderbukan sahaja menerima data daripada aliran. Ia juga menukar strim bait kepada strim aksara . Dalam erti kata lain, anda tidak perlu lagi bimbang untuk menterjemah data yang dibaca daripada bahasa "komputer" ke dalam bahasa "manusia" - InputStreamReaderia akan melakukan segala-galanya untuk anda. InputStreamReader, sudah tentu, boleh membaca data bukan sahaja dari konsol, tetapi juga dari tempat lain. Sebagai contoh, dari fail:
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 mencipta aliran data masuk FileInputStream(ini adalah salah satu jenis InputStream), lulus laluan ke fail ke dalamnya, dan lulus strim itu sendiri InputStreamReader'y. Kini ia akan dapat membaca data daripada fail ini, jika fail di laluan ini wujud, sudah tentu. Untuk membaca data (tidak kira dari mana, dari konsol, fail atau di mana-mana sahaja), kelas InputStreamReaderjuga menggunakan read(). Apakah perbezaan antara System.in.read()dan InputStreamReader.read()? Mari cuba kira huruf “I” yang sama menggunakan InputStreamReader. Biar saya ingatkan anda, inilah yang saya fikirkan System.in.read():
Я
208
175
10
Bagaimana dia boleh melakukan kerja 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);
       }
   }
}
Output konsol:
Я
1071
10
Perbezaannya segera kelihatan. Bait terakhir - untuk pemisah baris - kekal tidak berubah (nombor 10), tetapi huruf baca "I" telah ditukar menjadi kod tunggal "1071". Ini membaca dengan simbol! Jika anda tiba-tiba tidak percaya bahawa kod 1071 bermaksud huruf "I", mudah untuk mengesahkan ini :)
import java.io.IOException;

public class Main {

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

       char x = 1071;
       System.out.println(x);
   }
}
Output konsol:

Я
Tetapi jika InputStreamReaderia sangat bagus, mengapa anda memerlukan lebih banyak lagi BufferedReader? InputStreamReaderboleh kedua-duanya membaca data dan menukar bait kepada aksara - apa lagi yang kita perlukan? Kenapa Pembaca lain? :/ Jawapannya sangat mudah - untuk produktiviti yang lebih besar dan kemudahan yang lebih besar . Mari kita mulakan dengan prestasi. Apabila membaca data, BufferedReader menggunakan kawasan khas - penimbal, di mana ia "menambah" aksara yang dibaca. Akibatnya, apabila kita memerlukan aksara ini dalam program, ia akan diambil dari penimbal, dan bukan terus dari sumber data (papan kekunci, fail, dll.), dan ini menjimatkan banyak sumber. Untuk memahami cara ini berfungsi, bayangkan, sebagai contoh, kerja kurier di sebuah syarikat besar. Kurier duduk di pejabat dan menunggu bungkusan dibawa kepadanya untuk dihantar. Setiap kali dia menerima bungkusan baru, dia boleh segera pergi ke jalan raya. Tetapi mungkin terdapat banyak bungkusan pada siang hari, dan dia perlu melakukan perjalanan antara pejabat dan alamat setiap kali. Sebaliknya, kurier meletakkan kotak di pejabat di mana semua orang boleh meletakkan bungkusan mereka. Kini kurier boleh dengan tenang mengambil kotak dan pergi ke alamat - dia akan menjimatkan banyak masa, kerana dia tidak perlu kembali ke pejabat setiap kali. Kotak dalam contoh ini ialah penimbal, dan pejabat ialah sumber data. Adalah lebih mudah bagi kurier untuk mengambil surat dari kotak biasa semasa menghantarnya daripada pergi ke pejabat setiap kali. Ia juga akan menjimatkan petrol. Ia adalah sama dalam program - ia adalah lebih kurang intensif sumber untuk mengambil data daripada penimbal, berbanding mengakses sumber data setiap kali. Itulah sebabnya BufferedReader+ InputStreamReaderberfungsi lebih pantas daripada sekadar InputStreamReader. Kami telah menyelesaikan prestasi, tetapi bagaimana dengan kemudahan? Kelebihan utama ialah BufferedReaderia boleh membaca data bukan sahaja satu aksara pada satu masa (walaupun read()ia juga mempunyai kaedah untuk tujuan ini), tetapi juga keseluruhan baris! Ini dilakukan 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);
   }
}
Output konsol:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
Ini amat berguna apabila membaca sejumlah besar data. Satu atau dua baris teks masih boleh dibaca aksara demi aksara. Tetapi mengira "Perang dan Keamanan" satu huruf pada satu masa akan menjadi agak bermasalah :) Kini kerja benang telah menjadi lebih jelas kepada anda. Untuk kajian lanjut, berikut adalah sumber tambahan untuk anda: Di sini anda boleh membaca lebih lanjut mengenai aliran masuk dan keluar. Ulasan video BufferedReaderdaripada salah seorang pelajar kami. Ya, ya, pelajar kami bukan sahaja belajar sendiri, tetapi juga merakam video pendidikan untuk orang lain! Jangan lupa like dan subscribe channel kami :)
Adalah lebih baik untuk membiasakan diri membaca dokumentasi rasmi dari awal pengajian anda. Ia adalah sumber utama pengetahuan tentang bahasa, dan kebanyakan jawapan sentiasa boleh didapati di sana.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION