Програмите много често включват изискване за бързо записване на данни във файл or другаде. И това повдига въпроси: Как трябва да направим това? Кой клас да изберем? Днес ще се запознаем с подходящ кандидат за тази роля — класът BufferedWriter .

Защо се нуждаем от BufferedWriter?

BufferedWriter е клас, който записва буферирани символи в поток. Позволява ви да намалите броя на достъпите до физически носители. Това означава, че instead of да пише единичен знак всеки път, той записва данни в буфер и след това записва всички знаци на носителя наведнъж.

Това значително увеличава скоростта на запис. Размерът на буфера по подразбиране е 8192 знака, но това може да бъде променено чрез указване на нов размер в конструктора:

BufferedWriter(Writer in, int sz)

Тук първият аргумент на конструктора е поток, който ще получи данните, които записваме. И се оказва, че sz е размерът на новия буфер.

Java също има клас BufferedReader : той се използва за буферирано четене на данни.

Какво точно е буфер? Да вземем пример от реалния живот. Буферът е като кошница or пазарска количка в супермаркет. Вместо да отидете до касата с един артикул, да го платите, да го поставите в багажника на колата си и след това да се върнете за друг артикул, можем да вземем количка за пазаруване, да сложим всичко, което искаме в нея, и след това да платим на касата. Точно така работи буферът: той събира данни и след това взема всичко и го записва, instead of да записва всеки фрагмент поотделно.

Конструктори и методи на класа BufferedWriter

Сега нека разгледаме по-отблизо класа BufferedWriter . Има два конструктора за създаване на обект:

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

Където и в двата конструктора е потокът за запис, а sz , Howто вече беше споменато, е размерът на буфера.

Класът BufferedWriter също има няколко метода. Днес ще разгледаме по-отблизо някои от тях:

запис (сигнал [] масив) Записва масив от символи в буфера
write(String s, int off, int len) Записва част от низ в буфера
добавяне (символ c) Напишете знак в буфера
append(CharSequence csq, int начало, int край) Записва част от масив в буфера
нова линия() Пише разделител на редове
флъш() Промива потока

Нека напишем програма, която ще запише стойност във файл. ЗаПисателпараметър, ще предадем aFileWriterкъм конструктора. Използва се за писане на текстови файлове и има няколко конструктора за инициализиране на обекти:

FileWriter(Файлов файл)
FileWriter(Файлов файл, булево добавяне)
FileWriter(FileDescriptor fd)
FileWriter(Низ име на файл)
FileWriter(Низ име на файл, булево добавяне)

За нашия пример ще използваме конструктор, който приема име на файл:

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

Нашият code ще използва метода write(String str), за да запише str във file file.txt .

Има и други методи за писане:

  • write(char[] array ) — този вариант приема и записва char масив;

  • write(String s, int off, int len) — този вариант приема низ s ; отместване , което е индекс на знака, от който да започнете да пишете ; и len , което е дължината на низа (подниза), който трябва да бъде написан.

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

Този code ще напише "Hello, Amig" във file, тъй като казахме на метода да напише 11 знака, започвайки от индекс 0.

Нашият code също има блок за опит с ресурси :

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

Това означава, че методът close() се извиква автоматично на mybufferedWriterобект, защото имплементира интерфейса AutoCloseable .

Методът flush() в codeа се използва за изчистване на изходния поток, принуждавайки всички буферирани byteове да бъдат записани. Записването може да не се случи без това извикване, тъй като то показва, че буферът трябва да бъде изчистен и че буферираните byteове трябва да бъдат записани.

Класът BufferedWriter също има метод newLine() , който добавя нов ред към нашето съобщение:

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

Във file получаваме:

Здравей, Амиго!
Това е много важно съобщение!

Сигнатурата на метода append() изглежда така:

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

Използва се за добавяне на csq . Тук start е индексът на първия знак, а end е индексът на последния знак от низа (or подниза), който трябва да бъде вмъкнат. Знакът с край на индекса не се вмъква.

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

Този code ще ви даде:

Здравейте,

Тоест, с метода append вие определяте коя част от низа да добавите към буфера.

Разглеждайки по-внимателно разликата между write() и append() , първо виждаме, че и двата правят едно и също нещо по принцип — записват стойности.

Разликата обаче е, че методът append е по-нов и приема CharSequence като аргумент и тъй като String имплементира CharSequence , можем да предадем Strings и StringBuilders и StringBuffers към метода append . Но методът write() ще приеме само String .

Това е за сега! Днес се запознахме с буферите, How да извършим буфериран запис във файл, Howто и методите, които можете да използвате за това.