Program sangat sering menyertakan persyaratan untuk menulis data dengan cepat ke file atau di tempat lain. Dan ini menimbulkan pertanyaan: Bagaimana kita harus melakukan ini? Kelas mana yang harus kita pilih? Hari ini kita akan mengenal kandidat yang cocok untuk peran ini — kelas BufferedWriter .

Mengapa kita membutuhkan BufferedWriter?

BufferedWriter adalah kelas yang menulis karakter buffer ke aliran. Ini memungkinkan Anda mengurangi berapa kali Anda mengakses media fisik. Artinya, alih-alih menulis satu karakter setiap kali, ia menulis data ke buffer, lalu menulis semua karakter ke media sekaligus.

Ini sangat meningkatkan kecepatan tulis. Ukuran buffer default adalah 8192 karakter, tetapi ini dapat diubah dengan menentukan ukuran baru di konstruktor:


BufferedWriter(Writer in, int sz)

Di sini, argumen pertama konstruktor adalah aliran yang akan menerima data yang kita tulis. Dan ternyata sz adalah ukuran buffer baru.

Java juga memiliki kelas BufferedReader : digunakan untuk membaca data dengan buffer.

Apa sebenarnya buffer itu? Mari kita ambil contoh kehidupan nyata. Penyangga seperti keranjang atau kereta belanja di supermarket. Alih-alih berjalan ke kasir dengan satu item, membayarnya, memasukkannya ke dalam bagasi mobil Anda, dan kemudian kembali untuk item lain, kita dapat mengambil keranjang belanja, memasukkan semua yang kita inginkan ke dalamnya, dan kemudian membayar. di kasir. Beginilah cara kerja buffer: ia mengumpulkan data dan kemudian mengambil semuanya dan menulisnya, alih-alih menulis setiap fragmen secara terpisah.

Konstruktor dan metode kelas BufferedWriter

Sekarang mari kita lihat lebih dekat kelas BufferedWriter . Ada dua konstruktor untuk membuat objek:


public BufferedWriter(Writer out) 
public BufferedWriter(Writer out, int sz)

Di mana di kedua konstruktor adalah aliran untuk menulis, dan sz , seperti yang telah disebutkan, adalah ukuran buffer.

Kelas BufferedWriter juga memiliki beberapa metode. Kami akan melihat lebih dekat beberapa di antaranya hari ini:

tulis(char[] larik) Menulis array char ke buffer
tulis(String s, int mati, int len) Menulis bagian dari string ke buffer
tambahkan (karakter c) Tulis karakter ke buffer
tambahkan(CharSequence csq, int mulai, int akhir) Menulis bagian dari array ke buffer
garis baru() Menulis pemisah baris
menyiram() Membilas aliran

Mari kita menulis program yang akan menulis nilai ke file. UntukPenulisparameter, kami akan melewati aFileWriterkepada pembina. Ini digunakan untuk menulis file teks dan memiliki beberapa konstruktor untuk menginisialisasi objek:

FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(FileDescriptor fd)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)

Sebagai contoh, kami akan menggunakan konstruktor yang mengambil nama file:


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message);
	bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
 }

Kode kita akan menggunakan metode write(String str) untuk menulis str ke file file.txt .

Ada metode lain untuk menulis:

  • write(char[] array ) — varian ini menerima dan menulis array char ;

  • write(String s, int off, int len) — varian ini menggunakan string s ; offset off , yang merupakan indeks karakter untuk mulai menulis; dan len , yang merupakan panjang string (substring) yang akan ditulis.


try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message, 0, 11);
 	bufferedWriter.flush();

} catch(IOException ex) {
System.out.println(ex.getMessage());
}

Kode ini akan menulis "Halo, Amig" ke file, karena kami memberi tahu metode untuk menulis 11 karakter mulai dari indeks 0.

Kode kami juga memiliki blok sumber coba dengan sumber daya :


try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt"))) 

Ini berarti bahwa metode close() dipanggil secara otomatis di mybufferedWriterobjek, karena mengimplementasikan antarmuka AutoCloseable .

Metode flush() dalam kode digunakan untuk menyiram aliran keluaran, memaksa semua byte buffer untuk ditulis. Penulisan mungkin tidak terjadi tanpa pemanggilan ini, karena ini menunjukkan bahwa buffer harus di-flush dan byte yang di-buffer harus ditulis.

Kelas BufferedWriter juga memiliki metode newLine() yang menambahkan baris baru ke pesan kita:


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
        String message = "Hello, Amigo! This is a very important message!";
        bufferedWriter.write(message, 0, 13);
        bufferedWriter.newLine();
        bufferedWriter.write(message, 15, 33);
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }

Di dalam file, kita mendapatkan:

Halo, Amigo!
Ini adalah pesan yang sangat penting!

Tanda tangan metode append() terlihat seperti ini:


public Writer append(CharSequence csq, int start, int end)

Ini digunakan untuk menambahkan csq . Di sini awal adalah indeks dari karakter pertama, dan akhir adalah indeks dari karakter terakhir dari string (atau substring) yang akan disisipkan. Karakter dengan ujung indeks tidak dimasukkan.


try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
    String message = "Hello, Amigo! This is a very important message!";
    bufferedWriter.append(message, 0, 7);
    bufferedWriter.flush();
} catch (IOException ex) {
    System.out.println(ex.getMessage());
}

Kode ini akan memberi Anda:

Halo,

Artinya, dengan metode append , Anda menentukan bagian mana dari string yang akan ditambahkan ke buffer.

Melihat lebih dekat pada perbedaan antara write() dan append() , pertama-tama kita melihat bahwa keduanya melakukan hal yang sama pada prinsipnya — mereka menulis nilai.

Namun, perbedaannya adalah bahwa metode append lebih baru dan menggunakan CharSequence sebagai argumen, dan karena String mengimplementasikan CharSequence , kita dapat meneruskan Strings dan StringBuilders , dan StringBuffers ke metode append . Tetapi metode write() hanya akan menerima String .

Itu saja untuk saat ini! Hari ini kami berkenalan dengan buffer, cara melakukan penulisan buffer ke file, serta metode yang dapat Anda gunakan untuk melakukannya.