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

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

Java Syntax Pro
15 уровень , 5 лекция
Открыта

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  output = new FileOutputStream( src );
Стало
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );

Комментарии (374)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anton Zorin Уровень 20
16 сентября 2025
Для себя решил прояснить, что вообще происходит. Без AI. Path resolve = targetDirectory.resolve(path.getFileName()); 1. Таргет дир - "c:\\windows\\projects"; 2. Из итератора path.getFileName() - text.txt; имя файла 3. resolve - крафтим абсолютли путь c:\\windows\\projects\\text.txt - но файла тут нет, если бы был, программа выбросит эксепшн. 4. Из итератора path, который содержит "D:\\windows\\projects\\text.txt" из директории sourceDirectory D:\\windows\\projects, мы копируем файл в абсолютли путь из шага 3.
NinaInfinity Уровень 21
26 июля 2025
Одна из самых понятных лекций и самых логичных задач за последнее время..,)
Exaltyr777 Уровень 25
23 июля 2025
почему-то мне GPT говорит что nio.files появился с Java 7, а не 5
I'll kick them all Уровень 5
28 июля 2025
Можете щелкнуть в Idea по имени Files в вашем коде с зажатой кнопкой Ctrl и увидеть, что такой класс действительно существует с Java 7. Такой метод значительно надежнее ChatGPT.
Exaltyr777 Уровень 25
31 июля 2025
Я так кликаю обычно чтобы понять че делает неизвестный мне метод в классе) Благо знание английского позволяет. Буду знать теперь что такие вещи тоже там можно найти, спасибо.
Виктор Уровень 23
17 июля 2025
Сначала создае́м обьект Path путь к файлу, а потом сам файл через метод. Затупил на этом капец).
Anonymous #3585174 Уровень 33
16 июля 2025
like
Aura Уровень 23
5 июня 2025
Задача "Файловые операции" это просто а******, чуть ли не идеал задачи для закрепления материала, дали такую задачу, в которой надо использовать половину изученных в этой лекции методов. Жаль, что слишком легкая была, не на подумать.
Артур Уровень 29
26 мая 2025
Кто как ,но на этой странице я застрял на 2 недели.
Emillionaire Уровень 23
13 апреля 2025
Такое ощущение что кто-то издевается. Почему это всё идет сейчас?! А не две темы назад, когда я просто в шоке был от того что ничего не понимаю и в задачах требуют то что я вижу первый раз!
@itArarat Уровень 26
2 декабря 2025
нужно уметь гуглить ,и это главная задача ,читать документацию... вы хотите чтобы вам с Hello world обяснили что такое System.in ?
Dmitry Rodionov Уровень 25
12 апреля 2025
В "Поверхностном копировании" валидатор не пропускал вариант без использования функции isDirectory(). А после разового создания копируемой директории , вроде и не требовалось бы отдельно обрабатывать ситуацию, когда встретили не_файл. Пришлось вставить заглушку. Так пропустил:


            for (Path path:directoryStream){
                if(Files.isDirectory(path)){
                    System.out.println("Заглушка для валидатора. Не копируем директорию "+path);
                }
                if (Files.isRegularFile(path)){
                    Files.copy(path, targetDirectory.resolve(path.getFileName()));
                    System.out.println("Копируем "+ path);
                }
VadChet Уровень 29
18 мая 2025
А в задании "Перемещение файлов" наоборот - не пропустил, если была проверка isDirectory. Слава богам, можно без проблем смотреть ответ
James diGriz Уровень 12
6 апреля 2025
Кто, как и я, в начале модуля зашел в комментарии и поэтому сразу начал проходить уроки в правильном порядке - ставьте класс, это мой первый комментарий, набираю ачивку