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

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

— Отлично. Только что Билаабо рассказывал кучу интересного про 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. Все.

— Гениально!

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

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

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