JavaRush /Java Blog /Random-ID /Berlatihlah bekerja dengan kelas BufferedReader dan Input...

Berlatihlah bekerja dengan kelas BufferedReader dan InputStreamReader

Dipublikasikan di grup Random-ID
Halo! Kuliah hari ini akan dibagi menjadi dua bagian. Kami akan mengulangi beberapa topik lama yang telah kami bahas sebelumnya, dan melihat beberapa fitur baru :) Berlatih bekerja dengan kelas BuffreredReader dan InputStreamReader - 1Mari kita mulai dengan yang pertama. Pengulangan adalah ibu dari pembelajaran :) Anda telah menggunakan kelas seperti BufferedReader. Saya harap Anda belum melupakan perintah ini:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Sebelum membaca lebih jauh, coba ingat-ingat apa saja System.in, InputStreamReader, BufferedReadertanggung jawab masing-masing komponen ( ) dan apa saja kegunaannya. Telah terjadi? Jika belum, jangan khawatir :) Jika sampai saat ini Anda lupa sesuatu, baca kembali ceramah yang didedikasikan untuk pembaca ini. Mari kita ingat secara singkat apa yang dapat dilakukan masing-masing dari mereka. System.inadalah thread untuk menerima data dari keyboard. Pada prinsipnya, untuk mengimplementasikan logika membaca teks, kita cukup satu saja. Tapi, seperti yang Anda ingat, System.initu hanya 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 "Y" di konsol, hasilnya akan seperti ini:

Й
208
153
10
Karakter Sirilik menempati 2 byte dalam memori, yang ditampilkan di layar (dan angka 10 adalah representasi byte dari jeda baris, yaitu menekan Enter). Membaca byte sangat menyenangkan, jadi menggunakannya System.indalam bentuk murni akan merepotkan. Untuk membaca huruf Sirilik (dan tidak hanya) yang dapat dimengerti semua orang, 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);
       }
   }
}
Jika kita memasukkan huruf “Y” yang sama ke konsol, kali ini hasilnya akan berbeda:

Й
1049
10
InputStreamReadermengonversi dua byte baca (208, 153) menjadi satu angka 1049. Ini adalah pembacaan berdasarkan karakter. 1049 sesuai dengan huruf “Y”, yang dapat dengan mudah diverifikasi:
public class Main {

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

       char x = 1049;
       System.out.println(x);
   }
}
Keluaran konsol:

Й
Nah, untuk BufferedReader'a (dan secara umum - BufferedAnything), kelas buffer digunakan untuk mengoptimalkan kinerja. Mengakses sumber data (file, konsol, sumber daya di Internet) adalah operasi yang agak mahal dalam hal kinerja. Oleh karena itu, untuk mengurangi jumlah panggilan tersebut, BufferedReaderia membaca dan mengumpulkan data dalam buffer khusus, yang nantinya dapat kita terima. Hasilnya, jumlah panggilan ke sumber data berkurang beberapa kali lipat atau bahkan puluhan kali lipat! Fitur tambahan lainnya dari BufferedReader'a dan keunggulannya dibandingkan reguler InputStreamReader' adalah metode yang sangat berguna readLine()yang membaca data sebagai string keseluruhan, bukan sebagai angka individual. Hal ini tentu saja sangat menambah kemudahan saat mengimplementasikan, misalnya teks berukuran besar. Seperti inilah tampilan membaca sebuah baris:
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("Пользователь ввел следующий текст:");
       System.out.println(s);
       reader.close();
   }
}

BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Пользователь ввел следующий текст:
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Berlatih bekerja dengan kelas BuffreredReader dan InputStreamReader - 2Tentu saja, BufferedReaderini adalah mekanisme yang sangat fleksibel dan memungkinkan Anda bekerja tidak hanya dengan keyboard. Anda dapat membaca data, misalnya, langsung dari Internet hanya dengan meneruskan 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 suatu file dengan meneruskan jalur ke file tersebut:
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();
   }
}

Pergantian System.out

Sekarang mari kita lihat satu kemungkinan menarik yang belum pernah kita bahas sebelumnya. Seperti yang mungkin Anda ingat, Systemada dua bidang statis di kelas - System.indan System.out. Saudara kembar ini adalah objek kelas thread. System.in- kelas abstrak InputStream. Kelas . System.out_ PrintStreamSekarang kita akan membahasnya secara spesifik System.out. Jika kita masuk ke kode sumber kelas System, kita akan melihat ini:
public final class System {

……………...

public final static PrintStream out = null;

  …………

}
Jadi, System.outhanya variabel kelas statis biasaSystem . Tidak ada keajaiban di dalamnya :) Variabel outmilik kelas PrintStream. Inilah pertanyaan menarik: mengapa, ketika mengeksekusi kode, System.out.println()outputnya muncul di konsol dan bukan di tempat lain? Dan apakah mungkin untuk mengubahnya? Misalnya, kita ingin membaca data dari konsol dan menulisnya ke file teks. Apakah mungkin untuk mengimplementasikan logika seperti itu tanpa menggunakan kelas pembaca dan penulis tambahan, tetapi hanya menggunakan System.out? Masih mungkin :) Dan meskipun variabel tersebut System.outditunjuk oleh modifier final, kita masih bisa melakukannya! Berlatih bekerja dengan kelas BuffreredReader dan InputStreamReader - 3Jadi apa yang kita butuhkan untuk ini? Pertama , kita memerlukan objek kelas baru, PrintStreambukan objek kelas saat ini. Objek saat ini yang terinstal di kelas Systemsecara default tidak cocok untuk kita: objek tersebut menunjuk ke konsol. Kita perlu membuat yang baru yang akan menunjuk ke file teks sebagai “tujuan” untuk data kita. Kedua , Anda perlu memahami cara memberikan nilai baru ke suatu variabel System.out. Anda tidak bisa melakukannya begitu saja, karena sudah ditandai final. Mari kita mulai dari akhir. Kelas Systemberisi metode yang kita butuhkan - setOut(). Dibutuhkan suatu objek sebagai masukan PrintStreamdan menetapkannya sebagai titik keluaran. Hanya apa yang kita butuhkan! Yang tersisa hanyalah membuat objek PrintStream. Ini juga mudah dilakukan:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Seluruh kode 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"));

       /*Сохраним текущее meaning System.out в отдельную переменную, чтобы потом
       можно было переключиться обратно на вывод в консоль*/
       PrintStream console = System.out;

       // Присваиваем System.out новое meaning
       System.setOut(filePrintStream);
       System.out.println("Эта строка будет записана в текстовый файл");

       // Возвращаем System.out старое meaning
       System.setOut(console);
       System.out.println("А эта строка - в консоль!");
   }
}
Hasilnya, baris pertama akan ditulis ke file teks, dan baris kedua akan ditampilkan di konsol :) Anda dapat menyalin kode ini ke IDE dan menjalankannya. Dengan membuka file teks, Anda akan melihat bahwa baris yang diperlukan telah berhasil ditulis di sana :) Ini mengakhiri kuliah. Hari ini kami mengingat cara bekerja dengan aliran dan pembaca, mengingat perbedaannya satu sama lain, dan mempelajari fitur-fitur baru System.outyang kami gunakan di hampir setiap pelajaran :) Sampai jumpa di kuliah berikutnya!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION