Ang mga programa ay kadalasang nagsasama ng isang kinakailangan upang mabilis na magsulat ng data sa isang file o saanman. At ito ay nagtataas ng mga tanong: Paano natin ito gagawin? Aling klase ang dapat nating piliin? Ngayon ay makikilala natin ang isang angkop na kandidato para sa tungkuling ito — ang klase ng BufferedWriter .

Bakit kailangan natin ng BufferedWriter?

Ang BufferedWriter ay isang klase na nagsusulat ng mga buffered na character sa isang stream. Hinahayaan ka nitong bawasan ang bilang ng beses na na-access mo ang pisikal na media. Iyon ay, sa halip na magsulat ng isang character sa bawat oras, nagsusulat ito ng data sa isang buffer, at pagkatapos ay isinusulat ang lahat ng mga character sa medium nang sabay-sabay.

Ito ay lubos na nagpapataas ng bilis ng pagsulat. Ang default na laki ng buffer ay 8192 character, ngunit maaari itong baguhin sa pamamagitan ng pagtukoy ng bagong laki sa constructor:


BufferedWriter(Writer in, int sz)

Dito, ang unang argumento ng constructor ay isang stream na tatanggap ng data na isinusulat namin. At lumalabas na sz ang laki ng bagong buffer.

Ang Java ay mayroon ding klase ng BufferedReader : ginagamit ito para sa buffered na pagbabasa ng data.

Ano nga ba ang buffer? Kumuha tayo ng isang tunay na halimbawa sa buhay. Ang buffer ay parang basket o shopping cart sa isang supermarket. Sa halip na maglakad papunta sa checkout gamit ang isang item, bayaran ito, ilagay ito sa trunk ng iyong sasakyan, at pagkatapos ay bumalik para sa isa pang item, maaari tayong kumuha ng shopping cart, ilagay ang lahat ng gusto natin, at pagkatapos ay magbayad. sa checkout. Ito ay eksakto kung paano gumagana ang isang buffer: kinokolekta nito ang data at pagkatapos ay kinukuha ang lahat at isusulat ito, sa halip na isulat ang bawat fragment nang hiwalay.

Mga konstruktor at pamamaraan ng klase ng BufferedWriter

Ngayon tingnan natin ang klase ng BufferedWriter . Mayroong dalawang mga konstruktor para sa paglikha ng isang bagay:


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

Kung saan sa parehong mga konstruktor ay ang stream upang sumulat, at sz , tulad ng nabanggit na, ay ang laki ng buffer.

Ang klase ng BufferedWriter ay mayroon ding ilang mga pamamaraan. Susuriin natin ang ilan sa mga ito ngayon:

write(char[] array) Nagsusulat ng char array sa buffer
write(String s, int off, int len) Nagsusulat ng bahagi ng isang string sa buffer
dugtungan(char c) Sumulat ng isang character sa buffer
append(CharSequence csq, int start, int end) Nagsusulat ng bahagi ng isang array sa buffer
bagong linya() Sumulat ng isang line separator
flush() Pina-flush ang stream

Sumulat tayo ng isang programa na magsusulat ng isang halaga sa isang file. Para saManunulatparameter, ipapasa natin ang aFileWritersa constructor. Ito ay ginagamit upang magsulat ng mga text file at may ilang mga constructor upang simulan ang mga bagay:

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

Para sa aming halimbawa, gagamit kami ng constructor na kumukuha ng filename:


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

Gagamitin ng aming code ang write(String str) na paraan upang magsulat ng str sa file.txt file.

Mayroong iba pang mga paraan sa pagsulat:

  • write(char[] array ) — ang variant na ito ay tumatanggap at nagsusulat ng char array;

  • write(String s, int off, int len) — ang variant na ito ay tumatagal ng string s ; isang offset off , na index ng character upang simulan ang pagsusulat; at len ​​, na siyang haba ng string (substring) na isusulat.


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

Isusulat ng code na ito ang "Hello, Amig" sa file, dahil sinabi namin ang paraan na magsulat ng 11 character simula sa index 0.

Ang aming code ay mayroon ding try-with resources block:


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

Nangangahulugan ito na ang close() na pamamaraan ay awtomatikong tinatawag sa mybufferedWriterobject, dahil ipinapatupad nito ang AutoCloseable na interface.

Ang flush() na paraan sa code ay ginagamit upang i-flush ang output stream, na pinipilit ang lahat ng buffered byte na maisulat. Maaaring hindi mangyari ang pagsulat nang walang tawag na ito, dahil ito ang nagpapahiwatig na ang buffer ay dapat i-flush at ang mga buffered byte ay dapat na nakasulat.

Ang klase ng BufferedWriter ay mayroon ding newLine() na pamamaraan na nagdaragdag ng bagong linya sa aming mensahe:


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

Sa file, nakukuha namin:

Hello, Amigo!
Ito ay isang napakahalagang mensahe!

Ang lagda ng paraan ng append() ay ganito:


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

Ito ay ginagamit upang magdagdag ng csq . Narito ang simula ay ang index ng unang character, at ang pagtatapos ay ang index ng huling character ng string (o substring) na ilalagay. Ang character na may dulo ng index ay hindi ipinasok.


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

Ang code na ito ay magbibigay sa iyo ng:

Kamusta,

Iyon ay, gamit ang paraan ng append , tinukoy mo kung aling bahagi ng string ang idaragdag sa buffer.

Kung titingnang mabuti ang pagkakaiba sa pagitan ng write() at append() , una nating makikita na pareho silang gumagawa ng parehong bagay sa prinsipyo — sumusulat sila ng mga halaga.

Gayunpaman, ang kaibahan ay mas bago ang paraan ng append at kumukuha ng CharSequence bilang argumento, at dahil ipinapatupad ng String ang CharSequence , maaari nating ipasa ang Strings at StringBuilders , at StringBuffers sa paraan ng append . Ngunit ang write() na pamamaraan ay tatanggap lamang ng isang String .

Yun lang muna! Ngayon nakilala namin ang mga buffer, kung paano magsagawa ng buffered na pagsulat sa isang file, pati na rin ang mga pamamaraan na magagamit mo upang gawin ito.