Archiver (15)

  • 14
  • Недоступна
Пора попробовать что-нибудь распаковать. Для этого добавим публичный метод void extractAll(Path outputFolder) throws Exception в класс ZipFileManager. Path outputFolder - это путь, куда мы будем распаковывать наш архив. У тебя уже большой опыт работы с элементами архива и потоками. Так что, я дам то
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (59)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Ruslan28 уровень
13 часов назад
Среднее количество попыток для этой задачи 3.81. Всего эту задачу решили 2713 учеников. 20190320
S3R3N1TY29 уровень, Санкт-Петербург
вчера, 11:14
Охренеть ребят, кайф нереальный, сидел сейчас с утра и сам все реализовал и сдал с первой попытки ! Столкнулся с такой проблемой в начале, что у меня выкидывал Exception вот здесь
fos = Files.newOutputStream(extract_path,CREATE);
Параметр CREATE отвечает за то, что нужно создать такой файл, если не существует его. Оказалось, связано с тем, что метод в начале проверяет полный путь для нового файла- проверяет существуют ли все папки на диске и только потом он может создать файл. UPD: параметр CREATE  лишний, метод и без него создает новый файл, если такого нет. В итоге я перед созданием файла, просто создаю все папки необходимые
Files.createDirectories(extract_path.getParent());
А уже потом создают поток newOutputStream(extract_path,CREATE); который и создает мне новый файл. В конце цикла записи я делал так:
//скопировали байты и закрыли поток
               copyData(zis, fos);
               fos.flush();
               fos.close();
Вообще не ожидал, супер ощущение, когда сам до всего допер и решил !!
Artur39 уровень
23 февраля, 11:14
Создал новый класс Test и реализовывал метод extractAll пошагово на своих тестовых данных, причем после каждого шага делал проверку, работает ли как должно. Мне такой способ очень помог, чем написать сразу весь метод целиком, а потом разбираться, где ошибка.
Володимир Штаба31 уровень, Киев
29 ноября 2018, 23:37
Вечно гавнокод чет творит , нужно будет вручную пройтись по задачах и собрать свои реализации в 1 класс.
Olexandr Leonets31 уровень, Киев
15 октября 2018, 00:50
Дожал задачу, с 9ой попытки при средней 3,79 интуитивно понимаю, что я не туп... но все же. Те кто изучили опыт mkyong и решили его внедрить в жизнь - не выйдет. на осознание этого ушло 6 попыток. Рекомендации ментора: Исключение системы безопасности JavaRush. Вы выполняете потенциально опасную или запрещенную операцию.
Andry Max35 уровень, Минск
25 августа 2018, 22:25
потратил наверное часа полтора на то, чтобы понять почему же работает некорректно. проверял я на стороннем архиве, созданном не через мою программу и вот непонятно почему, но на нём не работало, однако создал потом архив сам и затем разархивировал без проблем. мда, мог сэкономить кучу времени... upd: кажись в условии след. задаче есть ответ, почему же с чужим архивом не работало, вероятно дело в том что разные алгоритмы сжатия.
Дмитрий Скоморохов35 уровень, Москва
27 июля 2018, 11:59
У кого проблема только с 4 пунктом: Вот вы вначале проверили, есть ли outputPath. Например он user/folder:/target/ И если его нет, то командой createDirectories(outputPath) создали target. Проверили есть ли родительские папки через getParrent(), если нет то командой createDirectories(outputPath.getParrent()) досоздали папки user/folder:/ Казалось бы папки создаются, но почему не проходит 4 пункт? А дело в том, что когда вы делаете Path fullPath = outputFolder.resolve(zipEntry.getName()); а потом OutputStream target = Files.newOutputStream(fullPath) то ВЫ ПЫТАЕТЕСЬ СОЗДАТЬ в папке outputFolder файл с путем например, fullPath/papka1/papka2/mypersonalfile.txt, но папка fullPath то пустая! В ней нет папок papka1/papka2/, поэтому их надо сначала проверить, есть ли они, через if (Files.notExists(fullPath.getParent())) и создать, fullPath.getParent(), если его нет. ИНЫМИ СЛОВАМИ: При распаковке файлов, которые были во вложенных папках, эти вложенные папки при распаковке сами по себе не создадутся, если не создадите их вы!
1 августа 2018, 16:50
Вообщем так:
Files.createDirectories(outputFolder);
if (Files.notExists(outputFolder.resolve(ze.getName()).getParent()))
                    Files.createDirectories(outputFolder.resolve(ze.getName()).getParent());
