W tym artykule napomknę o tym, jak zapis do pliku tekstowego w języku Java jest przeprowadzany krok po kroku przy użyciu klasy "FileWriter". Mile widziana znajomość przechwytywania wyjątków, bo dotkniemy operacji, która może się nie powieść 😳! Zapraszam po wyjaśnienia do środeczka 😉!
ZAPIS DO PLIKU TEKSTOWEGO ZA POMOCĄ "FILEWRITER" W JĘZYKU JAVA, WYMAGA UŻYCIA STRUMIENI
Strumień w informatyce to przepływ danych, do którego przypisywane jest tzw. źródło, czyli dane wejściowe (np. plik, z którego odczytujemy informacje) bądź miejsce docelowe, czyli dane wyjściowe (np. plik, w którym umieszczamy informacje). "FileWriter" jest jednym ze strumieni wyjściowych (dziedziczy po klasie "OutputStreamWriter"), co oznacza że dopisujemy do pliku informacje, a nie odczytujemy je z niego.
MUSICIE SIĘ BLIŻEJ POZNAĆ 😄
Wpierw zapoznam Cię z konstruktorem:
FileWriter fileWriter = new FileWriter("file.txt");
Jako łańcuch znaków podajemy ścieżkę do pliku rozumianą jako: ścieżka (opcjonalnie) + nazwa pliku + rozszerzenie. Możemy to sobie rozbić na "File" i przekazać tam obiekt:
File file = new File("file.txt");
FileWriter fileWriter = new FileWriter(file);
Tu jest tylko taka lipa, że jak podamy katalog, który nie istnieje, to wyrzuci wyjątek "FileNotFoundException" (nie utworzy katalogu, jak możesz myśleć) 😞. "File" będzie przedmiotem dyskusji w innym artykule. Żeby móc z tego korzystać, należy zaimportować poniższe pakiety:
import java. io.File;
import java. io.FileWriter;
TO PO PROSTU TRZEBA WIEDZIEĆ
Wywołując konstruktor "FileWriter" z pojedynczym parametrem, pamiętaj o tym, że jeżeli plik o podanej ścieżce już istnieje, to zostanie on nadpisany i nikt Cię nie uprzedzi o zamianie pliku na "czystą kartkę". To oznacza, że jak program nie znajdzie pliku o podanej nazwie, to utworzy go, a jak znajdzie, to nadpisze!
Jeżeli chcesz, aby strumień dopisywał pliki bez utraty tamtych informacji, dopisz drugi parametr typu logicznego ("boolean") jako "true":
FileWriter fileWriter = new FileWriter("file.txt", true);
PODSTAWOWE METODY KLASY "FILEWRITER"
"FileWriter" w języku Java jest klasą potomną klasy "Writer". Aby móc skorzystać z potencjału jaki nosi i zobaczyć na własne oczy jak do pliku są wpisywane dane, trzeba poznać jej 3 podstawowe metody, choć jest ich nieco więcej (link do dokumentacji).
CLOSE
Zapamiętaj świętą zasadę podczas korzystania ze strumieni w tym i w każdym innym języku: zawsze zamykaj go, jak skończysz na nim operować! Tutaj robisz to przy pomocy metody "close":
fileWriter.close();
Wywołanie tej metody jest jednoczesnym zadeklarowaniem z Twojej strony, że skończyłeś(-aś) operować na pliku. Nie wolno Ci o tym zapomnieć! Jeżeli nie zamkniesz strumienia, możesz mieć problemy z dalszą obsługą tego pliku, nawet po zakończeniu działania Twojej aplikacji ☝. Może się zdarzyć, że system operacyjny np. nie będzie w stanie go usunąć, bo uzna że jakaś aplikacja (w tym wypadku Twoja) blokuje taką możliwość 🛑!
WRITE
Operacja podstawowa "FileWriter" w języku Java, czyli metoda do zapisu danej do pliku:
fileWriter.write("Tekst");
Najbardziej "naturalne" dla pliku tekstowego typy danych to łańcuchy znaków ("string") i pojedyncze znaki ("char"). Choć istnieje przeciążona wersja metody akceptująca "int":
fileWriter.write(121);
to pisząc w ten sposób nie ujrzysz w pliku liczby 121, tylko znak małej litery 'y', bo zostanie to zinterpretowane jako kod znaku w systemie ASCII 🙂. Trzeba zrobić tak:
fileWriter.write(String.valueOf(121));
czyli konwersja na łańcuch znaków i przekazanie do strumienia w takiej postaci.
FLUSH
Ostatnią metodą z tych podstawowych jest "flush":
fileWriter.flush();
To służy do opróżnienia bufora i przekazania danych do pliku. Należy być świadomym, że "FileWriter" jest "ubogi" w kwestii buforowania, ponieważ tutaj za każdym razem gdy wywołujemy metodę "write", od razu wykonuje się zapis do pliku. Dlatego najlepiej skorzystać z klasy "BufferedWriter", która ogranicza liczbę tych operacji do minimum, a zapis wykonuje się dopiero po wypełnieniu bufora albo wywołaniu metody "close".
TO SIĘ MOŻE NIE UDAĆ, WIĘC...
...więc "FileWriter" w języku Java musisz osadzić wewnątrz bloku "try-catch", bo kompilator nie dopuści do kompilacji bez Twojego oświadczenia, że wiesz, że to może się posypać:
try {
FileWriter fileWriter = new FileWriter("file.txt");
fileWriter.close();
} catch (Exception exception) {
exception.printStackTrace();
}
PLIK TEKSTOWY, A SERIALIZACJA
Dosłownie parę zdań o tym. Nie chcę, żebyś utożsamiał(a) zapis do pliku tekstowego z procesem serializacji. Do pliku tekstowego mogą wlecieć różne dane i wartości, natomiast nie ma szans wklepania tam obiektu jako obiektu (czyli instancji klasy). Wtedy na scenę wchodzi serializacja, czyli proces zamiany składowych obiektu na skończony strumień bajtów. Kolokwialnie nazywa się to "mieleniem" obiektów 😆.
Zatem, plik tekstowy jest git do przypisywania wartości różnym danym w formie "jedna dana, jedna wartość". Natomiast, żeby móc "ożywić" obiekt jako cały byt ze wszystkimi jego składowymi, to wtedy musi wejść serializacja.
Wniosek do wyciągnięcia brzmi tak: zaletą umieszczenia danych w pliku tekstowym jest możliwość łatwego ich wydobycia przez każdą inną aplikację np. napisaną w innym języku niż Java. Wada jest widoczna na pierwszy rzut oka – możliwość grzebania w treści z użyciem dowolnej aplikacji do edycji plików tekstowych :). Serializacja ma odwrotnie – chroni przed edycją z zewnątrz, jednak inne języki nie są w stanie zinterpretować poprawnie formatu jaki język Java może bez problemu odczytać 😉.
"FileWriter" tworzy strumień wyjściowy do wskazanego pliku, co w gruncie rzeczy umożliwia (ograniczony) zapis informacji do pliku.
To tyle z podstawowych informacji. "FileWriter" w języku Java jest pierwszym szczeblem procesu zapisywania informacji w pliku zewnętrznym. Z tej klasy biorą się inne o większych możliwościach, takich jak zapisywanie innych typów danych czy szyfrowanie poprzez zapis binarny. Spoko, wszystko przemyślane. Trzeba tylko sięgnąć po wiedzę i się dowiedzieć 😎!