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 для вложенной папки, а родительской ещё нет — будет ошибка.
Таблица: сравнение методов создания папок
| Метод | Создаёт только одну папку | Создаёт вложенные папки | Не падает, если часть уже существует |
|---|---|---|---|
|
✔ | ✗ | ✗ |
|
✔ | ✔ | ✔ |
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() и выводите путь на экран.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