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, 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:
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:
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.
GO TO FULL VERSION