CodeGym /Kursy /JAVA 25 SELF /Wprowadzenie do plików i obrazów

Wprowadzenie do plików i obrazów

JAVA 25 SELF
Poziom 12 , Lekcja 3
Dostępny

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:

  1. tworzymy obiekt Path wskazujący na "hello.txt";
  2. metodą writeString zapisujemy tam ciąg znaków;
  3. 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.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION