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() і виводьте шлях на екран.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