undefined

Files, Path

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

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

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

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

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

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

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

Files, Path - 1

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

— Ага. Взяли за основу класс File, добавили в него немного нового, переименовывали методы, а в конце еще и разделили на два. Так что теперь есть два новых класса – Path и FilesPath – это, фактически новый аналог класса 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(InputStream, OutputStream) Копирует байты из InputStream в OutputStream.
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. Все.

— Гениально!

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

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

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

Комментарии (82)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
I_Gubenko 37 уровень
5 февраля 2021
long copy(InputStream, OutputStream) Копирует байты из InputStream в OutputStream нет такого метода....
Pig Man 40 уровень
29 января 2021
Создание временных файлов в Java: Иногда нам нужно создать временный файл, который будет использоваться только в нашем приложении

Path tempFile = Files.createTempFile(String prefix, String suffix, File directory)
ᅠ
Этот метод создает файл с определенным суффиксом и префиксом в указанной папке. Аргумент File directory должен уже существовать и должен быть директорией, иначе будет брошено исключение IOException. Имя файла создается по формуле prefix + random_long_no + suffix. Это сделано для безопасности приложения, так как никто не будет знать имя файла и ваша программа одна будет работать временным файлом. prefix должен быть минимум три символа. Если suffix является null, то по умолчанию используется .tmp. Если в параметр directory передан null, то временный файл создается в стандартном каталоге для временных файлом операционной системы Это самый простой способ создать временный файл в стандартной папке для временных файлом операционной системы Files.createTempDirectory(Path) — создает временную директорию
Valua Sinicyn 38 уровень, Харьков
20 января 2021
Так что теперь есть два новых класса – Path и Files java.nio.file.Path это интерфейс.
VDT 22 уровень, Екатеринбург
10 января 2021
Почему-то не пишут, что строка

Files.copy(inputStream, tempFile);
будет сыпать эксепшены, как отцветающая сакура лепестки цветов. Да хоть какой префикс и постфикс вы пропишите ТЕМП файлу. Хоть как его назовите. Вы поймаете эксцепшен. Что только вот эта форма, будет корректно отрабатывать.

Files.copy(stream, tempFile, StandardCopyOption.REPLACE_EXISTING);
Если раньше в лекциях просто было модно не договорить об 90% функционала, то теперь походу настали времена, немного даже вводить в заблуждение. Поправьте меня, кто там на 40х левелах, если я не прав.
Evgeny Kuznetsov 27 уровень
5 января 2021
Почему интерфейс Path в статье зовется классом Path?

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

— Это тот путь, который был передан в конструктор объекта Path, методы которого вызываются. Path – это «путь» по-английски.
Нет у Path ни какого конструктора, и ни чего он не возвращает. В лекции г-жа Риша сама использует класс Files чтобы создать экземпляр типа интерфейса Path:

Path tempFile = Files.createTempFile("temp-",".tmp");
Зачем так запутывать читателей? Столько времени убил чтобы все собрать в голове после этой короткой и наиглупейшей лекции Это нужно конкретно постараться, чтобы так запутать материал используя так мало букв.
Евгений 30 уровень, Коряжма
27 октября 2020
Ааа, вот оно что. В статье ошибка boolean isRegularFile(Path) это НЕ метод класса File, а метод интерфейса FileVisitor, поэтому я не мог вызвать его в задаче)))
IvanGr 41 уровень, Ulm
17 октября 2020
cheto ya ne ponimaiu: — Ага. Взяли за основу класс File, добавили в него немного нового, переименовывали методы, а в конце еще и разделили на два. Так что теперь есть два новых класса – Path и Files. Path ili Phats?
Евгений 41 уровень, Нижний Новгород Expert
24 мая 2020
Половину третьего квеста ждал этой лекции))
Damien Brock 0 уровень
13 мая 2020
I would like to suggest you, try LongPathTool program to resolve this issue. This tool is very helpful to resolve the issue.
Whiskels 41 уровень, Москва
18 апреля 2020
Строка номер 2. У объекта url открываeтся поток на чтение файла – InputStream