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

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

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

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 Pro, 16 уровень, 6 лекция
Недоступна
Файл или директория
Напиши программу, которая будет считывать с клавиатуры строки, и если данная строка — это путь к существующему файлу, выводить в консоли "<введенная строка> - это файл". Если путь к существующей директории, выводить в консоли "<введенная строка> - это директория". Если строка не является путем к фа
16
Задача
Java Syntax Pro, 16 уровень, 6 лекция
Недоступна
Файловые операции
Нужно написать программу, которая будет считывать с клавиатуры два пути к файлу. 1. Если файла по первому пути не существует, его нужно создать. 2. Если же файл по первому пути существует, нужно переместить этот файл по второму пути, но только в том случае, если по второму пути файла нет. 3. Если же

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 Pro, 16 уровень, 6 лекция
Недоступна
А что же внутри папки?
Напиши программу, которая будет считывать с клавиатуры путь к директории, получать список файлов и директорий в заданной директории и выводить в консоли информацию о них в виде: "<путь к файлу> - это файл", если это файл, "<путь к директории> - это директория", если это директория. Треугольные скобк
16
Задача
Java Syntax Pro, 16 уровень, 6 лекция
Недоступна
Поверхностное копирование
Напиши программу, которая будет считывать с клавиатуры пути к двум директориям и копировать файлы из одной директории в другую (только файлы, директории игнорируй). Используй соответствующие методы класса Files: newDirectoryStream(), isRegularFile() или isDirectory(), copy().
16
Задача
Java Syntax Pro, 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  output = new FileOutputStream( src );
Стало
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );

Комментарии (365)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Aura Уровень 18
5 июня 2025
Задача "Файловые операции" это просто а******, чуть ли не идеал задачи для закрепления материала, дали такую задачу, в которой надо использовать половину изученных в этой лекции методов. Жаль, что слишком легкая была, не на подумать.
Артур Уровень 28
26 мая 2025
Кто как ,но на этой странице я застрял на 2 недели.
Emillionaire Уровень 23
13 апреля 2025
Такое ощущение что кто-то издевается. Почему это всё идет сейчас?! А не две темы назад, когда я просто в шоке был от того что ничего не понимаю и в задачах требуют то что я вижу первый раз!
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 Уровень 28
18 мая 2025
А в задании "Перемещение файлов" наоборот - не пропустил, если была проверка isDirectory. Слава богам, можно без проблем смотреть ответ
James diGriz Уровень 12
6 апреля 2025
Кто, как и я, в начале модуля зашел в комментарии и поэтому сразу начал проходить уроки в правильном порядке - ставьте класс, это мой первый комментарий, набираю ачивку
Vitalii Уровень 32 Expert
25 февраля 2025
Объяснили самые простые методы, про которые и так понятно : isRegularFile() или exists(), а методы с заковыкой "влом" объяснять, потому что многА букАФ получится. Тот случай, когда комментарии полезнее лекции ...
Anonymous #3545788 Уровень 27
20 февраля 2025
В "Поверхностном копировании" колхоз такого вида не прокатил:

        try(var filesAndDirs = Files.newDirectoryStream(sourceDirectory)){
            for(var fD:filesAndDirs){
                if (Files.isRegularFile(fD)){
                    Files.copy(fD,  Path.of(targetDirectory.toString()+"\\"+fD.getFileName().toString()));
                }
            }
        }
Хотя делал все как надо) Необходимо юзать метод resolve объекта класса Path
Anonymous #3545788 Уровень 27
20 февраля 2025
По задаче "Файловые операции" следующее решение не проходит валидацию:

        boolean f1Exist=Files.exists(filePath);
        boolean f2Exist=Files.exists(fileNewPath);
        if (f1Exist){
            if (f2Exist){
                Files.delete(filePath);
            }
            else {
                Files.move(filePath,fileNewPath);
            }
        }
        else{
            Files.createFile(filePath);
        }
Мол не юзаешь "Files.createFile"... Пришлось переписать так, как они хотят.
Agent_Pandora Уровень 26
15 февраля 2025
Так/ Потоки день шестой)многое стало понятно/тут конечно лекции по этой теме не о чем/ но отдельные статьи очень помогают Полезное: ТУТ1 / ТУТ2 / ТУТ3 / ТУТ4 / ТУТ5 ТУТ6 / STREAM API
Agent_Pandora Уровень 26
11 февраля 2025
ой мля/ и зачем я учил и нарешал различных задач с FileInputStream /FOS ...