P.S. Files.createDirectories автоматически создаёт все родительские несуществующие папки данной папки и её саму (если всё уже существует, то исключение не кидает), а Files.createDirectory только саму папку, если все родительские уже есть (если папка уже существует, или не существуют родители папки и она сама, то исключение кидает)
Павел41 уровень, Гомель
23 апреля 2018, 13:57
Так, закопаем здесь капсулу времени для будущих поколений: 1) Предварительно ничего вычитывать в ByteArrayOutputStream не надо. 2) Для того, чтобы писать распакованные файлы на диск надо создавать обычный OutputStream (а не ZipOutputStream). Я лично с этим страшно натупил.
Макс Куркудюк36 уровень, Киев
16 апреля 2018, 12:27
За умовою потрібно зробити розархівацію всіх файлів архіву у вказану папку, навіть, якщо вони були в підпапках. Після вирішення файл змінили на звичайну архівацію, з підпапками. От уже шифрувальники...
Beslan Bavizhev39 уровень
14 марта 2018, 18:21
На следующем уровне ваше решение затрётся кривым кодом, не умеющим распаковывать архивы с вложенными папками и файлами. Для потомков (кому интересно) >>> корректно работающий код (правильно распаковывающий архивы с любой вложенностью папок и файлов) и принятый валидатором.
26 марта 2018, 00:48
это ложь, все нормально работает, а вот ваше решение не идеальное и тяжело читаемое, слишком мудрый if в вашем решение соглашусь только с тем что создавать директории нужно до открытия потока, в случае если директория не будет создана, то и потоки нечего трогать. Все остальное на любителя.
Beslan Bavizhev39 уровень
26 марта 2018, 08:06
В чём ложь? В программе с канонической реализацией extractAll пытаемся распаковать "сложный" архив (с вложенными папками и файлами): Получаем: и на выходе: То же самое с моей реализацией extractAll: Причем правильно распаковывается любая вложенность. Я не претендую на идеальность решения, но оно рабочее и выполняет расширенный функционал. А где вы увидели сложный if, я вообще не понял.
26 марта 2018, 18:19
перепроверил все еще раз, у меня все нормально упаковывается и распаковывается. Проблема у вас в другом месте. Единственное что не упаковывает, так это пустые директории, все остальное работает нормально.
Beslan Bavizhev39 уровень
26 марта 2018, 21:13
Тоже еще раз досконально протестировал. Выяснилось следующее: программа в реализации JR, действительно, правильно распаковывает, те архивы, которые созданы самой же программой (кроме пустых папок, которые изначально прога не упаковывает). Проблема оказалось в другом, в JR`овской реализации не распаковываются корректно (по крайней мере у меня) архивы формата zip (с вложенными папками), созданные в других архиваторах таких как 7zip, Winrar. Я когда решал этот этап оказывается брал для теста именно такой архив. Простые архивы (без вложенности) распаковываются правильно, проблема именно в архивах с многоуровневой вложенностью. Попробуйте распаковать какой-нибудь сложный архив, созданный в 7zip`или Winrar`е. Надо докопаться до истины)
26 марта 2018, 21:25
Тут вопрос будет о способе архиватора, мы в задаче проходим простое упаковывание без применения способа архивации, и будет не корректно брать архив из других архиваторов. Это больше как для своих нужд использовать этот архиватор, точно не для общественного пользования.
26 марта 2018, 21:26
Что бы уметь правильно распаковывать чужие архивы, нужно глубже понимать алгоритмы архивирования.
Beslan Bavizhev39 уровень
26 марта 2018, 21:33
Не знаю, в моей реализации эти архивы в том числе распаковываются правильно. Ничего уникального я там не использовал, те же средства что и JR, никаких других библиотек.
Beslan Bavizhev39 уровень
26 марта 2018, 21:43
Сейчас лезть в дебагер и заново разбирать желания особого нет. Если в двух словах, там косяк в том, что вместо вложенных папок создаются файлы с такими же именами, и далее когда извлекается файл, вложенный в такую папку, возникает ошибка размещения, т.к. родительская папка не создалась. Ладно, закончим обсуждение, надо двигаться дальше. Удачи!
26 марта 2018, 21:44
взаимно
Victor35 уровень, Минск
27 апреля 2018, 23:44
все норм обновляется и работает. Где-то изменили код вне методов по условию где не нужно, вот и проблемы...
Илья Геков40 уровень, Москва
31 мая 2018, 20:44
Ага, аналогичная проблема. Тестировал на сторонних архивах, свой код работал (валидатор не пропускал), а JR нет. Если брать имя не с помощью Entry.getName(), а брать именно имя файла, то все работает и со сторонними архиваторами.