Ciąg dalszy wątku zapisu do pliku...następuje 😀! Materiał będący kontynuacją zagadnienia o klasie "FileWriter" w języku Java, będzie przedstawiać klasę o podobnej nazwie - "BufferedWriter". Dowiesz się dlaczego buforowanie danych jest istotne w procesie zapisu do pliku, także zapraszam 😁!
"BUFFEREDWRITER" W JĘZYKU JAVA POSIADA SWOJĄ TAJNĄ BROŃ
W artykule o "FileWriter" napisałem, że jego "piętą achillesową" jest zapisywanie do pliku na bieżąco, co każde wywołanie metody "write". W tej klasie, użycie metody "write" nie powoduje natychmiastowego wpisania czegoś do pliku, tylko informacja najpierw jest trafiana do bufora, a dopiero potem do pliku 💪.
Bufor jest tymczasowym składzikiem do przechowywania danych, który służy jako pośrednik do przekazywania informacji z punktu A do punktu B, a on jakby "stoi" pomiędzy. Z punktu A coś trafia do bufora, a on jak dostanie sygnał, że należy przenieść informacje, to wtedy dopiero przekazuje je do punktu B 👍.
"BufferedWriter" w języku Java tak właśnie postępuje z plikiem. Kiedy wywołujesz metodę "write", to podany łańcuch najpierw ląduje do bufora. Następnie w drodze kolejnych przesyłów informacji on się wypełnia i przyjmuje dane tak długo, aż się wyczerpie 💥. W takiej sytuacji, faktyczny zapis do pliku następuje dopiero wtedy, jak bufor się napełni i musi zostać opróżniony bądź użytkownik wywoła metodę "close" lub "flush". Dzięki takiemu podejściu, ograniczamy liczbę operacji zapisu do minimum ✅.
Z powodu wyżej opisanego działania, możesz nie ujrzeć danych w pliku, gdy program zakończy swoje działanie i zapomniałeś(-aś) zamknąć strumień metodą "close".
Tyle teorii, a teraz zerknijmy na kod 🙂.
OD STRONY KODU
"BufferedWriter" w języku Java wymaga podania w konstruktorze obiektu typu "Writer" np. poznany "FileWriter" (możemy osadzić go wewnątrz, gdyż nie będziemy wcale z niego korzystać):
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("test.txt"));
Ponieważ wymaga obiektu klasy "Writer", a ona może zgłosić wyjątek "IOException", musimy otoczyć wszystko blokiem "try-catch":
try {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("test.txt"));
bufferedWriter.close();
} catch (Exception exception) {
exception.printStackTrace();
}
Metoda "close" na końcu 🙂. Teraz kompilator nie będzie miał żadnych przeciwwskazań. Mamy prawo ustawić sobie rozmiar bufora wyrażany w liczbie znaków (drugi parametr w kolejności):
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("test.txt"), 4096);
Domyślnie, wg wielu źródeł, przyjmuje wartość 8192 znaków i tyle na potrzeby nauki programowania w zupełności wystarcza 😄.
PRZYKŁADOWE METODY
Metody występujące w "BufferedWriter" w języku Java jakie warto znać, nie różnią się od wspomnianych podczas tłumaczenia klasy "FileWriter", lecz dorzucę dwie jakie nie występują, a które mogą się przydać:
NEWLINE
"newLine" odpowiada naszemu wciśnięciu klawisza Enter podczas pisania tekstu w dokumencie. To jest przejście do następnego wiersza:
bufferedWriter.newLine();
Metoda dodatkowo zapewnia, że to zadziała niezależnie od systemu operacyjnego, dlatego warto w tym przypadku odejść od znaku "ucieczki" ('\n') i skorzystać z metody ✔️.
WRITE
Na dokładkę dodatkowa (przeciążona) wersja metody "write", która pozwala na przekazanie łańcucha i "przycięcie" go z dwóch stron podając dwie liczby całkowite (od którego indeksu i ile znaków):
bufferedWriter.write("Łańcuch", 1, 5);
W pliku znajdzie się "ańcuc" - przycięcie o jeden znak od początku i długość równa 5 znaków. Reszta działania jest taka sama.
"BufferedWriter" dzięki swojemu buforowi, jest w stanie zoptymalizować proces zapisywania danych do pliku zlecając tę operację tylko w sytuacji, gdy bufor musi zostać opróżniony lub poprzez zamknięcie pliku.
To by było tyle. "BufferedWriter" w języku Java wymagało wyjaśnienia bardziej teoretycznego, bo w kodzie możesz nie zobaczyć tej różnicy w buforowaniu informacji, jednak zawsze można porównać obie klasy i jak wychodziłoby to przy dużym zbiorze danych 😉. Jak będziesz potrzebować zapisu do pliku, rozważ skorzystanie z tego podejścia 👍.