JavaRush /Курси /JAVA 25 SELF /Створення та видалення файлів і папок

Створення та видалення файлів і папок

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

1. Створення файлів

Створювати файли програмно доводиться часто: для логів, тимчасових даних, експорту звітів, імпорту даних, збереження налаштувань та багато чого іншого. У Java для цього, як ви, мабуть, уже здогадалися, найкраще використовувати сучасний API — java.nio.file.

Основний інструмент: Files.createFile(Path)

Цей метод створює новий файл за вказаним шляхом. Якщо файл уже існує, буде викинуто виняток.

Приклад: створюємо текстовий файл у поточній папці

import java.nio.file.*;

public class CreateFileExample {
    public static void main(String[] args) {
        Path path = Path.of("hello.txt");
        try {
            Files.createFile(path);
            System.out.println("Файл створено: " + path.toAbsolutePath());
        } catch (FileAlreadyExistsException e) {
            System.out.println("Файл вже існує: " + path);
        } catch (Exception e) {
            System.out.println("Помилка під час створення файлу: " + e.getMessage());
        }
    }
}

Зверніть увагу:
Files.createFile викидає FileAlreadyExistsException, якщо файл уже є. Тому часто перед створенням файлу перевіряють його існування.

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

Path path = Path.of("hello.txt");
if (!Files.exists(path)) {
    Files.createFile(path);
}

Порада:
Перевірка існування файлу — це не захист від умов гонки між потоками, але для більшості користувацьких сценаріїв — цілком робочий підхід.

Коротко: що відбувається під час створення файлу?

  • Якщо файл не існує і шлях коректний — створюється новий порожній файл.
  • Якщо файл уже є — викидається виняток.
  • Якщо шлях некоректний, немає прав або папка не існує — буде викинуто інший виняток (IOException, NoSuchFileException тощо).

2. Створення папок

Різниця між Files.createDirectory і Files.createDirectories

  • Files.createDirectory(Path) — створює лише одну папку. Якщо батьківської папки немає — буде помилка.
  • Files.createDirectories(Path) — створює весь ланцюжок відсутніх папок (немов чарівник, який будує драбину просто під ногами).

Приклад: створюємо одну папку

Path dir = Path.of("data");
try {
    Files.createDirectory(dir);
    System.out.println("Папку створено: " + dir.toAbsolutePath());
} catch (FileAlreadyExistsException e) {
    System.out.println("Папка вже існує: " + dir);
} catch (Exception e) {
    System.out.println("Помилка під час створення папки: " + e.getMessage());
}

Приклад: створюємо структуру вкладених папок

Path nested = Path.of("data/reports/2024");
try {
    Files.createDirectories(nested);
    System.out.println("Структуру папок створено: " + nested.toAbsolutePath());
} catch (Exception e) {
    System.out.println("Помилка під час створення структури: " + e.getMessage());
}

Зверніть увагу: якщо якась із папок вже існує, createDirectories — це не проблема: він просто створює відсутні. Якщо використати createDirectory для вкладеної папки, а батьківської ще немає — буде помилка.

Таблиця: порівняння методів створення папок

Метод Створює лише одну папку Створює вкладені папки Не завершується помилкою, якщо частина вже існує
createDirectory
createDirectories

3. Видалення файлів

Видаляти файли — майже як викидати сміття: головне — не викинути щось потрібне! У Java для цього є два основних методи:

  • Files.delete(Path) — видаляє файл або порожню папку. Якщо файлу немає — буде виняток.
  • Files.deleteIfExists(Path) — видаляє файл; якщо ж його немає — просто нічого не робить.

Приклад: видаляємо тимчасовий файл

Path tempFile = Path.of("temp.txt");
try {
    Files.delete(tempFile);
    System.out.println("Файл видалено: " + tempFile);
} catch (NoSuchFileException e) {
    System.out.println("Файл не знайдено: " + tempFile);
} catch (DirectoryNotEmptyException e) {
    System.out.println("Папка не порожня: " + tempFile);
} catch (Exception e) {
    System.out.println("Помилка під час видалення: " + e.getMessage());
}

Безпечніший варіант

boolean deleted = Files.deleteIfExists(tempFile);
if (deleted) {
    System.out.println("Файл було видалено.");
} else {
    System.out.println("Файл не знайдено — видаляти нічого.");
}

