JavaRush/Курси/Java Syntax Zero/Робота з файлами в Java

Робота з файлами в Java

Відкрита

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);

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

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

16
Задача
Java Syntax Zero,  16 рівень6 лекція
Недоступна
Файл чи директорія
Напиши програму, яка зчитує рядки з клавіатури та виводить у консоль такі повідомлення: якщо введений рядок є шляхом до існуючого файлу "<уведений рядок> - це файл". Якщо введений рядок є шляхом до існуючої директорії "<уведений рядок> - це директорія". Якщо рядок не є шляхом до файлу чи
16
Задача
Java Syntax Zero,  16 рівень6 лекція
Недоступна
Файлові операції
Напиши програму, яка зчитуватиме з клавіатури два шляхи до файлу. Якщо за першим шляхом файлу немає, його потрібно створити. Якщо за першим шляхом файл є, його потрібно перемістити на другий шлях, але тільки за умови, що за другим шляхом файлу немає. Якщо такий файл є, потрібно просто видалити файл

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.


16
Задача
Java Syntax Zero,  16 рівень6 лекція
Недоступна
А що там у папці?
Напиши програму, яка зчитує з клавіатури шлях до директорії, отримує список файлів і директорій у вказаній директорії та виводить в консоль інформацію про них у такому вигляді: "<шлях до файлу> - це файл", якщо це файл, "<шлях до директорії> - це директорія", якщо це директорія. Кутові д
16
Задача
Java Syntax Zero,  16 рівень6 лекція
Недоступна
Поверхневе копіювання
Напиши програму, яка зчитує з клавіатури шляхи до двох директорій і копіює файли з однієї директорії в іншу (тільки файли, директорії ігноруй). Використай відповідні методи класу Files: newDirectoryStream(), isRegularFile() або isDirectory(), copy().
16
Задача
Java Syntax Zero,  16 рівень6 лекція
Недоступна
Переміщення файлів
Напиши програму, яка зчитує з клавіатури шляхи до двох директорій і переміщує файли з однієї директорії в іншу (тільки файли, директорії ігноруй). Використай відповідні методи класу Files: newDirectoryStream(), isRegularFile() або isDirectory(), move().

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 ) );

Коментарі (19)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Андрій
Рівень 18
25 квітня 2024, 14:09
В мене таке відчуття, ніби коли написали 16 рівень, то викликали для нього reverse()
Olexandr
Рівень 47
21 січня 2024, 17:41
Хороші задачі. В лекції нічого не забуто, як тут пишуть. Просто знов таки логіка. Я, наприклад, здогадувався що з таргет папкою щось не так просто, але що... Я так розумію, resolve використали, тому що при перевірці вводиться неповний шлях до папки. Треба було здогадатися зробити перевірку на абсолютний шлях, і якщо його нема - тоді і застосувати resolve. Але якусь підказочку про абсолютність шляху могли б і лишити, ми ж все ж таки не комерційний проект пишемо поки що, і коли в тебе не працює і абсолютно неясно чому - таке собі..... ps згоден, що з Files.newInputStream - загнали..... Спочатку рівня гризли задачі абсолютно без підготовки, гуглили як могли. В кінці рівня дали цю теорію але без задач. Супер, чо....
Aleksey Golovin
Рівень 55
29 вересня 2025, 09:10
resolve робе шлях до файлу призначення. Наприклад у нас є C:\\FirsFolder\ та C:\\SecondFolder\ У першій папці ми знайшли файл C:\\FirsFolder\test.txt Нам треба створити посилання на місце переміщення, а саме C:\\SecondFolder\test.txt Тобто нам треба взяти вказівник на другу папки та поєднати його з назвою файла. Назву файла ми отримаємо за допомогою методу getFileName() до вказівника на наш файл. А поєднуємо вказівник на директорію та назву файлу за допомогою resolve()
Andriy
Рівень 26
24 червня 2023, 13:22
Хочу ще раз щиро порекомендувати chatGPT. Після декількох спроб розв'язати задачу 4 я зміг за допомогою дебагу знайти проблему і вручну конкатуванням створював новий шлях. Хоча на моїй машині в моєму конкретному випадку це працювало, валідацію не проходило. Швидше за все через відмінність в будові шляху в різних ОС. Після цього я закинув свій код в chatGPT і попросив оптимізувати створення шляху. Він зразу і запровонував мені resolve, пояснивши деталі
In this updated code, the xxx.resolve(yyy) expression resolves the yyy path against the xxx, creating the newPath directly.

