Programmer inkluderer veldig ofte et krav om å raskt skrive data til en fil eller andre steder. Og dette reiser spørsmål: Hvordan skal vi gjøre dette? Hvilken klasse skal vi velge? I dag skal vi bli kjent med en passende kandidat for denne rollen – BufferedWriter -klassen.

Hvorfor trenger vi BufferedWriter?

BufferedWriter er en klasse som skriver bufrede tegn til en strøm. Den lar deg redusere antall ganger du får tilgang til fysiske medier. Det vil si at i stedet for å skrive et enkelt tegn hver gang, skriver den data til en buffer, og skriver deretter alle tegnene til mediet på en gang.

Dette øker skrivehastigheten betraktelig. Standard bufferstørrelse er 8192 tegn, men dette kan endres ved å spesifisere en ny størrelse i konstruktøren:


BufferedWriter(Writer in, int sz)

Her er konstruktørens første argument en strøm som vil motta dataene vi skriver. Og det viser seg at sz er størrelsen på den nye bufferen.

Java har også en BufferedReader- klasse: den brukes til bufret lesing av data.

Hva er egentlig en buffer? La oss ta et eksempel fra det virkelige liv. En buffer er som en kurv eller handlekurv på et supermarked. I stedet for å gå opp til kassen med en enkelt vare, betale for den, legge den i bagasjerommet på bilen din og så komme tilbake for en annen vare, kan vi ta en handlekurv, legge alt vi vil ha i den, og deretter betale i kassen. Det er akkurat slik en buffer fungerer: den samler inn data og tar så alt og skriver det, i stedet for å skrive hvert fragment separat.

Konstruktører og metoder for BufferedWriter-klassen

La oss nå se nærmere på BufferedWriter -klassen. Det er to konstruktører for å lage et objekt:


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

Hvor ute i begge konstruktørene er strømmen å skrive til, og sz , som allerede nevnt, er størrelsen på bufferen.

BufferedWriter - klassen har også flere metoder. Vi skal se nærmere på noen av dem i dag:

skrive(char[] array) Skriver en char array til bufferen
skriv(String s, int off, int len) Skriver en del av en streng til bufferen
legge til (tegn c) Skriv et tegn til bufferen
append(CharSequence csq, int start, int end) Skriver en del av en matrise til bufferen
ny linje() Skriver en linjeskilletegn
flush() Skyller strømmen

La oss skrive et program som vil skrive en verdi til en fil. ForForfatterparameter, sender vi enFileWritertil konstruktøren. Den brukes til å skrive tekstfiler og har flere konstruktører for å initialisere objekter:

FileWriter(Filfil)
FileWriter(Filfil, boolesk tillegg)
FileWriter(FileDescriptor fd)
FileWriter(Stringfilnavn)
FileWriter(Stringfilnavn, boolsk tillegg)

For vårt eksempel bruker vi en konstruktør som tar et filnavn:


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

Koden vår vil bruke write(String str) -metoden for å skrive str til filen file.txt .

Det finnes andre måter å skrive på:

  • write(char[] array ) — denne varianten godtar og skriver en char array;

  • skriv(String s, int off, int len) — denne varianten tar en streng s ; en offset off , som er indeksen til tegnet du skal begynne å skrive fra; og len , som er lengden på strengen (delstrengen) som skal skrives.


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

Denne koden vil skrive "Hei, Amig" til filen, siden vi fortalte metoden å skrive 11 tegn fra indeks 0.

Koden vår har også en prøve-med-ressursblokk :


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

Dette betyr at close() -metoden kalles automatisk på minbufferedWriterobjekt, fordi det implementerer AutoCloseable- grensesnittet.

Flush () -metoden i koden brukes til å tømme utdatastrømmen, og tvinger alle bufrede byte til å skrives. Skrivingen kan ikke skje uten dette kallet, siden det er det som indikerer at bufferen må tømmes og at de bufrede bytene må skrives.

BufferedWriter - klassen har også en newLine() -metode som legger til en ny linje i meldingen vår:


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

I filen får vi:

Hei, Amigo!
Dette er et veldig viktig budskap!

Signaturen til append() -metoden ser slik ut:


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

Den brukes til å legge til csq . Her er start indeksen til det første tegnet, og slutten er indeksen til det siste tegnet i strengen (eller delstrengen) som skal settes inn. Tegnet med indeksslutt er ikke satt inn.


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

Denne koden vil gi deg:

Hallo,

Det vil si at med append- metoden spesifiserer du hvilken del av strengen som skal legges til bufferen.

Ser vi nærmere på forskjellen mellom write() og append() , ser vi først at de begge gjør det samme i prinsippet - de skriver verdier.

Forskjellen er imidlertid at append- metoden er nyere og tar en CharSequence som argument, og fordi String implementerer CharSequence , kan vi sende Strings and StringBuilders , og StringBuffers til append -metoden. Men write() -metoden vil bare godta en streng .

Det var det for nå! I dag ble vi kjent med buffere, hvordan du utfører bufret skriving til en fil, samt metodene du kan bruke for å gjøre dette.