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 :) Mari 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, BufferedReader
tanggung 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.in
adalah thread untuk menerima data dari keyboard. Pada prinsipnya, untuk mengimplementasikan logika membaca teks, kita cukup satu saja. Tapi, seperti yang Anda ingat, System.in
itu 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.in
dalam bentuk murni akan merepotkan. Untuk membaca huruf Sirilik (dan tidak hanya) yang dapat dimengerti semua orang, kami menggunakan InputStreamReader
sebagai 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
InputStreamReader
mengonversi 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, BufferedReader
ia 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
Tentu saja, BufferedReader
ini 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,System
ada dua bidang statis di kelas - System.in
dan System.out
. Saudara kembar ini adalah objek kelas thread. System.in
- kelas abstrak InputStream
. Kelas . System.out
_ PrintStream
Sekarang 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.out
hanya variabel kelas statis biasaSystem
. Tidak ada keajaiban di dalamnya :) Variabel out
milik 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.out
ditunjuk oleh modifier final
, kita masih bisa melakukannya! Jadi apa yang kita butuhkan untuk ini? Pertama , kita memerlukan objek kelas baru, PrintStream
bukan objek kelas saat ini. Objek saat ini yang terinstal di kelas System
secara 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 System
berisi metode yang kita butuhkan - setOut()
. Dibutuhkan suatu objek sebagai masukan PrintStream
dan 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.out
yang kami gunakan di hampir setiap pelajaran :) Sampai jumpa di kuliah berikutnya!
GO TO FULL VERSION