Program selalunya termasuk keperluan untuk menulis data dengan cepat ke fail atau tempat lain. Dan ini menimbulkan persoalan: Bagaimana kita harus melakukan ini? Kelas mana yang patut kita pilih? Hari ini kita akan mengenali calon yang sesuai untuk peranan ini — kelas BufferedWriter .

Mengapa kita memerlukan BufferedWriter?

BufferedWriter ialah kelas yang menulis aksara buffer pada strim. Ia membolehkan anda mengurangkan bilangan kali anda mengakses media fizikal. Iaitu, bukannya menulis satu aksara setiap kali, ia menulis data ke penimbal, dan kemudian menulis semua aksara ke medium sekaligus.

Ini sangat meningkatkan kelajuan menulis. Saiz penimbal lalai ialah 8192 aksara, tetapi ini boleh diubah dengan menentukan saiz baharu dalam pembina:


BufferedWriter(Writer in, int sz)

Di sini, hujah pertama pembina ialah aliran yang akan menerima data yang kita tulis. Dan ternyata sz adalah saiz penimbal baru.

Java juga mempunyai kelas BufferedReader : ia digunakan untuk membaca data buffered.

Apakah sebenarnya penimbal? Mari kita ambil contoh kehidupan sebenar. Penampan adalah seperti bakul atau troli beli-belah di pasar raya. Daripada berjalan ke tempat pembayaran dengan satu item, membayarnya, meletakkannya di dalam bagasi kereta anda, dan kemudian kembali untuk mendapatkan item lain, kita boleh mengambil troli beli-belah, meletakkan semua yang kita mahu ke dalamnya, dan kemudian membayar di tempat pembayaran. Beginilah cara penimbal berfungsi: ia mengumpul data dan kemudian mengambil segala-galanya dan menulisnya, bukannya menulis setiap serpihan secara berasingan.

Pembina dan kaedah kelas BufferedWriter

Sekarang mari kita lihat dengan lebih dekat kelas BufferedWriter . Terdapat dua pembina untuk mencipta objek:


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

Di mana keluar dalam kedua-dua pembina ialah aliran untuk menulis, dan sz , seperti yang telah disebutkan, ialah saiz penimbal.

Kelas BufferedWriter juga mempunyai beberapa kaedah. Kami akan melihat dengan lebih dekat beberapa daripada mereka hari ini:

tulis(tatasusunan[]) Menulis tatasusunan char ke penimbal
tulis (String s, int off, int len) Menulis sebahagian daripada rentetan kepada penimbal
tambah(char c) Tulis aksara pada penimbal
append(CharSequence csq, int start, int end) Menulis sebahagian daripada tatasusunan kepada penimbal
baris baru() Menulis pemisah baris
siram() Menyiram aliran

Mari tulis program yang akan menulis nilai pada fail. UntukPenulisparameter, kami akan lulus aFileWriterkepada pembina. Ia digunakan untuk menulis fail teks dan mempunyai beberapa pembina untuk memulakan objek:

FileWriter(Fail Fail)
FileWriter(Fail Fail, boolean append)
FileWriter(FileDescriptor fd)
FileWriter(String FileName)
FileWriter(String fileName, boolean append)

Untuk contoh kami, kami akan menggunakan pembina yang mengambil nama fail:


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());
 }

Kod kami akan menggunakan kaedah tulis(String str) untuk menulis str ke fail file.txt .

Terdapat kaedah lain untuk menulis:

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

  • write(String s, int off, int len) — varian ini mengambil rentetan s ; offset off , iaitu indeks aksara untuk mula menulis; dan len , iaitu panjang rentetan (subrentetan) yang hendak 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());
}

Kod ini akan menulis "Hello, Amig" pada fail, kerana kami memberitahu kaedah untuk menulis 11 aksara bermula dari indeks 0.

Kod kami juga mempunyai blok sumber cuba dengan :


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

Ini bermakna kaedah close() dipanggil secara automatik pada mybufferedWriterobjek, kerana ia melaksanakan antara muka AutoCloseable .

Kaedah flush() dalam kod digunakan untuk mengepam aliran keluaran, memaksa semua bait buffer ditulis. Tulisan mungkin tidak berlaku tanpa panggilan ini, kerana ini menunjukkan bahawa penimbal mesti disiram dan bait penimbal mesti ditulis.

Kelas BufferedWriter juga mempunyai kaedah newLine() yang menambah baris baharu pada mesej kami:


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());
    }

Dalam fail, kami mendapat:

Hello, Amigo!
Ini adalah mesej yang sangat penting!

Tandatangan kaedah append() kelihatan seperti ini:


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

Ia digunakan untuk menambah csq . Di sini permulaan ialah indeks aksara pertama, dan akhir ialah indeks aksara terakhir rentetan (atau subrentetan) yang akan dimasukkan. Aksara dengan hujung indeks tidak disisipkan.


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());
}

Kod ini akan memberi anda:

helo,

Iaitu, dengan kaedah tambah , anda menentukan bahagian rentetan yang hendak ditambahkan pada penimbal.

Melihat dengan lebih dekat perbezaan antara write() dan append() , kita mula-mula melihat bahawa kedua-duanya melakukan perkara yang sama pada dasarnya — mereka menulis nilai.

Walau bagaimanapun, perbezaannya ialah kaedah append adalah lebih baharu dan mengambil CharSequence sebagai hujah, dan kerana String melaksanakan CharSequence , kita boleh menghantar Strings dan StringBuilders , dan StringBuffers kepada kaedah append . Tetapi kaedah write() hanya akan menerima String .

Itu sahaja buat masa ini! Hari ini kita berkenalan dengan penimbal, cara melakukan penulisan penimbal pada fail, serta kaedah yang boleh anda gunakan untuk melakukan ini.