Важливо!

  • Якщо файл відкрито в іншій програмі — може бути викинуто виняток (наприклад, у Windows).
  • Якщо спробувати видалити папку, яка не порожня — буде помилка DirectoryNotEmptyException.

4. Видалення папок

Папки в Java видаляємо приблизно так само, як і файли. З одним нюансом: стандартні методи видаляють тільки порожні папки.

Приклад: видаляємо порожню папку

Path emptyDir = Path.of("empty_folder");
try {
    Files.delete(emptyDir);
    System.out.println("Папку видалено: " + emptyDir);
} catch (DirectoryNotEmptyException e) {
    System.out.println("Папка не порожня: " + emptyDir);
} catch (NoSuchFileException e) {
    System.out.println("Папку не знайдено: " + emptyDir);
} catch (Exception e) {
    System.out.println("Помилка під час видалення папки: " + e.getMessage());
}

Що робити з непорожніми папками?

Для видалення непорожніх папок потрібно рекурсивно видалити всі вкладені файли та підпапки. Це тема для окремої лекції (і окремої пригоди), але якщо вже кортить — тримайте код, розбирайтеся й спробуйте відтворити:

import java.nio.file.*;
import java.io.IOException;

public class DeleteDirectoryRecursively {
    public static void deleteRecursively(Path path) throws IOException {
        if (Files.isDirectory(path)) {
            try (var entries = Files.list(path)) {
                for (Path entry : entries.toList()) {
                    deleteRecursively(entry);
                }
            }
        }
        Files.delete(path);
    }
}

Увага:
Цей код видалить усе, що міститься всередині папки! Використовуйте обережно.

5. Практичні поради

Перевірка існування перед видаленням

if (Files.exists(path)) {
    Files.delete(path);
} else {
    System.out.println("Файл/папка не існує.");
}

Але якщо використовуєте deleteIfExists, робити це не обов’язково.

Обробка винятків

Під час роботи з файлами ми часто стикаємося з неочікуваними ситуаціями. Java для цього викидає різні винятки:

  • NoSuchFileException — файл або папка не знайдені. Наприклад, ви намагаєтеся відкрити те, що вже видалили.
  • DirectoryNotEmptyException — ви хочете видалити папку, а всередині неї ще щось є.
  • IOException — загальна помилка вводу/виводу: щось пішло не так. Причина може бути різною — немає прав доступу, файл зайнятий іншою програмою, шлях некоректний.

Візуальна схема: основні методи

+-------------------+         +--------------------+
| Files.createFile  | ---->   |    Новий файл      |
+-------------------+         +--------------------+

+---------------------+       +--------------------+
| Files.createDirectory|----> |    Нова папка      |
+---------------------+       +--------------------+

+-------------------+         +--------------------+
| Files.delete      | ---->   |  Файл/папку видалено |
+-------------------+         +--------------------+

(але лише якщо папка порожня!)

6. Типові помилки під час створення та видалення файлів і папок

Помилка № 1: Намагаємося створити файл/папку, яка вже існує. Методи Files.createFile і Files.createDirectory викидають виняток, якщо об’єкт уже є. Рішення — перевіряти існування заздалегідь або перехоплювати виняток.

Помилка № 2: Намагаємося створити вкладену папку через createDirectory, а батьківської ще немає. У цьому разі буде помилка NoSuchFileException. Використовуйте createDirectories для створення ланцюжка папок.

Помилка № 3: Намагаємося видалити непорожню папку через Files.delete. Отримаєте DirectoryNotEmptyException. Для видалення непорожніх папок потрібна рекурсія.

Помилка № 4: Немає прав на створення/видалення у зазначеній папці. Буде викинуто AccessDeniedException або IOException. Запускайте програму з потрібними правами або використовуйте доступні папки.

Помилка № 5: Файл зайнятий іншим процесом. У Windows (і іноді в інших ОС) не можна видалити файл, якщо його відкрито в іншій програмі. Отримаєте IOException. Закрийте всі програми, що використовують файл, перед видаленням.

Помилка № 6: Використання відносних шляхів без розуміння «де ви перебуваєте». Файл створюється не там, де ви очікували. Для певності використовуйте toAbsolutePath() і виводьте шлях на екран.

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