A programok gyakran tartalmazzák azt a követelményt, hogy az adatokat gyorsan fájlba vagy máshová kell írni. És ez kérdéseket vet fel: Hogyan tegyük ezt? Melyik osztályt válasszuk? Ma egy alkalmas jelöltet ismerünk meg erre a szerepre: a BufferedWriter osztályt.

Miért van szükségünk a BufferedWriterre?

A BufferedWriter egy olyan osztály, amely pufferelt karaktereket ír egy adatfolyamba. Lehetővé teszi, hogy csökkentse a fizikai adathordozók elérésének számát. Vagyis ahelyett, hogy minden alkalommal egyetlen karaktert írna, adatokat ír egy pufferbe, majd az összes karaktert egyszerre írja a médiumra.

Ez nagymértékben növeli az írási sebességet. Az alapértelmezett pufferméret 8192 karakter, de ez megváltoztatható a konstruktorban új méret megadásával:


BufferedWriter(Writer in, int sz)

Itt a konstruktor első argumentuma egy adatfolyam, amely megkapja az általunk írt adatokat. És kiderül, hogy sz az új puffer mérete.

A Java-nak van egy BufferedReader osztálya is: ez az adatok pufferelt olvasására szolgál.

Mi is pontosan a puffer? Vegyünk egy valós példát. A puffer olyan, mint egy kosár vagy bevásárlókosár egy szupermarketben. Ahelyett, hogy egyetlen cuccal odasétálnánk a pénztárhoz, kifizetnénk, beraknánk az autó csomagtartójába, majd visszajönnénk egy másik termékért, vehetünk egy bevásárlókocsit, beletehetünk mindent, amit csak akarunk, majd fizetünk. a pénztárnál. A puffer pontosan így működik: összegyűjti az adatokat, majd mindent elvesz és kiír, ahelyett, hogy minden töredéket külön írna.

A BufferedWriter osztály konstruktorai és metódusai

Most nézzük meg közelebbről a BufferedWriter osztályt. Két konstruktor létezik egy objektum létrehozására:


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

Ahol mindkét konstruktorban kint van az írandó adatfolyam, és sz , mint már említettük, a puffer mérete.

A BufferedWriter osztálynak is több metódusa van. Ma néhányat közelebbről megvizsgálunk:

írás(char[] tömb) Egy char tömböt ír a pufferbe
írás (String s, int off, int len) Egy karakterlánc egy részét a pufferbe írja
hozzáfűz (c karakter) Írjon egy karaktert a pufferbe
append (CharSequence csq, int kezdet, int vége) Egy tömb egy részét a pufferbe írja
új sor() Sorelválasztót ír
flush() Öblíti a patakot

Írjunk egy programot, amely értéket ír egy fájlba. AÍróparamétert, átadjuk aFileWritera kivitelezőnek. Szöveges fájlok írására szolgál, és számos konstruktorral rendelkezik az objektumok inicializálására:

Fájlíró (fájlfájl)
Fájlíró (fájlfájl, logikai hozzáfűzés)
Fájlíró (fájlleíró fd)
fájlíró (karakterlánc fájlnév)
fájlíró (karakterlánc fájlnév, logikai hozzáfűzés)

Példánkban egy olyan konstruktort fogunk használni, amely egy fájlnevet vesz fel:


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

Kódunk a write(String str) metódussal írja str a fájl.txt fájlba.

Vannak más módszerek is az írásra:

  • write(char[] array ) — ez a változat char tömböt fogad és ír;

  • write(String s, int off, int len) — ez a változat egy s karakterláncot vesz fel ; egy offset off , amely az írást indító karakter indexe; és len , amely a megírandó karakterlánc (alkarakterlánc) hossza.


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

Ez a kód "Hello, Amig"-t fog írni a fájlba, mivel azt mondtuk a metódusnak, hogy 11 karaktert írjon a 0 indextől kezdve.

Kódunknak van egy erőforrás-próba blokkja is:


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

Ez azt jelenti, hogy a close() metódus automatikusan meghívásra kerül a my-npuffereltWriterobjektum, mert megvalósítja az AutoCloseable felületet.

A kódban található flush() metódus a kimeneti adatfolyam kiürítésére szolgál, és az összes pufferelt bájtot ki kell írni. Az írás nem fordulhat elő e hívás nélkül, mivel ez jelzi, hogy a puffert ki kell üríteni, és a pufferelt bájtokat ki kell írni.

A BufferedWriter osztálynak van egy newLine() metódusa is, amely új sort ad az üzenetünkhöz:


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

A fájlban a következőket kapjuk:

Szia Amigo!
Ez egy nagyon fontos üzenet!

Az append() metódus aláírása így néz ki:


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

A csq hozzáadására szolgál . Itt a start az első karakter indexe, a vége pedig a beszúrandó karakterlánc (vagy részkarakterlánc) utolsó karakterének indexe. Az indexvégű karakter nincs beszúrva.


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

Ez a kód a következőket adja:

Helló,

Vagyis az append metódussal megadod, hogy a karakterlánc melyik részét adja hozzá a pufferhez.

Ha közelebbről megvizsgáljuk a write() és az append() közötti különbséget , először azt látjuk, hogy mindkettő ugyanazt csinálja elvileg – értékeket ír.

A különbség azonban az, hogy az append metódus újabb és egy CharSequence-t vesz fel argumentumként, és mivel a String a CharSequence-t valósítja meg , a Strings és StringBuilders , valamint a StringBuffers függvényeket átadhatjuk az append metódusnak. De a write() metódus csak egy karakterláncot fogad el .

Egyenlőre ennyi! Ma megismerkedtünk a pufferekkel, hogyan lehet pufferelt írást végrehajtani egy fájlba, és milyen módszerekkel lehet ezt megtenni.