CodeGym /Blog Java /rawak /Membaca dari papan kekunci: "pembaca"
John Squirrels
Tahap
San Francisco

Membaca dari papan kekunci: "pembaca"

Diterbitkan dalam kumpulan
Hai! Pelajaran dan tugasan dalam Tahap 3 mengajar anda cara memaparkan bahan pada konsol dan, bergerak ke arah lain, cara membaca data daripada papan kekunci.
Membaca dari papan kekunci: "pembaca" - 1
Anda juga belajar menggunakan binaan kompleks berikut untuk mencapai ini:

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

Bagaimana di dunia ini berfungsi?

Pada hakikatnya, program jarang sepenuhnya bebas. Mereka berkomunikasi dengan program lain, sistem, Internet, dll. Dengan "berkomunikasi", kami bermaksud "pertukaran data". Iaitu, mereka menerima beberapa data luaran dan juga menghantar data program dalaman ke suatu tempat. Contoh program pertukaran data banyak terdapat dalam kehidupan seharian. Sebagai contoh, banyak tapak web membenarkan anda melog masuk menggunakan akaun Facebook atau Twitter anda dan bukannya mendaftar. Dalam situasi ini, dua program (cth. Twitter dan tapak web yang anda log masuk) bertukar-tukar data yang diperlukan. Keputusan akhir ialah anda berjaya log masuk. Perkataan "strim"digunakan untuk menerangkan proses pertukaran data. Dari mana datangnya nama ini? Mengikut pengalaman anda, "strim" mungkin lebih dikaitkan dengan sungai dan berbanding dengan pengaturcaraan. Itu bukan kebetulan :) Strim adalah, pada dasarnya, sekeping data yang bergerak. Dalam erti kata lain, dalam pengaturcaraan, bukan air yang mengalir — sebaliknya data dalam bentuk bait dan aksara. Kami boleh menerima bit data daripada aliran data dan kemudian menggunakannya. Sekali lagi, kami akan menggunakan analogi air/aliran: anda boleh mencedok air dari sungai untuk membuat sup, memadamkan api atau menyiram bunga anda. Strim membolehkan anda bekerja dengan mana-mana sumber data: sama ada Internet, sistem fail komputer anda atau sesuatu yang lain — tidak ada perbezaan. Strim ialah alat universal. Mereka membenarkan program menerima data dari mana-mana sahaja (strim input) dan menghantarnya ke mana-mana (strim output). Tugas mereka adalah sama: untuk mengambil data dari satu tempat dan menghantarnya ke tempat lain. Terdapat dua jenis aliran:
  1. Aliran input digunakan untuk menerima data
  2. Aliran keluaran adalah untuk menghantar data.
Di Jawa, aliran ini dilaksanakan oleh InputStreamdan OutputStreamkelas. Tetapi aliran boleh dikategorikan dengan cara lain. Selain strim input dan output, kami juga bercakap tentang strim bait dan strim aksara . Maksud di sini hendaklah cukup jelas: aliran bait menghantar maklumat sebagai satu set bait, manakala aliran aksara menghantarnya sebagai satu set aksara. Dalam pelajaran ini, kita akan membincangkan aliran input. Saya akan meletakkan pautan dengan maklumat tentang aliran keluaran pada akhir pelajaran. Anda boleh membacanya sendiri :) Sekarang lihat kod ini:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Semasa menjalani pelajaran, tidakkah anda fikir baris ini agak menakutkan? :) Itu tidak akan berlaku sebaik sahaja kami meneroka cara ia berfungsi. Mari kita perbetulkan keadaan. Kita akan mulakan pada penghujungnya. System.inialah InputStreamobjek, contoh kelas yang kita bincangkan lebih awal. Ia ialah aliran input yang dipautkan kepada peranti input sistem (papan kekunci). Secara tidak langsung, anda sudah biasa dengan aliran ini. Lagipun, anda kerap menggunakan "rakan sekerja"nya — System.out! ialah aliran keluaranSystem.out sistem . Ia digunakan untuk mengeluarkan data ke konsol melalui kaedah kegemaran anda , yang anda gunakan sentiasa :) ialah aliran untuk menghantar data ke konsol, manakalaSystem.out.println()System.outSystem.inadalah untuk mendapatkan data daripada papan kekunci. Semuanya mudah :) Lebih-lebih lagi, kita boleh membaca data dari papan kekunci tanpa binaan besar ini. Kita hanya boleh 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.inialah InputStreamobjek) mempunyai read()kaedah yang membolehkan anda membaca data. Terdapat satu masalah: ia membaca bait , bukan aksara . Adalah membosankan untuk menggunakan huruf Inggeris sahaja jadi mari cuba membaca aksara Cina "魚" dari papan kekunci (hanya salin surat ini dari sini dan tampalkannya ke konsol menggunakan ctrl + v pada PC atau Command + v pada Mac). Watak ini bermaksud 'ikan'. Output konsol: 233 173 154 10 Simbol ini dan banyak bahasa Cina lain menduduki 3 bait dalam ingatan komputer (tidak seperti huruf Latin, yang menduduki hanya 1 bait). Dalam kes ini, 4 bait dibaca daripada strim: tiga yang pertama mewakili aksara "魚", dan bait lain mewakili baris baharu (Enter). Sehubungan itu, System.indalam bentuk yang tidak berhias bukanlah pilihan untuk kami. Manusia (dengan pengecualian yang jarang berlaku!) tidak tahu cara membaca bait. Tetapi InputStreamReaderkelas datang untuk menyelamatkan! Mari kita lihat apakah jenis haiwan ini.

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Kami meneruskan System.inke objek InputStreamReader . Nama kelas menyebutnya! Kami mencipta InputStreamReaderobjek dan menghantarnya aliran input yang akan membaca data daripadanya. Dalam kes ini...

new InputStreamReader(System.in)
...kami memberitahunya, "anda akan membaca data daripada aliran input sistem (dari papan kekunci)". Tetapi ini bukan satu-satunya fungsinya! Ia InputStreamReaderbukan sahaja menerima data daripada strim. Ia juga menukar strim bait kepada strim aksara . Dengan kata lain, anda tidak perlu lagi menukar data daripada "satu dan sifar" kepada "bahasa yang boleh dibaca manusia". InputStreamreadermelakukan segala-galanya untuk anda. Sudah tentu, InputStreamReadertidak terhad kepada membaca data daripada konsol. Ia boleh membaca data dari tempat lain juga. Sebagai contoh, daripada 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 FileInputStream(satu perisa InputStream), lulus dalam laluan fail, dan lulus strim itu sendiri ke InputStreamReader. Kini ia akan dapat membaca data daripada fail (jika fail benar-benar wujud di laluan, sudah tentu). Kami juga menggunakan kaedah InputStreamReaderkelas read()untuk membaca data (sumber data tidak penting: konsol, fail atau tempat lain). Apakah perbezaan antara System.in.read()dan InputStreamReader.read()?\ Mari cuba sekali lagi membaca aksara "魚" dengan InputStreamReader. Saya mengingatkan anda tentang apa yang sebenarnya dibaca oleh System.in.read(): 233 173 154 10 Dan bagaimanakah ia InputStreamReadermelakukan kerja yang sama?

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: 39770 10 Perbezaannya kelihatan serta-merta. Bait terakhir (mewakili baris baharu) kekal tidak berubah (nombor 10), tetapi aksara "魚" telah ditukar kepada satu kod "39770". Inilah yang dimaksudkan dengan membaca aksara! Jika anda tidak percaya bahawa 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);
   }
}
Output konsol: Tetapi jika InputStreamReaderbegitu hebat, mengapa kita juga memerlukan BufferedReader? InputStreamReadertahu cara membaca data dan menukar bait kepada aksara. Apa lagi yang boleh kita minta? Kenapa Pembaca lain? :/ Jawapannya sangat mudah: untuk prestasi dan kemudahan yang lebih baik . Mari kita mulakan dengan prestasi. Apabila BufferedReadermembaca data, ia menggunakan kawasan khas yang dipanggil penimbal, di mana ia "menyimpan" aksara yang dibacanya. Akhirnya, apabila aksara ini diperlukan dalam program, ia akan diambil dari penimbal, bukan terus dari sumber data (papan kekunci, fail, dll.). Ini menjimatkan banyak sumber. Untuk memahami cara ini berfungsi, bayangkan kurier di sebuah syarikat besar. Kurier duduk di pejabat, menunggu seseorang untuk membawa bungkusan untuk penghantaran. Setiap kali dia menerima pakej baru, dia boleh segera pergi ke jalan raya. Tetapi mungkin terdapat banyak pakej pada siang hari. Dia perlu membuat banyak perjalanan antara pejabat dan alamat penghantaran. Sebaliknya, kurier itu meletakkan kotak di pejabatnya. Semua orang meletakkan bungkusan mereka ke dalam kotak. Kini kurier boleh mengambil kotak dengan tenang dan bergerak dari alamat ke alamat. Ini menjimatkan banyak masa, kerana dia tidak perlu kembali ke pejabat setiap kali. Dalam contoh ini, kotak hanyalah penimbal dan pejabat ialah sumber data. Adalah lebih mudah bagi kurier untuk mengambil bungkusan dari satu kotak semasa membuat penghantaran daripada kembali ke pejabat setiap kali. Dia akan menjimatkan petrol juga. Begitu juga, dalam program adalah kurang intensif sumber untuk mengambil data daripada penimbal daripada merujuk kepada sumber data setiap kali. Akibatnya,BufferedReader+ InputStreamReaderlebih pantas daripada InputStreamReaderbersendirian . Kami telah mempertimbangkan prestasi. Bagaimana pula dengan kemudahan? Kelebihan utama ialah Bufferedreaderboleh membaca data bukan sahaja satu aksara pada satu masa (walaupun ia boleh melakukan ini dengan kaedahnya read()), tetapi juga seluruh baris pada satu masa! Ini dilakukan menggunakan readLine()kaedah;

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: CodeGym ialah tapak web terbaik untuk mempelajari Java! Kami membaca baris ini dari papan kekunci: CodeGym ialah tapak web terbaik untuk mempelajari Java! Ini amat berguna apabila membaca sejumlah besar data. Membaca satu atau dua baris aksara teks mengikut aksara masih boleh dilaksanakan. Tetapi membaca dalam "Perang dan Keamanan" satu huruf pada satu masa akan menjadi agak bermasalah :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION