Java BufferedReader: Cara Membaca File dengan Contoh
โก Ringkasan Cerdas
Java BufferedReader membaca teks dari aliran input dengan melakukan buffering karakter, yang membuat pembacaan file baris demi baris menjadi cepat dan sederhana. Wrapping sebuah FileReader di dalam BufferedReader dan looping Pada fungsi readLine hingga mengembalikan nilai null, seluruh isi file akan dicetak.

Cara membaca file di Java?
Java menyediakan beberapa mekanisme untuk membaca dari sebuah file. Paket yang paling berguna untuk ini adalah java.io, yang perutnyatract Reader Kelas ini mendefinisikan pembacaan aliran karakter. java.io.BufferedReader adalah subkelas konkret yang digunakan untuk pembacaan berbasis baris yang efisien.
Apa itu BufferedReader masuk Java?
Bufferpembaca ed adalah Java Kelas yang membaca teks dari aliran input, seperti file, dengan melakukan buffering karakter sehingga karakter, array, dan baris dibaca secara efisien. Tanpa buffering, setiap permintaan baca yang dibuat pada Reader akan memicu permintaan baca yang sesuai terhadap aliran karakter atau byte yang mendasarinya.
Oleh karena itu disarankan untuk membungkusnya BufferedReader di sekitar Reader mana pun yang read() Operasi tersebut mungkin mahal, seperti FileReader ke InputStreamReaderPenggunaan umum meneruskan jalur file ke pembaca sebagai berikut:
// Note the doubled backslash: a single \ starts an escape sequence objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));
Ini memuat file ke dalam objReaderKemudian Anda mengulangi proses membaca isi file dan mencetak setiap baris. Perulangan while dalam kode di bawah ini membaca file hingga mencapai akhir file.
while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); }
strCurrentLine mempertahankan garis saat ini, dan objReader.readLine() Fungsi ini mengembalikan sebuah String. Oleh karena itu, perulangan terus berjalan selama nilai yang dikembalikan bukan null, dan berhenti pada null pertama, yang menandakan akhir file.
BufferContoh edReader
Kode di bawah ini adalah kode lengkap. Java BufferContoh edReader:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample { public static void main(String[] args) { BufferedReader objReader = null; try { String strCurrentLine; objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt")); while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (objReader != null) objReader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
Catatan: The finally Blok itu penting. Itu menjamin bahwa objReader.close() berjalan terlepas dari apakah terjadi pengecualian atau tidak, yang melepaskan handle file yang mendasarinya dan tetap manajemen memori Dapat diprediksi. Try bersarang di dalam finally diperlukan karena close() menyatakan sendiri IOException.
BufferContoh edReader JDK7
Mulai dari JDK 7 dan seterusnya, try-with-resources menghapus finally seluruh blok. Sumber daya apa pun yang dideklarasikan dalam tanda kurung try Pernyataan ditutup secara otomatis ketika blok berakhir, dalam urutan terbalik dari pembuatannya, bahkan jika terjadi pengecualian:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample_jdk7 { private static final String FILENAME = "D:\\DukesDiary.txt"; public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader(FILENAME))) { String strCurrentLine; while ((strCurrentLine = br.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } } }
Versi ini lebih pendek dan lebih aman, jadi ini adalah bentuk yang lebih disukai dalam kode baru. Membaca file hanyalah salah satu kegunaan kelas ini; bagian selanjutnya membandingkannya dengan alternatif yang paling sering digunakan pemula terlebih dahulu.
BufferedReader vs Scanner: Mana yang Harus Digunakan?
Kedua kelas tersebut membaca teks, dan pemula sering memilih salah satunya secara sembarangan. Mereka memecahkan masalah yang berbeda, dan pilihan yang salah akan terlihat sebagai penguraian manual yang canggung atau throughput yang buruk begitu input bertambah hingga ribuan baris. Tabel di bawah ini menyajikan keduanya secara berdampingan.
| Aspek | Bufferpembaca ed | Scanner |
|---|---|---|
| Pengembalian | Seluruh baris sebagai String | Token dan primitif yang diuraikan |
| Penguraian terintegrasi | Tidak โ Anda memisahkan diri atau mengkonversi sendiri. | Ya โ nextInt, nextDouble, baris berikutnya |
| Buffer default | 8192 karakter | 1024 karakter |
| Kecepatan pada file berukuran besar | Lebih cepat | Lebih lambat, karena tokenisasi regex. |
| Keamanan benang | Syncdikukuhkan | Tidak tersinkronisasi |
| Terbaik untuk | Membaca file besar baris demi baris | Input interaktif kecil yang membutuhkan nilai yang diketik. |
Pilih BufferedReader digunakan ketika tujuannya adalah untuk menelusuri file dengan cepat dan menangani teks sendiri, dan Scanner digunakan ketika Anda menginginkan nilai yang diketik tanpa menulis kode konversi. Memisahkan setiap baris yang dikembalikan dengan Metode pemisahan string memberikan BufferedReader menawarkan sebagian besar kemudahan Scanner dengan kecepatan lebih tinggi.
Cara Membaca Input Konsol Menggunakan Bufferpembaca ed
Kelas yang sama membaca input keyboard, yang berguna untuk program baris perintah kecil dan untuk input tantangan pemrograman. System.in Ini adalah aliran byte, jadi tidak dapat diserahkan ke BufferedReader secara langsung. Sebuah InputStreamReader menjembatani byte ke karakter, dan BufferedReader kemudian menambahkan fitur pembacaan baris yang efisien di atas jembatan tersebut.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ReadConsoleExample { public static void main(String[] args) throws IOException { // Bridge the System.in byte stream to a character stream try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { System.out.print("Enter your name: "); String name = reader.readLine(); System.out.print("Enter your age: "); // readLine always returns text, so convert it explicitly int age = Integer.parseInt(reader.readLine().trim()); System.out.println("Hello " + name + ", age " + age); } } }
Ada tiga hal penting yang perlu diingat. Pertama, readLine() selalu mengembalikan String, jadi input numerik harus dikonversi dengan Integer.parseInt atau yang serupa, dan entri non-numerik akan menimbulkan kesalahan. NumberFormatException โ Lakukan konversi dengan cara membungkus data jika input tidak tepercaya. Kedua, memanggil .trim() menghapus baris baru di akhir yang Windows Konsol menambahkan nilai, yang sering menjadi penyebab kegagalan parsing. Ketiga, hindari menutup pembaca yang dibungkus di sekitar System.in jika program masih membutuhkan input konsol di kemudian hari, karena menutup pembungkus akan menutup aliran data yang mendasarinya secara permanen untuk proses tersebut.
Untuk program yang membaca banyak nilai, membaca satu baris dan memisahkannya jauh lebih cepat daripada memanggil fungsi tertentu. readLine() berulang kali, karena setiap panggilan hanya masuk ke sistem operasi ketika buffer kosong. Inilah alasan utama mengapa programmer kompetitif lebih menyukai BufferedReader lebih unggul daripada Scanner untuk input data dalam jumlah besar.
Meskipun kode sudah benar, sejumlah kesalahan tetap muncul berulang kali.
Umum BufferKesalahan edReader dan Cara Memperbaikinya
jembatan BufferKegagalan edReader berasal dari jalur file, penanganan sumber daya, atau pengkodean karakter, bukan dari loop pembacaan itu sendiri. Setiap kesalahan di bawah ini menyebutkan pengecualian dan solusinya.
- Karakter pelarian ilegal: jalur tersebut menggunakan garis miring terbalik tunggal, seperti pada
"D:\DukesDiary.txt". Double untuk"D:\\DukesDiary.txt", atau gunakan garis miring, yang Java menerima pada Windows. - FileNotFoundException: Jalur tersebut relatif terhadap direktori kerja, bukan file sumber. Cetak
new File(name).getAbsolutePath()untuk melihat di mana Java sebenarnya sedang melihat. - Terjadi NullPointerException pada pembacaan pertama: Pembaca tidak pernah ditugaskan karena konstruktor melempar pengecualian, dan pengecualian tersebut diabaikan. Periksa penanganan pengecualian sebelum loop.
- Karakter acak atau tanda tanya: berkas tersebut berformat UTF-8 tetapi
FileReaderMenerapkan charset default platform. Berikan charset secara eksplisit, misalnyanew InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8). - Siaran langsung ditutup: Pembaca ditutup di dalam loop atau digunakan kembali setelah try-with-resources berakhir. Buka pembaca baru untuk setiap proses pada file.
