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, H2, Linux, Hibernate, Collections, Stream API, многопоточность, чат-боты, нейросети, файлы, devops, Docker, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.