|
| 1 | + |
| 2 | +//And this is the record of John, when the Jews sent priests and Levites from Jerusalem to ask him, Who art thou? (John 1:19) |
| 3 | + |
| 4 | +package com.javarush.task.task31.task3110.command; |
| 5 | + |
| 6 | +import com.javarush.task.task31.task3110.ConsoleHelper; |
| 7 | +import com.javarush.task.task31.task3110.ZipFileManager; |
| 8 | +import com.javarush.task.task31.task3110.exception.PathIsNotFoundException; |
| 9 | + |
| 10 | +import java.nio.file.Path; |
| 11 | +import java.nio.file.Paths; |
| 12 | + |
| 13 | +public class ZipExtractCommand extends ZipCommand { |
| 14 | + |
| 15 | + @Override |
| 16 | + public void execute() throws Exception { |
| 17 | + try { |
| 18 | + ConsoleHelper.writeMessage("Распаковка архива."); |
| 19 | + |
| 20 | + ZipFileManager zipFileManager = getZipFileManager(); |
| 21 | + |
| 22 | + ConsoleHelper.writeMessage("Введите путь для распаковки:"); |
| 23 | + Path destinationPath = Paths.get(ConsoleHelper.readString()); |
| 24 | + zipFileManager.extractAll(destinationPath); |
| 25 | + |
| 26 | + ConsoleHelper.writeMessage("Архив был распакован."); |
| 27 | + |
| 28 | + } catch (PathIsNotFoundException e) { |
| 29 | + ConsoleHelper.writeMessage("Неверный путь для распаковки."); |
| 30 | + } |
| 31 | + } |
| 32 | +} |
| 33 | + |
| 34 | +/* |
| 35 | +Archiver (15) |
| 36 | +
|
| 37 | +Пора попробовать что-нибудь распаковать. Для этого добавим публичный метод void extractAll(Path outputFolder) throws Exception в класс ZipFileManager. Path outputFolder - это путь, куда мы будем распаковывать наш архив. У тебя уже большой опыт работы с элементами архива и потоками. Так что, я дам только подсказки по реализации этого метода, а тебе придется хорошенько подумать, как это все сделать: |
| 38 | +
|
| 39 | +1. Проверь, есть ли zip файл вообще |
| 40 | +
|
| 41 | +2. Если директория outputFolder не существует, то ее нужно создать, как и все папки, внутри которых она лежит. |
| 42 | +
|
| 43 | +3. Внутри архива некоторые файлы могут лежат внутри папок, тогда метод getName() элемента архива ZipEntry, вернет не совсем имя, как может показаться из названия, а относительный путь внутри архива. Этот относительный путь должен сохраниться и после распаковки, но уже относительно той директории, куда мы распаковали архив |
| 44 | +
|
| 45 | +4. Реализуй метод execute() класса ZipExtractCommand, по аналогии с таким же методом класса ZipCreateCommand, сделай такой же блок try-catch, только поменяй сообщения выводимые пользователю, чтобы он понял, что сейчас мы будем распаковывать архив, и что нужно ввести полное имя архива и директорию, куда будем распаковывать. Не забудь вызвать метод extractAll класса ZipFileManager, а не createZip, как это было в ZipCreateCommand |
| 46 | +
|
| 47 | +5. Запускай программу и наслаждайся результатом распаковки |
| 48 | +
|
| 49 | +
|
| 50 | +
|
| 51 | +Примечание: |
| 52 | +
|
| 53 | +Для получения потоков чтения и записи используй Files.newInputStream(Path path), Files.newOutputStream(Path path). |
| 54 | +
|
| 55 | +
|
| 56 | +
|
| 57 | +
|
| 58 | +
|
| 59 | +Требования: |
| 60 | +
|
| 61 | +1. В классе ZipFileManager нужно создать публичный метод void extractAll(Path outputFolder) throws Exception. |
| 62 | +
|
| 63 | +2. Метод extractAll(Path outputFolder) должен бросать исключение WrongZipFileException, если файл архива не существует. |
| 64 | +
|
| 65 | +3. Метод extractAll(Path outputFolder) должен создавать директорию outputFolder, если она не существует. |
| 66 | +
|
| 67 | +4. Метод extractAll(Path outputFolder) должен распаковывать все файлы из архива в директорию outputFolder. |
| 68 | +
|
| 69 | +5. Метод execute() в классе ZipExtractCommand должен получать объект ZipFileManager и разархивировать файлы в указанную пользователем директорию. |
| 70 | +*/ |
0 commit comments