Files, Path

Java Collections
1 уровень, 3 лекция
Открыта

— О, Риша, здорово!

— Привет, Амиго! Как жизнь?

— Отлично. Только что Билаабо рассказывал кучу интересного про File, и как с ним работать.

— Думаю, у меня как раз есть что добавить по этой теме.

— Да? Тогда с удовольствием послушаю.

— Тогда слушай. Java постоянно развивается, постоянно ищутся новые способы делать различные вещи эффективнее. Еще в Java 7 была добавлена альтернатива классу File.

Files, Path - 1

— Альтернатива?

— Ага. Взяли за основу класс File, добавили в него немного нового, переименовывали методы, а в конце еще и разделили на два. Так что теперь есть два новых класса – Path и Files. Path – это фактически новый аналог класса File, а Files – это утилитный класс (по аналогии с классами Arrays & Collections), в него можно вынести все статические методы класса File. Так "правильнее" с точки зрения ООП.

— Ну, раз с точки зрения ООП, то – ок. А что поменялось-то?

— Во-первых, отказались от дублирования методов, которые возвращали String и File. В классе Path все методы возвращают Path.

Во-вторых, убрали многие статические утилитные методы в класс Files.

В третьих, удобнее стало работать с относительными путями.

Вот список методов:

Методы класса Path Описание
boolean isAbsolute() Возвращает true, если путь – абсолютный.
Path getRoot() Возвращает корень текущего пути – директорию самого верхнего уровня.
Path getFileName() Возвращает имя файла из текущего пути.
Path getParent() Возвращает директорию из текущего пути.
boolean startsWith(Path other) Проверяет, что текущий путь начинается с переданного пути.
boolean endsWith(Path other) Проверяет, что текущий путь заканчивается на переданный путь.
Path normalize() Нормализует текущий путь. Например, приводит путь «c:/dir/dir2/../a.txt» к пути «c:/dir/a.txt»
Path relativize(Path other) Вычисляет относительный путь двух путей – «разницу путей»
Path resolve(String other) Восстанавливает абсолютный путь по текущему и относительному.
URI toUri() Возвращает URI текущего пути/файла.
Path toAbsolutePath() Приводит путь к абсолютному, если был относительный.
File toFile() Возвращает объект File, который соответствует текущему объекту Path.

— А текущий путь – это что?

— Это тот путь, который был передан в конструктор объекта Path, методы которого вызываются. Path – это «путь» по-английски.

— Ок. А какие методы есть у класса Files?

— Ну и куда же ты так спешишь-то? Сейчас все расскажу. Вот основные методы:

Методы класса Files Описание
Path createFile(…) Создает файл на диске.
Path createDirectory(…) Создает директорию.
Path createDirectories(…) Создает директорию и поддиректории.
Path createTempFile(…) Создает «временный файл»
Path createTempDirectory(…) Создает «временную директорию»
void delete(Path path) Удаляет файл/директорию.
Path copy(Path source, Path target,…) Копирует файл.
Path move(Path source, Path target,…) Перемещает файл.
boolean isSameFile(Path, Path) Сравнивает два файла.
boolean isDirectory(Path) Путь — это директория?
boolean isRegularFile(Path) Путь – это файл?
long size(Path) Возвращает размер файла.
boolean exists(Path) Объект с таким именем существует?
boolean notExists(Path) Объект с таким именем не существует?
long copy(Path, OutputStream) Копирует все байты из Path в OutputStream.
long copy(InputStream, Path) Копирует все байты из InputStream в Path.
byte[] read(InputStream, int initialSize) Читает массив байт из InputStream.
byte[] readAllBytes(Path path) Читает все байты из InputStream.
List<String> readAllLines(Path path,..) Читает текстовый файл, возвращает список строк.
Path write(Path path, byte[] bytes,…) Пишет массив байт в файл.

— Как интересно, столько крутых функций, и все в одном месте.

А зачем нужны временные файлы?

— Ну, смотри. Допустим, ты хочешь скачать файл из интернета, а потом отправить его кому-то. Для этого очень удобно создать временный файл на диске и сохранять считанные данные в него.

— А сложно скачать файл из интернета?

— Очень просто. Смотри пример:

Код
URL url = new URL("https://www.google.com.ua/images/srpr/logo11w.png");
InputStream inputStream = url.openStream();

