1. Wprowadzenie
W programowaniu niemal zawsze trzeba pracować z plikami. Przykłady zna każdy: zapisywanie tekstu notatki, postępu w grze, kopiowanie obrazu lub odczyt ustawień z pliku konfiguracyjnego.
W Javie są nowoczesne i wygodne narzędzia: Path i Files z pakietu java.nio.file. Pozwalają w kilku linijkach kodu otworzyć plik, odczytać jego zawartość, zapisać tekst, a nawet skopiować obraz.
Ścieżka do pliku (Path)
Plik zawsze leży gdzieś na dysku, a aby się do niego odwołać, trzeba wskazać ścieżkę. W tym celu w Javie istnieje klasa Path, a nowy obiekt można utworzyć metodą Path.of().
Path path = Path.of("hello.txt"); // ścieżka względna
Path absPath = Path.of("C:/Users/Me/image.png"); // ścieżka bezwzględna (Windows)
Wyjaśnienie:
- Ścieżka względna szuka pliku w bieżącym folderze projektu (np. "hello.txt").
- Ścieżka bezwzględna wskazuje pełny adres: dysk, foldery i nazwę pliku.
2. Praca z plikami tekstowymi
Z punktu widzenia Javy wszystkie pliki dzielą się na 2 typy — tekstowe i binarne. Jeśli zawartość można przedstawić jako tekst zrozumiały dla człowieka — to plik tekstowy. We wszystkich pozostałych przypadkach — to po prostu zestaw bajtów (plik binarny).
Zapis tekstu do pliku — writeString
Aby zapisać ciąg znaków do pliku, używamy metody writeString.
Path p = Path.of("hello.txt");
Files.writeString(p, "Cześć, pliku!");
Co się tu stało:
- tworzymy obiekt Path wskazujący na "hello.txt";
- metodą writeString zapisujemy tam ciąg znaków;
- jeśli pliku nie było, zostanie utworzony automatycznie.
W ten sposób można łatwo zapisywać notatki lub wiadomości do pliku tekstowego.
Odczyt tekstu z pliku — readString
Metoda readString pozwala wczytać cały plik od razu do łańcucha znaków.
Path p = Path.of("hello.txt");
String content = Files.readString(p);
System.out.println(content);
Teraz w zmiennej content znajduje się zawartość pliku. To wygodne dla niewielkich plików: plików konfiguracyjnych, tekstów, dokumentów JSON.
3. Praca z plikami binarnymi
Nie wszystkie pliki składają się z tekstu. Obrazy, muzyka, archiwa — to zbiory bajtów. Do pracy z nimi służą metody write i readAllBytes.
Zapis bajtów do pliku — write
Metoda write() pozwala zapisać do pliku tablicę bajtów. Nazywa się go też buforem (byte buffer).
byte[] data = {65, 66, 67, 68}; // znaki A B C D
Files.write(Path.of("letters.bin"), data);
Tutaj zapisaliśmy do pliku tablicę bajtów. Jeśli otworzyć plik jako tekst, w środku będą litery "ABCD".
Odczyt bajtów — readAllBytes
Aby z powrotem uzyskać zawartość pliku w postaci tablicy bajtów, użyjemy metody readAllBytes.
byte[] buffer = Files.readAllBytes(Path.of("letters.bin"));
// wypisujemy odczytaną tablicę bajtów na ekran
for (byte b : buffer)
{
System.out.print((char)b + " ");
}
Na ekranie pojawi się:
A B C D
Taki sposób używa się do pracy z dowolnymi plikami binarnymi — obrazami, dokumentami, muzyką.
4. Popularne scenariusze pracy z plikami
Najpopularniejszy scenariusz pracy z plikami to chyba kopiowanie pliku.
Kopiowanie plików
Aby skopiować plik, można po prostu odczytać go do tablicy bajtów i zapisać do innego pliku.
Path in = Path.of("logo.png");
Path out = Path.of("logo_copy.png");
byte[] bytes = Files.readAllBytes(in);
Files.write(out, bytes);
W ten sposób można kopiować obrazy, dokumenty i dowolne inne pliki, nie martwiąc się o ich format.
Sprawdzanie istnienia i rozmiaru
Czasami trzeba upewnić się, że plik istnieje, i poznać jego rozmiar. Służą do tego metody exists i size.
Path p = Path.of("hello.txt");
if (Files.exists(p))
{
long size = Files.size(p);
System.out.println("Plik znaleziony, rozmiar: " + size + " bajtów");
}
else
{
System.out.println("Plik nie znaleziony!");
}
To przydatne do diagnostyki: będziesz dokładnie wiedzieć, czy pracujesz z właściwym plikiem.
5. Wyjątki
Praca z plikami może zakończyć się błędem: pliku nie ma, brak uprawnień, dysk jest pełny albo plik jest zajęty przez inny program. Dlatego należy otaczać operacje dyskowe blokiem try-catch, lub propagować wyjątki na zewnątrz za pomocą throws.
try
{
String content = Files.readString(Path.of("hello.txt"));
System.out.println(content);
}
catch (IOException e)
{
System.out.println("Błąd podczas odczytu: " + e.getMessage());
}
Dzięki temu program nie „wywali się”, lecz grzecznie poinformuje użytkownika, co się stało. W razie potrzeby można przekazać wyjątek IOException dalej w stosie metodą ze słowem kluczowym throws.
GO TO FULL VERSION