1. Клас Files

Клас Files

Для роботи з файлами є чудовий утилітний клас — java.nio.file.Files. Він має методи буквально на всі випадки. Усі методи цього класу є статичними й працюють з об'єктами типу Path. Методів дуже багато, тому ми розглянемо лише основні:

Метод Опис
Path createFile(Path path)
Створює новий файл зі шляхом path
Path createDirectory(Path path)
Створює нову директорію
Path createDirectories(Path path)
Створює кілька директорій
Path createTempFile(prefix, suffix)
Створює тимчасовий файл
Path createTempDirectory(prefix)
Створює тимчасову директорію
void delete(Path path)
Видаляє файл або директорію, якщо вони порожні
Path copy(Path src, Path dest)
Копіює файл
Path move(Path src, Path dest)
Переміщує файл
boolean isDirectory(Path path)
Перевіряє, чи є шлях директорією, а не файлом
boolean isRegularFile(Path path)
Перевіряє, чи є шлях файлом, а не директорією
boolean exists(Path path)
Перевіряє, чи існує об'єкт за вказаним шляхом
long size(Path path)
Повертає розмір файлу
byte[] readAllBytes(Path path)
Повертає весь вміст файлу у вигляді масиву байтів
String readString(Path path)
Повертає весь вміст файлу у вигляді рядка
List<String> readAllLines(Path path)
Повертає весь вміст файлу у вигляді списку рядків
Path write(Path path, byte[])
Записує у файл масив байтів
Path writeString(Path path, String str)
Записує у файл рядок
DirectoryStream<Path> newDirectoryStream(Path dir)
Повертає колекцію файлів (і піддиректорій) зі вказаної директорії

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

Створювати файли й директорії дуже просто. Переконайтеся в цьому на прикладах.

Код Примітка
Files.createFile(Path.of("c:\\readme.txt"));
Створює файл
Files.createDirectory(Path.of("c:\\test"));
Створює директорію
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
Створює директорію й усі потрібні піддиректорії, якщо їх немає.

3. Копіювання, переміщення й видалення

Копіювати, переміщати й видаляти файли теж дуже легко. Директорій це також стосується, але вони мають бути порожніми.

Код Примітка
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
Копіює файл
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
Переміщує й перейменовує файл
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
Видаляє файл

4. Перевірка типу файлу та його наявності

Коли ви отримуєте іззовні певний шлях, то, напевно, хочете дізнатися, чи це файл, чи директорія. І чи існують такий файл або директорія взагалі?

Для цього теж є спеціальні методи. Так само можна легко дізнатися довжину файлу:

Код Примітка
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
 Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. Робота із вмістом файлу

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

Код Опис
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

Читаємо вміст файлу у вигляді списку рядків

Виводимо рядки на екран


6. Отримання вмісту директорії

І на останок ще один цікавий метод — отримання списку файлів і піддиректорій у вказаній директорії.

Для цього є спеціальний метод — newDirectoryStream(), який повертає спеціальний об'єкт типу DirectoryStream<Path>. Він має ітератор (!), і за допомогою цього ітератора можна отримати список усіх файлів і піддиректорій у вказаній директорії.

Це простіше, ніж здається:

Код Опис
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


Отримуємо об'єкт зі списком файлів
Цикл за списком файлів

Об'єкт DirectoryStream<Path> має дві властивості. По-перше, у нього є ітератор, який повертає шляхи до файлів, і ми можемо використовувати цей об'єкт у циклі for-each.

А по-друге, цей об'єкт є потоком даних, тому його потрібно закривати за допомогою методу close() або використовувати в операторі try-with-resources.



7. Метод Files.newInputStream

Починаючи з версії Java 5 класи FileInputStream і FileOutputStream стали вважатися застарілими. Одним з їхніх недоліків є те, що під час створення об'єктів цих класів одразу відбувається створення файлів на диску. У такому разі викидаються всі можливі помилки, пов'язані зі створенням файлів.

Зрештою це було визнано не найкращим рішенням. Тому для створення об'єктів-файлів рекомендується використовувати методи утилітного класу java.nio.Files.

Порівняймо старий і новий підходи до створення файлів:

Було
String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream( src );
Стало
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of( src ) );

Так само замінили й метод FileOutputStream:

Було
String src = "c:\\projects\\log.txt";
OutputStream  input = new FileOutputStream( src );
Стало
String src = "c:\\projects\\log.txt";
OutputStream  input = Files.newOutputStream( Path.of( src ) );