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
- File → Path: file.toPath()
- Path → File: 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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