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.

  • ???? Tujuan Inti: BufferedReader membungkus Reader apa pun yang operasi pembacaannya mahal, mengurangi jumlah pembacaan individual terhadap aliran data yang mendasarinya.
  • ๐Ÿ” Bacaan Berulang: Fungsi readLine mengembalikan satu baris per panggilan dan null di akhir file, sehingga loop while pada hasil tersebut akan menelusuri seluruh file.
  • ๐Ÿงฑ Jalur yang Dihindari: A Windows jalur di dalam Java String memerlukan garis miring terbalik ganda, jika tidak, kompiler akan menolak urutan escape yang tidak valid.
  • โ™ป๏ธ Pelepasan Sumber Daya: Menutup pembaca akan membebaskan handle file yang mendasarinya; try-with-resources melakukan penutupan itu secara otomatis.
  • ๏ธ Input Konsol: Bungkusping System.in dalam InputStreamReader memungkinkan kelas yang sama untuk membaca input keyboard, bukan file.
  • ๏ธ Kontras Pemindai: BufferedReader lebih cepat dan mengembalikan baris mentah, sedangkan Scanner mengurai token dan tipe data primitif secara langsung.
  • ๐Ÿ”ค Peringatan Charset: FileReader menerapkan charset default, jadi menentukan charset secara eksplisit akan menghindari karakter yang terdistorsi di berbagai mesin.

BufferedReader masuk Java

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 FileReader Menerapkan charset default platform. Berikan charset secara eksplisit, misalnya new 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.

Pertanyaan Umum Demo Slot

Ya. Argumen konstruktor kedua mengatur buffer dalam karakter, misalnya. new BufferedReader(reader, 16384)Nilai default 8192 cocok untuk sebagian besar file; menaikkannya hanya membantu untuk pembacaan sekuensial yang sangat besar.

Untuk file kecil, ya โ€” fungsi ini mengembalikan daftar baris dalam satu panggilan. Untuk file besar, lebih baik Files.newBufferedReader or Files.lines, karena readAllLines menyimpan seluruh file dalam memori sekaligus.

Ya. AI Asisten menulis ulang pembersihan blok finally menjadi try-with-resources dan menyarankan padanan NIO. Verifikasi charset dan perilaku pengecualian setelahnya, karena konversi yang dihasilkan sering kali menghilangkan pengkodean eksplisit.

AI membaca tumpukan tracdan mengidentifikasi apakah penyebabnya adalah direktori kerja yang salah, izin yang hilang, atau ketidaksesuaian pengkodean. Ini mempersingkat diagnosis, meskipun perbaikan masih perlu diverifikasi terhadap file sebenarnya.

Tidak. Fungsi readLine menghilangkan pemisah baris, sehingga String yang dikembalikan tidak mengandung baris baru di akhir. Oleh karena itu, baris kosong dalam file akan mengembalikan String kosong, bukan null.

Ringkaslah postingan ini dengan: