Bardzo często w programach istnieje wymóg szybkiego zapisu danych do pliku lub innych źródeł. I w takich przypadkach pojawia się pytanie: czego użyć, jaką klasę wybrać? Dzisiaj przyjrzymy się jednemu z „kandydatów” do tej roli, klasie BufferedWriter .

Do czego służy BufferedWriter?

BufferedWriter to klasa, która zapisuje buforowane znaki do strumienia. Pozwala na ograniczenie ilości danych, do których dostęp mają fizyczne nośniki. Oznacza to, że zamiast za każdym razem zapisywać osobny znak, zapisuje te dane do bufora, a następnie zapisuje wszystkie te znaki do źródła.

To znacznie zwiększa szybkość zapisu danych. Domyślnie rozmiar bufora wynosi 8192 znaków, ale można to zmienić, określając nowy rozmiar w konstruktorze:


BufferedWriter(Writer in, int sz)

Tutaj pierwszym argumentem konstruktora jest strumień, odbiornik, do którego nastąpi nagrywanie. A wartość sz to po prostu definicja nowego rozmiaru bufora.

Java ma również klasę BufferedReader : służy do buforowanego odczytu danych.

Czym właściwie jest bufor? Weźmy przykład z życia wzięty. Bufor jest jak koszyk lub wózek w supermarkecie. Zamiast iść po towar, zanieść go do kasy, zapłacić, włożyć do bagażnika samochodu i wrócić po kolejny, możemy wziąć wózek, włożyć wszystko, czego potrzebujemy i zapłacić przy kasie. Dokładnie tak działa bufor: zbierze twoje dane, a następnie weźmie wszystko i zapisze, zamiast zapisywać każdy fragment osobno.

Konstruktory i metody klasy BufferedWriter

Przyjrzyjmy się teraz bliżej klasie BufferedWriter . Istnieją dwa konstruktory do tworzenia obiektu:


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

Gdzie out w obu konstruktorach jest źródłem zapisu, a sz , jak wspomniano, jest rozmiarem bufora.

Klasa BufferedWriter ma również wiele metod. Przyjrzyjmy się bliżej niektórym z nich dzisiaj:

write(char[]tablica) Zapisze tablicę znaków w buforze
write(String s, int off, int len) Zapisz część łańcucha do bufora
dołącz (znak c) Zapisz znak do bufora
append(CharSequence csq, int start, int end) Zapisz część tablicy do bufora
Nowa linia() Dzieli łańcuch
spłukać() resetuje strumień

Napiszmy program, który zapisze nam wartość do pliku. Jako obiektPisarzprzejść do konstruktoraFileWriter. Służy do pisania plików tekstowych i ma kilka konstruktorów do inicjalizacji obiektów:

FileWriter(Plik plik)
FileWriter(Plik plik, dołączenie boolowskie)
FileWriter(FileDescriptor fd)
FileWriter(ciąg znaków nazwa_pliku)
FileWriter(ciąg znaków nazwa_pliku, dołączenie boolowskie)

W naszym przykładzie używamy konstruktora, który pobiera nazwę pliku:


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

Nasz kod, używając metody write(String str) , zapisze wiadomości str do pliku file.txt .

Istnieją inne metody nagrywania:

  • write(char[] array ) - akceptuje i zapisuje tablicę znaków ;

  • write(String s, int off, int len) pobiera łańcuch s , off jest indeksem łańcucha, od którego ma się rozpocząć pisanie, a len jest długością łańcucha (podłańcuchem), który ma zostać zapisany.


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

Ten kod zapisze do pliku: „Hello, Amig”, jak zaznaczyliśmy, aby napisać 12 znaków, zaczynając od indeksu 0.

W naszym kodzie znajdują się również zasoby try-with :


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

Oznacza to, że dla mojego obiektubuforowany zapisMetoda close() jest wywoływana automatycznie, ponieważ implementuje interfejs AutoCloseable .

Metoda flush() w kodzie służy do opróżniania strumienia wyjściowego i zapisywania wszystkich buforowanych bajtów. Bez wywołania tej metody zapis może nie nastąpić, ponieważ wskazuje, że bufor powinien zostać opróżniony i zapisane z niego bajty.

Również w klasie BufferedWriter znajduje się taka metoda jak newLine() , która doda nową linię do naszej wiadomości:


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

W pliku otrzymujemy:

Hej Amigo!
To bardzo ważna wiadomość!

Sygnatura metody append() wygląda następująco:


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

Służy do dodawania csq . Tutaj start jest indeksem pierwszego znaku, a koniec jest indeksem ostatniego znaku ciągu (podciągu), który ma zostać wstawiony, przy czym ostatni znak nie jest wstawiany.


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

Uruchamiając ten kod, otrzymasz:

Cześć

Oznacza to, że za pomocą metody append określasz, która część łańcucha ma zostać dodana do bufora.

Jeśli przyjrzymy się bliżej różnicy między write() i append() , to w zasadzie obie wykonują to samo zadanie: zapisują wartości.

Ale nadal różnica polega na tym, że metoda append jest nowsza i przyjmuje CharSequence jako argument , a ponieważ String jest implementacją CharSequence , możesz umieścić zarówno String , StringBuilder , jak i StringBuffer w append . Cóż, tylko String jest dozwolony w metodzie write() .

To wszystko! Dzisiaj zapoznaliśmy się z buforem, sposobem wykonywania buforowanego zapisu do pliku, a także metodami, za pomocą których można to zrobić.