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() и выводите путь на экран.

1
Задача
JAVA 25 SELF, 40 уровень, 0 лекция
Недоступна
Создание цифрового архива для отчётов 📂
Создание цифрового архива для отчётов 📂
1
Задача
JAVA 25 SELF, 40 уровень, 0 лекция
Недоступна
Генеральная уборка старых данных 🧹
Генеральная уборка старых данных 🧹
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Andrey Уровень 1
4 октября 2025
40