JavaRush /Blog Java /Random-MS /Berlatih bekerja dengan kelas BufferedReader dan InputStr...

Berlatih bekerja dengan kelas BufferedReader dan InputStreamReader

Diterbitkan dalam kumpulan
hello! Kuliah hari ini akan dibahagikan kepada dua bahagian. Kami akan mengulangi beberapa topik lama yang telah kami sentuh sebelum ini, dan melihat beberapa ciri baharu :) Berlatih bekerja dengan kelas BuffreredReader dan InputStreamReader - 1Mari mulakan dengan yang pertama. Pengulangan adalah ibu kepada pembelajaran :) Anda telah pun menggunakan kelas seperti BufferedReader. Saya harap anda masih belum melupakan arahan ini:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Sebelum membaca lebih lanjut, cuba ingat apa yang setiap komponen ( System.in, InputStreamReader, BufferedReader) bertanggungjawab dan apa yang mereka perlukan. Terjadi? Jika tidak, jangan risau :) Jika pada ketika ini anda telah terlupa sesuatu, baca semula kuliah ini yang didedikasikan untuk pembaca sekali lagi. Mari kita ingat secara ringkas apa yang setiap daripada mereka boleh lakukan. System.inialah benang untuk menerima data daripada papan kekunci. Pada dasarnya, untuk melaksanakan logik membaca teks, satu sudah cukup untuk kita. Tetapi, seperti yang anda ingat, System.inia hanya 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 menjalankan kod ini dan memasukkan huruf "Y" dalam konsol, output akan seperti ini:

Й
208
153
10
Aksara Cyrillic menduduki 2 bait dalam ingatan, yang dipaparkan pada skrin (dan nombor 10 ialah perwakilan bait bagi pemisah baris, iaitu menekan Enter). Membaca bait adalah satu keseronokan, jadi menggunakannya System.indalam bentuk tulen akan menyusahkan. Untuk membaca huruf Cyrillic (dan bukan sahaja) yang boleh difahami oleh 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 dalam konsol, keputusan kali ini akan berbeza:

Й
1049
10
InputStreamReadermenukarkan dua bait baca (208, 153) kepada nombor tunggal 1049. Ini ialah bacaan mengikut aksara. 1049 sepadan dengan huruf "Y", yang boleh disahkan dengan mudah:
public class Main {

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

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

Й
Nah, bagi BufferedReader'a (dan secara umum - BufferedAnything), kelas buffer digunakan untuk mengoptimumkan prestasi. Mengakses sumber data (fail, konsol, sumber di Internet) adalah operasi yang agak mahal dari segi prestasi. Oleh itu, untuk mengurangkan bilangan panggilan sedemikian, BufferedReaderia membaca dan mengumpul data dalam penimbal khas, dari mana kita boleh menerimanya kemudian. Akibatnya, bilangan panggilan ke sumber data dikurangkan beberapa kali atau bahkan berpuluh kali! Satu lagi ciri tambahan BufferedReader'a dan kelebihannya berbanding biasa InputStreamReader' ialah kaedah yang sangat berguna readLine()yang membaca data sebagai rentetan keseluruhan dan bukannya sebagai nombor individu. Ini, sudah tentu, sangat menambah kemudahan apabila melaksanakan, sebagai contoh, teks besar. Beginilah rupa membaca 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 - 2Sudah tentu, BufferedReaderia adalah mekanisme yang sangat fleksibel dan membolehkan anda bekerja bukan sahaja dengan papan kekunci. Anda boleh membaca data, contohnya, terus dari Internet dengan hanya 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 menghantar laluan kepadanya:
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();
   }
}

Penggantian Sistem.keluar

Sekarang mari kita lihat satu kemungkinan menarik yang tidak pernah kita sentuh sebelum ini. Seperti yang anda mungkin ingat, Systemterdapat dua medan statik dalam kelas - System.indan System.out. Saudara kembar ini adalah objek kelas benang. System.in- kelas abstrak InputStream. Kelas . System.out_ PrintStreamSekarang kita akan bercakap secara khusus tentang System.out. Jika kita pergi ke kod sumber class System, kita akan melihat ini:
public final class System {

……………...

public final static PrintStream out = null;

  …………

}
Jadi, System.outhanya pembolehubah kelas statik biasaSystem . Tiada keajaiban di dalamnya :) Pembolehubah outmilik kelas PrintStream. Berikut ialah soalan yang menarik: mengapa, apabila melaksanakan kod, System.out.println()adakah output muncul dalam konsol dan bukan di tempat lain? Dan adakah mungkin untuk mengubahnya entah bagaimana? Sebagai contoh, kami ingin membaca data daripada konsol dan menulisnya ke fail teks. Adakah mungkin untuk melaksanakan logik sedemikian tanpa menggunakan kelas pembaca dan penulis tambahan, tetapi hanya menggunakan System.out? Masih mungkin :) Dan walaupun pembolehubah System.outditetapkan oleh pengubah suai final, kita masih boleh melakukannya! Berlatih bekerja dengan kelas BuffreredReader dan InputStreamReader - 3Jadi apa yang kita perlukan untuk ini? Pertama , kita memerlukan objek kelas baharu PrintStreamdan bukannya objek semasa. Objek semasa yang dipasang dalam kelas Systemsecara lalai tidak sesuai dengan kami: ia menunjuk ke konsol. Kami perlu mencipta yang baharu yang akan menunjuk ke fail teks sebagai "destinasi" untuk data kami. Kedua , anda perlu memahami cara menetapkan nilai baharu kepada pembolehubah System.out. Anda tidak boleh begitu sahaja, kerana ia ditandakan final. Mari kita mulakan dari akhir. Kelas Systemmengandungi betul-betul kaedah yang kita perlukan - setOut(). Ia mengambil objek sebagai input PrintStreamdan menetapkannya sebagai titik output. Hanya apa yang kita perlukan! Apa yang tinggal ialah mencipta objek PrintStream. Ini juga mudah dilakukan:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Keseluruhan kod 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"));

       /*Сохраним текущее 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("А эта строка - в консоль!");
   }
}
Akibatnya, baris pertama akan ditulis pada fail teks, dan baris kedua akan dikeluarkan ke konsol :) Anda boleh menyalin kod ini ke IDE anda dan menjalankannya. Dengan membuka fail teks, anda akan melihat bahawa baris yang diperlukan telah berjaya ditulis di sana :) Ini menyimpulkan kuliah. Hari ini kami teringat cara bekerja dengan strim dan pembaca, mengimbas kembali bagaimana ia berbeza antara satu sama lain dan belajar tentang ciri baharu System.outyang kami gunakan dalam hampir setiap pelajaran :) Jumpa anda dalam kuliah seterusnya!
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION