CodeGym /Blog Java /rawak /Berlatih bekerja dengan kelas BuffreredReader dan InputSt...
John Squirrels
Tahap
San Francisco

Berlatih bekerja dengan kelas BuffreredReader dan InputStreamReader

Diterbitkan dalam kumpulan
Hai! Pelajaran hari ini akan dibahagikan kepada dua bahagian untuk kemudahan. Kami akan mengulangi beberapa topik lama yang kami sentuh sebelum ini, dan kami akan mempertimbangkan beberapa ciri baharu :) Mari mulakan dengan yang pertama. Anda sudah mempunyai kelas seperti BufferedReaderbanyak kali. Saya harap anda tidak sempat melupakan kenyataan ini:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Sebelum membaca lebih lanjut, cuba ingat apa setiap komponen — System.in, InputStreamReader, BufferedReader— bertanggungjawab dan mengapa ia diperlukan. Awak ingat tak? Jika tidak, jangan risau. :) Jika anda terlupa sesuatu, baca semula pelajaran ini , yang dikhususkan untuk kelas pembaca. Kami akan mengingati secara ringkas apa yang setiap daripada mereka boleh lakukan. System.in— ini ialah aliran untuk menerima data daripada papan kekunci.  Pada dasarnya, ia sahaja sudah cukup untuk melaksanakan logik yang diperlukan untuk membaca teks. Tetapi, seperti yang anda ingat, System.inhanya boleh membaca bait, bukan aksara:

public class Main {

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

       while (true) { 
           int x = System.in.read(); 
           System.out.println(x); 
       } 
   } 
} 
Jika kita melaksanakan kod ini dan memasukkan huruf Cyrillic "Й", outputnya ialah:

Й
208
153
10 
Aksara Cyrillic menduduki 2 bait dalam ingatan, dan ia dipaparkan pada skrin. Nombor 10 ialah perwakilan perpuluhan bagi aksara suapan baris, iaitu daripada menekan Enter. Membaca bait sangat menyeronokkan, jadi penggunaannya System.intidak begitu mudah. Untuk membaca huruf Cyrillic (dan lain-lain) dengan betul, kami gunakan InputStreamReadersebagai pembungkus:

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); 
       } 
   } 
} 
Kami memasukkan huruf yang sama "Й", tetapi hasilnya berbeza kali ini:

Й 
1049 
10
InputStreamReadermenukar dua bait (208 dan 153) kepada nombor tunggal 1049. Inilah yang dimaksudkan dengan membaca aksara. 1049 sepadan dengan huruf Cyrillic "Й". Kita boleh dengan mudah meyakinkan diri kita bahawa ini adalah benar:

public class Main { 

   public static void main(String[] args) throws IOException { 
       char x = 1049; 
       System.out.println(x); 
   } 
} 
Output konsol:

Й
Dan sebagai forBufferedReader(dan secara umum, BufferedAnythingYouWant), kelas buffer digunakan untuk mengoptimumkan prestasi. Mengakses sumber data (fail, konsol, sumber web) agak mahal dari segi prestasi. Oleh itu, untuk mengurangkan bilangan akses, BufferedReadermembaca dan mengumpul data dalam penimbal khas, dan kami mendapatkannya dari sana. Akibatnya, bilangan kali sumber data diakses dikurangkan — mungkin dengan beberapa urutan magnitud! Satu lagi BufferedReaderciri dan kelebihannya berbanding yang biasa InputStreamReader, ialah readLine()kaedah yang sangat membantu, yang membaca keseluruhan baris data, bukan nombor individu. Ini, sudah tentu, sangat mudah apabila berurusan dengan teks besar. Inilah rupa garis bacaan:

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 ("The user entered the following text:"); 
       System.out.println(s); 
       reader.close(); 
   } 
}

BufferedReader+InputStreamReader is faster than InputStreamReader alone 
The user entered the following text: 
BufferedReader+InputStreamReader is faster than InputStreamReader alone
Berlatih bekerja dengan kelas BuffreredReader dan InputStreamReader - 2Sudah tentu, BufferedReadersangat fleksibel. Anda tidak terhad kepada bekerja dengan papan kekunci. Sebagai contoh, anda boleh membaca data terus dari web, hanya dengan menghantar URL yang diperlukan kepada pembaca:

public class URLReader { 

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

