JavaRush /Курси /JAVA 25 SELF /Класи File, Path, Files: огляд, створення об’єктів

Класи File, Path, Files: огляд, створення об’єктів

JAVA 25 SELF
Рівень 35 , Лекція 1
Відкрита

1. Клас File: як усе починалося

Хоч ми з вами вже зʼясували, що клас File краще не використовувати в нових проєктах, утім існує чимало легасі‑систем, у яких його досі застосовують. Тому важливо розуміти його й уміти з ним працювати. Клас File — застарілий спосіб подання файлу або каталогу на диску. Та не плутайте: обʼєкт File — це не сам файл, а лише «вказівник», своєрідний паспорт шляху. Наприклад, вираз File f = new File("hello.txt"); не створює файл на диску — ви лише описали шлях.

Як створити об’єкт File?

import java.io.File;

public class FileDemo {
    public static void main(String[] args) {
        File file = new File("example.txt"); // відносний шлях
        File folder = new File("mydir");     // каталог

        System.out.println("Абсолютний шлях: " + file.getAbsolutePath());
        System.out.println("Чи існує файл? " + file.exists());
        System.out.println("Це файл? " + file.isFile());
        System.out.println("Це каталог? " + folder.isDirectory());
    }
}

Що важливо памʼятати:
Створення обʼєкта File не створює файл на диску. Це просто «ярлик». Щоб файл реально зʼявився, потрібно явно ініціювати його створення (наприклад, записати дані або викликати file.createNewFile()).

Основні методи класу File

  • exists() — перевіряє, чи існує файл/каталог.
  • isFile() — це файл (а не каталог)?
  • isDirectory() — це каталог?
  • getAbsolutePath() — отримати абсолютний шлях.
  • length() — розмір файлу в байтах.
  • getName() — імʼя файлу або каталогу.
  • delete() — видалити файл/каталог (якщо порожній).

Приклад: виводимо інформацію про файл

File file = new File("example.txt");
System.out.println("Імʼя: " + file.getName());
System.out.println("Шлях: " + file.getAbsolutePath());
System.out.println("Розмір: " + file.length() + " байт");
System.out.println("Існує? " + file.exists());

2. Клас Path: сучасний погляд на файли

Path — складова нового файлового API (NIO.2, із Java 7). Це абстракція шляху до файлу або каталогу; причому шлях може бути не лише на локальному диску, а й, наприклад, усередині ZIP‑архіву або на віддаленому ресурсі (за наявності відповідного провайдера).

Якщо File — це стара паперова карта, то Path — GPS‑навігатор.

Як створити об’єкт Path?

import java.nio.file.Path;
import java.nio.file.Paths;

public class PathDemo {
    public static void main(String[] args) {
        Path path1 = Paths.get("example.txt"); // відносний шлях
        Path path2 = Paths.get("folder", "file.txt"); // об’єднуємо частини шляху

        System.out.println("Шлях 1: " + path1.toAbsolutePath());
        System.out.println("Шлях 2: " + path2.toAbsolutePath());
    }
}

Перевага: не потрібно думати про розділювачі. Paths.get підбере відповідний формат для вашої ОС.

Перетворення між File і Path

  • FilePath: file.toPath()
  • PathFile: path.toFile()
File file = new File("test.txt");
Path path = file.toPath();

Path anotherPath = Paths.get("data.txt");
File anotherFile = anotherPath.toFile();

Робота зі шляхами: resolve, relativize, normalize

Об’єднання шляхів (resolve)

Path dir = Paths.get("myfolder");
Path file = dir.resolve("notes.txt"); // myfolder/notes.txt
System.out.println(file); // myfolder/notes.txt

Відносний шлях (relativize)

Path pathA = Paths.get("folderA/file1.txt");
Path pathB = Paths.get("folderA/subfolder/file2.txt");
Path relative = pathA.relativize(pathB);
System.out.println(relative); // ../subfolder/file2.txt

