Archiver (15)

  • 14
  • Недоступна
Пора попробовать что-нибудь распаковать. Для этого добавим публичный метод void extractAll(Path outputFolder) throws Exception в класс ZipFileManager. Path outputFolder - это путь, куда мы будем распаковывать наш архив. У тебя уже большой опыт работы с элементами архива и потоками. Так что, я дам то
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (70)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Sergey30 уровень, Санкт-Петербург
8 июня, 07:34
Не используйте FileOutputStream для записи, даже если все будет работать, валидатор не пропустит! Только OutputStream.
Alexey Tarakanov35 уровень, Москва
19 мая, 23:25
Да уж. Я Mr Vnimatelnost. Додолбил до 25 попыток из-за того, что не видел в упор что у меня Files.createDirectory(outputFolder); вместо Files.createDirectories(outputFolder); Пробывал и так и сяк, но голова отказывалась включаться. И потом чисто случайно упал взгляд на это
Ivan29 уровень
19 июня, 07:42
такие ошибки самые обидные в программировании:)
Даниил31 уровень
11 мая, 22:03
Конечно задание поставлено на высоте))) Это капец. Пока не нашёл готовый вариант и не расковырял его через дебагер - вообще не понимал что от меня хотят. В итоге вот что посоветую после изучения коментариев и решения: - в классе ZipExtractCommand вроде всё предельно ясно. - в методе extractAll много веселья... 1) Требование под номером 2 принимает почему-то только так
if ( ! Files.isRegularFile(zipFile))
//хотя логичнее как по мне так
if (Files.notExists(zipFile))
2) способы решения через ZipFile и Enumeration на проверку не сдавал, так как не получилось их осуществить, но их наверняка не примет потому что это уже из 9 версии, а с ней валик 100% не дружит. 3) везде где вы будете создавать директории используйте именно метод Files.createDirectories(Path path), а не Files.createDirectory(Path path так как первый автоматически создаёт все родительские несуществующие папки данной папки и её саму (если всё уже существует, то исключение не кидает), а Files.createDirectory только саму папку, если все родительские уже есть (если папка уже существует, или не существуют родители папки и она сама, то исключение кидает).
Даниил31 уровень
11 мая, 22:38
Итак, что делать в методе extractAll: 1) делаем проверку как в моём пункте 1 выше; 2) в try-with-resources создаём поток ZipInputStream от нашего архива который будем распаковывать; 3) проверяем есть ли директория outputFolder, если нет - создаём 4) далее в цикле перебираем ZipEntry нашего ZipInputStream - то есть каждый файл архива. Загвоздка в том что файл может быть на глубину в 2, 3, 4 и т.д. папок, а их нужно как-то создать. 5) для решения проблемы в п.4 необходимо создать всю цепочку папок начиная от корневой (в данном случае outputFolder) до папки в которой будет конкретный файл. Для этого нужно получить ПОЛНЫЙ путь к файлу и создать ЕГО РОДИТЕЛЬСКУЮ директорию что бы файл сохранялся по правильному относительному пути (я до этого едва додумался когда уже разбирал готовый код). Где взять относительный путь и как из него получить абсолютный думаю догадаться можно. 6) создать обычный OutputStream использовав абсолютный путь елемента ZipEntry (я снова таки сделал в ещё одном try-with-resources) и вызвать copyData с соответствующими потоками.
Arkadii31 уровень
4 мая, 18:38
Очень странно, когда создаю архив через WinRar и пытаюсь его распаковать через наш архиватор, то почему-то ZipInputStream выдает null вместо ZipEntry. При этом, если те же файлы архивировать своей прогой, то все нормально. Получается там разные способы сжатия или что-то такое?
Dmitry Ryazanov41 уровень
28 апреля, 14:01
Не знаю почему, но пару рабочих вариантов валидатор не принял (на моих тестах), но принял ошибочный вариант, который не правильно распаковывает. О.о
Ruslan30 уровень
20 марта, 01:21
Среднее количество попыток для этой задачи 3.81. Всего эту задачу решили 2713 учеников. 20190320
Даниил31 уровень
11 мая, 21:58
2813 12/05/2019)))
Ruslan30 уровень
14 мая, 04:54
+100 человек за 2 месяца = конкуренция)
S3R3N1TY36 уровень, Санкт-Петербург
19 марта, 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();
Вообще не ожидал, супер ощущение, когда сам до всего допер и решил !!
28 марта, 18:55
Если закрываешь fos.close() то fos.flush() не нужен. А если try (OutputStream fos = Files.newOutputStream(fullPath)) {...}, то и fos.close() не нужен.
Алексей Масис35 уровень, Новосибирск
24 апреля, 14:16
вау вот это да, еще и скрин приложил, а то никто бы не поверил...
Artur41 уровень
23 февраля, 11:14
Создал новый класс Test и реализовывал метод extractAll пошагово на своих тестовых данных, причем после каждого шага делал проверку, работает ли как должно. Мне такой способ очень помог, чем написать сразу весь метод целиком, а потом разбираться, где ошибка.
Володимир Штаба31 уровень, Киев
29 ноября 2018, 23:37
Вечно гавнокод чет творит , нужно будет вручную пройтись по задачах и собрать свои реализации в 1 класс.
Olexandr Leonets31 уровень, Киев
15 октября 2018, 00:50
Дожал задачу, с 9ой попытки при средней 3,79 интуитивно понимаю, что я не туп... но все же. Те кто изучили опыт mkyong и решили его внедрить в жизнь - не выйдет. на осознание этого ушло 6 попыток. Рекомендации ментора: Исключение системы безопасности JavaRush. Вы выполняете потенциально опасную или запрещенную операцию.