— О, Риша, здорово!
— Привет, Амиго! Как жизнь?
— Отлично. Только что Билаабо рассказывал кучу интересного про File, и как с ним работать.
— Думаю, у меня как раз есть что добавить по этой теме.
— Да? Тогда с удовольствием послушаю.
— Тогда слушай. Java постоянно развивается, постоянно ищутся новые способы делать различные вещи эффективнее. Еще в Java 7 была добавлена альтернатива классу File.
— Альтернатива?
— Ага. Взяли за основу класс 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
. Все.
— Гениально!
— Отлично, рад, что тебе понравилось. Думаю, с остальными методами ты разберёшься сам. А я попрошу Диего дать тебе несколько задачек на них.
Вот тебе, кстати, хорошая ссылка на этот материал:
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