This approach is cleaner and more reliable than manually concatenating strings and handling path separators yourself.
Зразу після цього виправлення задача пройшла валідацію. Також я закидав chatGPT питаннями про resolve, на які він дав відповіді з прикладами, що допомогло зрозуміти принцип роботи resolve загалом
Pavlo Kezin
Рівень 23
23 вересня 2023, 09:46
тільки чат іноді вирішує задачу взагалі за тебе.
Olexandr
Рівень 47
23 січня 2024, 09:41
колись закінчиться тим, що цей чат і на роботу приймуть за тебе...
Oleksandr Tkachenko
Рівень 51
22 квітня 2023, 05:51
тут хтось писав що ресурси мають бути закриті) де в вашому рішені закритя сканера?)
Yevhenii
Рівень 17
7 квітня 2023, 10:10
Тільки зараз нам вирішили розповісти про метод List<String> readAllLines(Path path)? А завдання з використанням цього методу було три лекції тому : просто шикарно(
WhoAMI
Рівень 51
23 листопада 2022, 08:37
а як у передостанній задачі реалізувати щоб копіювало і файли які знаходились в директоріях, при цьому не копіювавши самі директорії (тобто усі файли які містяться у поточній та вкладеній директоріях копіюються у таргет директорію самі файли без директорій).
Anonymous #696530
Рівень 19
8 листопада 2022, 21:41
Дві останні задачі один в один...
Sava_crosava Професор кулінарних наук в НУ "Собачий рай"
25 жовтня 2023, 16:20
це для набиття руки)
FAUST_ua
Рівень 29
11 вересня 2022, 21:27
Дивна задача "Поверхневе копіювання": 1) де в лекції розказували про resolve ? 2) при вашому варіанті вирішення (який рахується правильним еталоном) програма не спрацювала та видала такі помилки: Exception in thread "main" java.nio.file.NoSuchFileException: <SOURSE FILE> -> <TARGET FILE> at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:85) at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103) at java.base/sun.nio.fs.WindowsFileCopy.copy(WindowsFileCopy.java:209) at java.base/sun.nio.fs.WindowsFileSystemProvider.copy(WindowsFileSystemProvider.java:284) at java.base/java.nio.file.Files.copy(Files.java:1305) at ua.javarush.task.pro.task15.task1519.Solution.main(Solution.java:22) Така помилка виникає коли <TARGET DIRECTORY> не існує.
Bandiu Band
Рівень 25
23 вересня 2022, 23:20
Про resolve в лекціях було, в описі методу copy ніхто не уточнив що цілевий шлях має містити не лише шлях до папки, а має включати ще й назву самого фалу (вже в новій директорії). Як приклад: Pach pach1 = Pach.of("c:\1\doc.txt"); Pach pach2 = Pach.of("c:\2\doc.txt"); Files.copy(path1,path2); Для цього і потрібен resolve(), якщо з ним то буде якось так. Pach pach1 = Pach.of("c:\1\doc.txt"); Pach pach2 = Pach.of("c:\2"); Path resolve = pach2.resolve(path1.getFileName()); Files.copy(path1,resolve);
Artem
Рівень 30
1 вересня 2022, 10:30
так багато інфи за resolve...
Niko Java Developer
30 липня 2022, 13:32
В двух последних без resolve не засчитывает. Хоть можно у так Path file = Path.of(targetDirectory+"\\"+Path.of(String.valueOf(path)).getFileName()); К директории