Archiver (15) Пора попробовать что-нибудь распаковать. Для этого добавим публичный метод void extractAll(Path outputFolder) throws Exception в класс ZipFileManager. Path outputFolder — это путь, куда мы будем распаковывать наш архив. У тебя уже большой опыт работы с элементами архива и потоками. Так что, я дам только подсказки по реализации этого метода, а тебе придется хорошенько подумать, как это все сделать: 1. Проверь, есть ли zip файл вообще 2. Если директория outputFolder не существует, то ее нужно создать, как и все папки, внутри которых она лежит. 3. Внутри архива некоторые файлы могут лежат внутри папок, тогда метод getName() элемента архива ZipEntry, вернет не совсем имя, как может показаться из названия, а относительный путь внутри архива. Этот относительный путь должен сохраниться и после распаковки, но уже относительно той директории, куда мы распаковали архив 4. Реализуй метод execute() класса ZipExtractCommand, по аналогии с таким же методом класса ZipCreateCommand, сделай такой же блок try-catch, только поменяй сообщения выводимые пользователю, чтобы он понял, что сейчас мы будем распаковывать архив, и что нужно ввести полное имя архива и директорию, куда будем распаковывать. Не забудь вызвать метод extractAll класса ZipFileManager, а не createZip, как это было в ZipCreateCommand 5. Запускай программу и наслаждайся результатом распаковки Примечание: Для получения потоков чтения и записи используй Files.newInputStream(Path path), Files.newOutputStream(Path path).
public void extractAll(Path outputFolder) throws Exception{
        if (!Files.isRegularFile(outputFolder)) throw new WrongZipFileException();

        if (Files.notExists(outputFolder))
            Files.createDirectories(outputFolder);

        try(ZipInputStream inputStream = new ZipInputStream(Files.newInputStream(zipFile)) ) {
            ZipEntry zipEntry;
            while ((zipEntry = inputStream.getNextEntry())!=null){

                ZipOutputStream outputStream = new ZipOutputStream(Files.newOutputStream(outputFolder.resolve(Paths.get(zipEntry.getName()))));
                copyData(inputStream,outputStream);

                inputStream.closeEntry();
                outputStream.close();
            }
        }
    }