CodeGym/Java Blog/Acak/Berlatih bekerja dengan kelas BufferedReader dan InputStr...
John Squirrels
Level 41
San Francisco

Berlatih bekerja dengan kelas BufferedReader dan InputStreamReader

Dipublikasikan di grup Acak
anggota
Hai! Pelajaran hari ini akan dibagi menjadi dua bagian untuk kenyamanan. Kami akan mengulangi beberapa topik lama yang telah kami singgung sebelumnya, dan kami akan mempertimbangkan beberapa fitur baru :) Mari kita mulai dari yang pertama. Anda sudah kelas seperti BufferedReaderberkali-kali. Saya harap Anda tidak sempat melupakan pernyataan ini:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Sebelum membaca lebih lanjut, cobalah untuk mengingat apa yang menjadi tanggung jawab setiap komponen — System.in, InputStreamReader, BufferedReader— dan mengapa itu diperlukan. Apakah kamu ingat? Jika tidak, jangan khawatir. :) Jika Anda lupa sesuatu, baca kembali pelajaran ini , yang dikhususkan untuk kelas pembaca. Kami akan mengingat secara singkat apa yang dapat dilakukan masing-masing dari mereka. System.in— ini adalah aliran untuk menerima data dari keyboard.  Pada prinsipnya, itu saja sudah cukup untuk mengimplementasikan logika yang diperlukan untuk membaca teks. Tapi, seperti yang Anda ingat, System.inhanya bisa membaca byte, bukan karakter:
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Jika kita menjalankan kode ini dan memasukkan huruf Cyrillic "Й", hasilnya adalah:
Й
208
153
10
Karakter Cyrillic menempati 2 byte dalam memori, dan ditampilkan di layar. Angka 10 adalah representasi desimal dari karakter umpan baris, yaitu dari menekan Enter. Membaca byte sangat menyenangkan, jadi menggunakannya System.insangat tidak nyaman. Untuk membaca huruf Cyrillic (dan lainnya) dengan benar, kami menggunakan 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 kali ini hasilnya berbeda:
Й
1049
10
InputStreamReadermengonversi dua byte (208 dan 153) menjadi angka tunggal 1049. Inilah artinya membaca karakter. 1049 sesuai dengan huruf Cyrillic "Й". Kita dapat dengan mudah meyakinkan diri sendiri bahwa ini benar:
public class Main {

   public static void main(String[] args) throws IOException {
       char x = 1049;
       System.out.println(x);
   }
}
Keluaran konsol:
Й
Dan seperti forBufferedReader(dan secara umum, BufferedAnythingYouWant), kelas buffer digunakan untuk mengoptimalkan kinerja. Mengakses sumber data (file, konsol, sumber daya web) cukup mahal dalam hal kinerja. Oleh karena itu, untuk mengurangi jumlah akses, BufferedReaderbaca dan kumpulkan data dalam buffer khusus, dan kami mendapatkannya dari sana. Akibatnya, berapa kali sumber data diakses dipangkas - mungkin beberapa kali lipat! Salah satu BufferedReaderfitur lain dan kelebihannya dibanding yang biasa InputStreamReader, adalah metode yang sangat membantu readLine(), yang membaca seluruh baris data, bukan nomor individual. Ini, tentu saja, sangat nyaman saat berhadapan dengan teks besar. Berikut tampilan baris 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 BufferedReader dan InputStreamReader - 2Tentu BufferedReadersangat fleksibel. Anda tidak terbatas untuk bekerja dengan keyboard. Misalnya, Anda dapat membaca data langsung dari web, cukup dengan mengirimkan URL yang diperlukan ke 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 dapat membaca data dari file dengan melewati jalur file:
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();
   }
}

Mengganti System.out

Sekarang mari kita lihat kemampuan menarik yang belum pernah kita bahas sebelumnya. Seperti yang pasti Anda ingat, Systemkelas memiliki dua bidang statis — System.indan  System.out. Saudara kembar ini adalah objek aliran. System.inadalah InputStream. Dan System.out adalah PrintStream. Saat ini, kita akan membicarakannya  System.out. Jika kita memasukkan Systemkode sumber kelas, kita melihat ini:
public final class System {
……………...
public final static PrintStream out = null;
 …………
}
Jadi,  System.out  hanyalah variabel statis biasa dariSystem kelas. Tidak ada yang ajaib tentang itu :) Variabelnya outadalah PrintStreamreferensi. Inilah pertanyaan yang menarik: Kapan System.out.println()dieksekusi, mengapa tepatnya output pergi ke konsol dan bukan ke tempat lain? Dan bisakah ini diubah entah bagaimana? Misalnya, kita ingin membaca data dari konsol dan menuliskannya ke file teks. Apakah mungkin untuk mengimplementasikan ini hanya dengan menggunakan  System.outkelas pembaca dan penulis tambahan? Memang benar :) Dan kita bisa melakukannya meskipun variabelnya System.outditandai dengan finalpengubah!  Berlatih bekerja dengan kelas BufferedReader dan InputStreamReader - 3Jadi apa yang kita butuhkan untuk mewujudkannya? Pertama-tama, kita membutuhkan PrintStreamobjek baru untuk menggantikan yang sekarang. Objek saat ini, diatur dalamSystemkelas secara default, tidak melayani tujuan kita: itu menunjuk ke konsol. Anda perlu membuat yang baru yang mengarah ke file teks — "tujuan" untuk data kami. Kedua, kita perlu memahami cara menetapkan nilai baru ke System.outvariabel. Anda tidak dapat menggunakan operator penugasan sederhana, karena variabelnya ditandai final. Mari bekerja mundur dari akhir. Seperti yang terjadi, Systemkelas memiliki metode yang kita perlukan: setOut(). Dibutuhkan PrintStreamobjek dan menetapkannya sebagai tujuan untuk keluaran. Itulah yang kami butuhkan! Yang tersisa hanyalah membuat PrintStreamobjek. Ini juga mudah:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Kode lengkapnya akan terlihat 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!");
   }
}
Hasilnya, string pertama ditulis ke file teks, dan string kedua ditampilkan di konsol :) Anda dapat menyalin kode ini ke IDE Anda dan menjalankannya. Buka file teks dan Anda akan melihat bahwa string telah berhasil ditulis di sana :) Dengan ini, pelajaran kita telah berakhir. Hari ini kami mengingat kembali cara bekerja dengan aliran dan pembaca. Kami mengingat kembali bagaimana mereka berbeda satu sama lain dan belajar tentang beberapa kemampuan baru System.out, yang telah kami gunakan di hampir setiap pelajaran :) Sampai pelajaran berikutnya!

Lebih banyak membaca:

Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar