Archiver (15)

  • 14
  • Недоступна
Пора попробовать что-нибудь распаковать. Для этого добавим публичный метод void extractAll(Path outputFolder) throws Exception в класс ZipFileManager. Path outputFolder - это путь, куда мы будем распаковывать наш архив. У тебя уже большой опыт работы с элементами архива и потоками. Так что, я дам то
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (55)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Володимир Штаба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(), а брать именно имя файла, то все работает и со сторонними архиваторами.
Avaaron36 уровень, Москва
26 февраля 2018, 16:20
йа не могу понять одного момента. мы получили полный путь к файлу в архиве. Есть мнение , что нужно проверить, файл ли это, еси да тады получим от него getParent(). А если нет и он папка, тогда получается нужно оставить полный путь как родительский. Папка хоть и пустая если есть в архиве должна же остаться??? Валику не нравится моя проверка.
Fonzy40 уровень, Москва
21 февраля 2018, 11:42
Иной раз, приходит такое ощущение, что они специально такие кривые проверки своим валидатором делают, чтобы люди подольше сидели над каждой задачей и у них подольше капала подписка.
Максим39 уровень
4 февраля 2018, 20:30
Я так понял, что, если в архиве есть папка, а в ней файл, то все распаковывается нормально. А вот, если в архиве есть папка, в которой еще одна папка, а в ней уже файл, то вылетает ошибка. Как быть?)
Victor35 уровень, Минск
27 апреля 2018, 23:26
пропечатайте в консоль все path по вашему алгоритму, где-то ошибка. У меня в тесте папка в папке в папке и все ок. Мои тесты прошел, Валли принял.