Нормалізація шляху (normalize)

Path messy = Paths.get("folder/../folder/file.txt");
Path clean = messy.normalize();
System.out.println(clean); // folder/file.txt

Приклад: будуємо шлях до файлу

Path home = Paths.get(System.getProperty("user.home"));
Path docs = home.resolve("Documents");
Path myFile = docs.resolve("myfile.txt");
System.out.println("Шлях до файлу: " + myFile.toAbsolutePath());

3. Клас Files: ваш швейцарський ніж

Клас Files із пакета java.nio.file — утилітний набір статичних методів для роботи з файлами та каталогами на основі Path. Він уміє майже все: перевіряти існування, створювати/видаляти, читати/записувати, копіювати/переміщати, отримувати атрибути й обходити дерево каталогів.

Основні методи класу Files

  • Files.exists(path) — перевіряє, чи існує файл/каталог.
  • Files.isDirectory(path) — це каталог?
  • Files.size(path) — розмір файлу.
  • Files.createFile(path) — створити файл.
  • Files.createDirectory(path) — створити каталог.
  • Files.delete(path) — видалити файл/каталог.
  • Files.copy(src, dest) — скопіювати файл.
  • Files.move(src, dest) — перемістити/перейменувати.
  • Files.getLastModifiedTime(path) — час останньої зміни.
  • Files.readAllBytes(path) — прочитати весь файл у масив байтів.
  • Files.readAllLines(path) — прочитати всі рядки текстового файлу.
  • Files.write(path, bytes) — записати байти у файл.

Приклад: перевіряємо файл

import java.nio.file.*;

public class FilesDemo {
    public static void main(String[] args) {
        Path path = Paths.get("example.txt");

        System.out.println("Файл існує? " + Files.exists(path));
        System.out.println("Це каталог? " + Files.isDirectory(path));

        if (Files.exists(path)) {
            try {
                System.out.println("Розмір файлу: " + Files.size(path) + " байт");
            } catch (Exception e) {
                System.out.println("Помилка під час отримання розміру: " + e.getMessage());
            }
        }
    }
}

4. Практика: створюємо об’єкти, виводимо властивості

Створюємо об’єкти для файлу й каталогу

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CompareDemo {
    public static void main(String[] args) {
        // Старий спосіб
        File oldFile = new File("test.txt");
        File oldDir = new File("mydir");

        // Новий спосіб
        Path newFile = Paths.get("test.txt");
        Path newDir = Paths.get("mydir");

        System.out.println("=== File API ===");
        System.out.println("Файл: " + oldFile.getAbsolutePath());
        System.out.println("Існує? " + oldFile.exists());
        System.out.println("Це файл? " + oldFile.isFile());
        System.out.println("Це каталог? " + oldDir.isDirectory());

        System.out.println("\n=== Path API ===");
        System.out.println("Файл: " + newFile.toAbsolutePath());
        System.out.println("Існує? " + java.nio.file.Files.exists(newFile));
        System.out.println("Це файл? " + java.nio.file.Files.isRegularFile(newFile));
        System.out.println("Це каталог? " + java.nio.file.Files.isDirectory(newDir));
    }
}

Виводимо властивості файлу

import java.nio.file.*;

public class FileProperties {
    public static void main(String[] args) {
        Path path = Paths.get("test.txt");

        System.out.println("Абсолютний шлях: " + path.toAbsolutePath());
        System.out.println("Імʼя файлу: " + path.getFileName());
        System.out.println("Батьківський каталог: " + path.getParent());

        if (Files.exists(path)) {
            try {
                System.out.println("Розмір: " + Files.size(path) + " байт");
                System.out.println("Остання зміна: " + Files.getLastModifiedTime(path));
            } catch (Exception e) {
                System.out.println("Помилка під час отримання інформації: " + e.getMessage());
            }
        } else {
            System.out.println("Файл не знайдено.");
        }
    }
}

5. Порівняння: File vs Path/Files

Можливість File (java.io) Path + Files (java.nio.file)
Подання шляху Лише локальний диск Локальний диск, ZIP, мережеві ресурси
Об’єднання шляхів Ручне з’єднання через косі риски Зручно за допомогою resolve
Перевірка існування exists() Files.exists(path)
Читання/запис вмісту Ні Так (Files.readAll..., Files.write)
Отримання атрибутів Базові (length(), lastModified()) Розширені атрибути та подання
Сумісність З усіма версіями Java Java 7 і вище
Робота із символічними посиланнями Обмежено Повна підтримка

Коротко: коли що використовувати?

  • Для нових проєктів — використовуйте Path і Files.
  • Для підтримки старого коду — іноді доведеться працювати з File.

6. Корисні нюанси

Відносні й абсолютні шляхи

Відносний шлях — це шлях відносно поточного робочого каталогу; абсолютний — повний шлях від кореня файлової системи.

Path relative = Paths.get("data", "file.txt");
Path absolute = relative.toAbsolutePath();
System.out.println("Абсолютний шлях: " + absolute);

Кросплатформеність

Path і Files враховують особливості ОС (роздільники, кодування тощо). Не вказуйте шляхи вручну на кшталт "C:\\folder\\file.txt" — використовуйте Paths.get і resolve.

Перетворення між File і Path

Якщо у вас є старий код на File, легко перейти на нове API:

File legacy = new File("legacy.txt");
Path modern = legacy.toPath();
if (Files.exists(modern)) {
    // Тепер можна використовувати всі можливості NIO.2
}

Перевірка існування файлу

Path path = Paths.get("notes.txt");
if (Files.exists(path)) {
    System.out.println("Файл знайдено!");
} else {
    System.out.println("Файл не існує.");
}

7. Міні‑практика: створюємо й перевіряємо файл і каталог

import java.nio.file.*;

public class MiniPractice {
    public static void main(String[] args) throws Exception {
        Path dir = Paths.get("demo_dir");
        Path file = dir.resolve("hello.txt");

        // Створюємо каталог, якщо його немає
        if (!Files.exists(dir)) {
            Files.createDirectory(dir);
            System.out.println("Каталог створено: " + dir.toAbsolutePath());
        }

        // Створюємо файл, якщо його немає
        if (!Files.exists(file)) {
            Files.createFile(file);
            System.out.println("Файл створено: " + file.toAbsolutePath());
        }

        // Виводимо властивості
        System.out.println("Файл існує? " + Files.exists(file));
        System.out.println("Це файл? " + Files.isRegularFile(file));
        System.out.println("Розмір: " + Files.size(file) + " байт");

        // Видаляємо файл і каталог (за бажанням)
        Files.delete(file);
        Files.delete(dir);
        System.out.println("Файл і каталог видалено.");
    }
}

8. Типові помилки під час роботи з File/Path/Files

Помилка № 1: Плутанина між File і Path. Багато новачків намагаються використовувати методи Files з обʼєктом File. Памʼятайте: Files.* працює з Path. Якщо у вас є File, спочатку зробіть file.toPath().

Помилка № 2: Очікування, що створення об’єкта File або Path створює файл. Об’єкт шляху — це ярлик, а не реальний файл. Для створення використовуйте Files.createFile(path) або запис даних.

Помилка № 3: Ручне складання шляхів рядком. Не пишіть "folder/file.txt" або "folder\\file.txt". Використовуйте Paths.get(...) і resolve(...). Це безпечніше й кросплатформно.

Помилка № 4: Ігнорування винятків. Операції з файлами викидають IOException та інші винятки. Обробляйте їх через try-catch або передайте вище (throws).

Помилка № 5: Перевірка через File.exists(), а потім робота через Path. Намагайтеся дотримуватися одного стилю: почали з Path — використовуйте Files.exists(path) та інші методи Files.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