29 января 2020
Ранее мы рассматривали Создание zip-архивов, а теперь попробуем выполнить обратную операцию. Если у нас имеется zip-архив с файлами, то распаковать его мы можем следующим образом:
Мы создаём объект ZipFile из пакета java.util, в конструктор которому передаём полный путь до нашего архива. Все действия выполняем в конструкции try-with-resources, которая автоматически закроет ресурс, связанный с нашим архивом, в конце работы с ним.
Метод entries() предоставляет список содержащихся в архиве сущностей (файлов и папок). Затем мы можем обходить эти сущности при помощи цикла while и метода hasMoreElements(). Распакованный архив будем складывать в ту же директорию, где лежит исходный файл с архивом.
В цикле мы проверяем у каждой сущности признак isDirectory() и в зависимости от этого либо создаём подпапки в папке назначения, либо распаковываем содержащийся в архиве файл. Ниже приведены оба метода: processDirectory() и processFile().
Тут мы прибавляем к нашему базовому пути имя папки, содержащейся в архиве. Затем создаём объект File, асоциированный с этой новой папкой и проверяем её существование. Если её нет (что вполне ожидаемо), то создаем все папки с подпапками, содержащиеся в данном пути с помощью метода mkdirs().
В конструкции try-with-resources мы создаём поток InputStream, связанный с упакованным файлом внутри архива. Затем оборачиваем его буферизованным потоком BufferedInputStream, который минимизирует количество операций с файловой системой, что заметно ускоряет процесс распаковки.
Затем создаём аналогично поток FileOutputStream связанный с файлом, который мы собираемся записать. Оборачиваем его также в BufferedOutputStream для ускорения и в цикле пишем распакованный файл с помощью метода write().
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.