Path tempFile = Files.createTempFile("temp-",".tmp");
Files.copy(inputStream, tempFile);

— И это все?

— Да, а что ты ожидал тут увидеть? Тут всего 4 строчки.

Строка номер 1. Создается объект URL, куда передается ссылка в интернете на файл с картинкой.

Строка номер 2. У объекта url открывается поток на чтение файла – InputStream.

Строка номер 4. С помощью метода  createTempFile создается временный файл.

Строка номер 5. Метод Files.copy копирует данные из inputStream в tempFile. Все.

— Гениально!

— Отлично, рад, что тебе понравилось. Думаю, с остальными методами ты разберёшься сам. А я попрошу Диего дать тебе несколько задачек на них.

Вот тебе, кстати, хорошая ссылка на этот материал:

Ссылка на материал

Комментарии (125)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
14 мая 2025
"КУЧУ ИНТЕРЕСНОГО" ага да
{Java_Shark} Уровень 36
13 января 2025
++
Unholy intromen Уровень 1
15 августа 2023
умеют же когда хотят
Андрей Уровень 42
8 мая 2023
читая лекцию и уже автоматом ощущается напряг:" где-то меня наёмывают, а где - пока не пойму, надо посмотреть каменты". здесь либо более компетентные люди, либо более человечные.
Михаил Уровень 32
26 апреля 2023

URL url = new URL("https://www.google.com.ua/images/srpr/logo11w.png");
        InputStream inputStream = url.openStream();

        Path tempFile = Files.createTempFile("temp-",".tmp");
        Files.copy(inputStream, tempFile, StandardCopyOption.REPLACE_EXISTING);
        System.out.println(tempFile);
здесь почему и зачем поменять расширение и наслаждаться рептилоидным знаком.
Кирилл Уровень 2
3 апреля 2023
У всех картинка нормально скачалась предложенным способом?
Anonymous #3059777 Уровень 51
6 апреля 2023
не, с ошиб java.nio.file.FileAlreadyExistsException
Кирилл Уровень 2
6 апреля 2023
Ага, такая же штука) Пришлось гуглить)
Edward Northwind Уровень 37
17 января 2023
У меня такое чувство, что лекторы специально удаляют из лекций часть материала, иначе я не пойму почему описана и разобрана только часть методов. Вот самый очевидный вопрос, а как получить объект Path из String?
Grock Уровень 44
18 января 2023
Path of = Path.of("C:\\Users");
Edward Northwind Уровень 37
18 января 2023
Это понятно, но почему об этом нет в лекции?
Grock Уровень 44
19 января 2023
Подобный вопрос можно поставить применительно ко многим задачам. Видимо создатели курса не хотят перегружать его теорией и исходят из того, что многие ответы можно найти в Интернете.
Archy Уровень 1 Expert
2 марта 2023
Я сейчас на 16 уровне, и здесь это проходится
alexyng7 Уровень 32
30 августа 2023
Просто не все по Syntax PRO учились. В "старой" версии блока Syntax про потоки информации не было. Кто не читал лекции с Syntax Pro вот ссылка: https://javarush.com/quests/lectures?quest=QUEST_JAVA_SYNTAX_PRO&level=15
Kurama Уровень 50
7 декабря 2022

URL url = new URL("https://www.google.com.ua/images/srpr/logo11w.png");
InputStream inputStream = url.openStream();

Path tempFile = Files.createTempFile("temp-",".tmp");
Files.copy(inputStream, tempFile);
— И это все? — Да, а что ты ожидал тут увидеть? Тут всего 4 строчки. Ага, конечно...
18 декабря 2022
И только на решении задачи "Загрузчик файлов" Я понял смысл этого коммента))) Тонко, коллега)))
Kurama Уровень 50
7 декабря 2022
boolean exists(Path) Объект с таким именем существует? boolean notExists(Path) Объект с таким именем не существует? Гениально...
Edward Northwind Уровень 37
17 января 2023
Не помню кто и когда говорил, но считается, что ложные условия сложнее осознать, поэтому в if стараются делать условия с истиной.

if (!file.exists(path)) {...}

if (file.notExists(path)) {...}
Kurama Уровень 50
18 января 2023
Это конечно имеет смысл, но это очень странно. Типа неужели нужно удвоить количество всех существующих булеан методов, чтоб немного лучше читалось
Зета Медведя Уровень 45
23 ноября 2022
Bruh...