       URL oracle = new URL("https://www.oracle.com/index.html"); 
       BufferedReader in = new BufferedReader( 
               new InputStreamReader(oracle.openStream())); 

       String inputLine; 
       while ((inputLine = in.readLine()) != null) 
           System.out.println(inputLine); 
       in.close(); 
   } 
}
Anda boleh membaca data daripada fail dengan melepasi laluan fail:

public class Main { 

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

       FileInputStream fileInputStream = new FileInputStream("testFile.txt"); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); 

       String str; 

       while ((str = reader.readLine()) != null)   { 
           System.out.println (str); 
       } 

       reader.close(); 
   } 
}

Menggantikan Sistem.keluar

Sekarang mari kita lihat keupayaan menarik yang tidak pernah kita sentuh sebelum ini. Seperti yang anda pasti ingat, Systemkelas mempunyai dua medan statik — System.indan  System.out. Saudara kembar ini adalah objek aliran. System.inialah sebuah InputStream. Dan System.out merupakan PrintStream. Sekarang, kita akan bercakap tentang  System.out. Jika kita memasukkan Systemkod sumber kelas, kita melihat ini:

public final class System { 
……………... 
public final static PrintStream out = null; 
 ………… 
} 
Oleh itu,  System.out  hanyalah pembolehubah statik biasa kelasSystem . Tiada keajaiban mengenainya :) outPembolehubah adalah PrintStreamrujukan. Berikut ialah soalan yang menarik: Bilakah System.out.println()dilaksanakan, mengapa sebenarnya output pergi ke konsol dan bukan di tempat lain? Dan bolehkah ini diubah entah bagaimana? Sebagai contoh, katakan kita mahu membaca data daripada konsol dan menulisnya ke fail teks. Adakah mungkin untuk melaksanakan ini hanya dengan menggunakan  System.outkelas pembaca dan penulis tambahan? Memang betul :) Dan kita boleh melakukannya walaupun System.outpembolehubah ditandakan dengan finalpengubah suai!  Berlatih bekerja dengan kelas BuffreredReader dan InputStreamReader - 3Jadi apa yang kita perlukan untuk membuat ini berlaku? Pertama sekali, kita memerlukan PrintStreamobjek baharu untuk menggantikan objek semasa. Objek semasa, ditetapkan dalamSystemkelas secara lalai, tidak memenuhi tujuan kami: ia menunjuk ke konsol. Anda perlu mencipta fail baharu yang menunjuk ke fail teks — "destinasi" untuk data kami. Kedua, kita perlu memahami cara menetapkan nilai baharu kepada pembolehubah System.out. Anda tidak boleh menggunakan pengendali tugasan mudah, kerana pembolehubah ditandakan final. Mari kita bekerja ke belakang dari akhir. Seperti yang berlaku, Systemkelas mempunyai kaedah yang kita perlukan: setOut(). Ia mengambil PrintStreamobjek dan menetapkannya sebagai destinasi untuk output. Itu sahaja yang kita perlukan! Yang tinggal hanyalah mencipta PrintStreamobjek. Ini juga mudah:

PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Kod penuh akan kelihatan seperti ini:

public class SystemRedirectService { 

   public static void main(String arr[]) throws FileNotFoundException 
   { 
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
       /* Save the current value of System.out in a separate variable so that later 
       we can switch back to console output */ 

       PrintStream console = System.out; 
       // Assign a new value to System.out 
       System.setOut(filePrintStream); 
       System.out.println("This line will be written to the text file"); 

       // Restore the old value of System.out 
       System.setOut(console); 
       System.out.println("But this line will be output to the console!"); 
   } 
}
Akibatnya, rentetan pertama ditulis pada fail teks, dan yang kedua dipaparkan dalam konsol :) Anda boleh menyalin kod ini ke dalam IDE anda dan menjalankannya. Buka fail teks dan anda akan melihat bahawa rentetan telah berjaya ditulis di sana :) Dengan ini, pelajaran kita telah sampai ke penghujungnya. Hari ini kami teringat cara bekerja dengan strim dan pembaca. Kami mengimbas kembali bagaimana mereka berbeza antara satu sama lain dan belajar tentang beberapa keupayaan baharu System.out, yang telah kami gunakan dalam hampir setiap pelajaran :) Sehingga pelajaran seterusnya!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION