Archiver (15)

  • 32
  • Недоступна
Пора попробовать что-нибудь распаковать. Для этого добавим публичный метод void extractAll(Path outputFolder) throws Exception в класс ZipFileManager. Path outputFolder - это путь, куда мы будем распаковывать наш архив. У тебя уже большой опыт работы с элементами архива и потоками. Так что, я дам то
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (154)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Mixer-X
Уровень 41, Санкт-Петербург
27 ноября 2021, 14:57
Всё таки заставил работать эту стерву. Не сообразил сразу, что в поток записи надо полный путь передать. Но чудом допер. Конечно, валидатор не принял. И, как часто бывает, не принял в том числе исправленный под него код. Так что заслал правильное решение для зачета. Подправленый под правильное решение код (отдельно имена путям написал и перенес в цикл создание директории, если нет) у меня работает без замечаний с своим архивом. С посторонними нет, конечно же.
SchlechtGut
Уровень 51, Москва
20 октября 2021, 05:25
Исправили что ли задачачу? у меня "правильное решение" работает
LuneFox богатый программист в далёких мечтах Expert
17 октября 2021, 16:50
То, что я написал, распаковывает архиа, но валидатор не принимает - пишет про опасную операцию. То, что предлагает валидатор, не распаковывает архив. Чудесно. Кстати, кто может объяснить, почему, когда мы пишем
copyData(zipInputStream, fileOutputStream)
у нас не копируется весь файл целиком, а только одна ZipEntry? Если я правильно понимаю, эта команда должна запихнуть весь поток зипа в один файл, не разбивая по ZipEntry, но этого не происходит, почему?
fFamous
Уровень 51, Санкт-Петербург
9 ноября 2021, 21:05
Так сам поток же разбивает, насколько я понимаю. То есть, в этот метод мы передаем поток определенного entry, он его пишет, потом в цикле мы передаем еще и еще... И так до конца. Так же для записи, создали поток, создали энтри, записали, если есть еще файлы или папки, нужны еще энтри.
LuneFox богатый программист в далёких мечтах Expert
10 ноября 2021, 13:53
Так в том и дело, я не вижу, где он разбивается. Вижу только, где мы назначаем на инпут целиковый файл:
try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(zipFile)))
fFamous
Уровень 51, Санкт-Петербург
10 ноября 2021, 13:59
while ((entry = zipInputStream.getNextEntry()) != null)
По крайней мере, у меня так. То есть, каждый раз, мы берем nextEntry(пока они есть) и вызываем:
copyData(zipInputStream, fileOutputStream)
И он копирует в выходящий поток только то, что было в текущем ZipEntry входящего потока. А про то, где это написано, я не нашел, но по логике понял, что так оно и работает. Ибо если мы пишем, то нужно для каждого отдельного файла, создавать каждый раз отдельный ZipEntry, иначе что-то там слипнется. Про это где-то в первых задачах было, когда только ZipEntry продемонстрировали)
LuneFox богатый программист в далёких мечтах Expert
10 ноября 2021, 15:33
Ну вот в том-то и вопрос, почему мы не видим что-то вроде
copyData(entry, fileOutputStream)
(пока проигнорируем то, что запись неверная из-за неподходящего типа), а видим копирование из целого файла в конечную точку :) То есть, я не вижу команды "берём энтри и пишем в файл", я вижу "берём исходный файл и пишем в другой файл".
fFamous
Уровень 51, Санкт-Петербург
10 ноября 2021, 16:40
Я не понимаю, тебе не нравится, что у нас метод так реализован или назван или то, что реализация всего этого стандартными классами непрозрачная)? То есть, если я правильно понял, ты бы хотел, чтобы этот метод сам проходился по всем entry и записывал все в выходной файл, раз уж метод так назван. А иначе, его стоило бы назвать, например "copyEntryData"? А вообще, это же обычный метод, который может записать любую информацию из инпута в оутпут, а то, что он не пишет все Entry, ну, такая вот в джаве реализация этих ZipInputов)
LuneFox богатый программист в далёких мечтах Expert
11 ноября 2021, 10:36
Как бы объяснить-то, что я имею в виду :) Метод copyData просто вычитывает через буфер весь источник и записывает всё, что считал, в цель. Источник у нас - весь файл. Почему он не вычитывает весь zipInputStream, а только его часть? Мы же нигде такого не указываем.
fFamous
Уровень 51, Санкт-Петербург
11 ноября 2021, 11:33
Потому, что конкретно класс ZipInputStream не вычитывает источник полностью, а вычитывает по каждому отдельному ZipEntry) То есть, мы же можем в этот метод передать любого наследника InputStream и он вроде бы должен считывать весь источник. Но реализация у нас уже от самого объекта, который ZipInputStream. А этот класс вычитывает информацию не целиком, а по каждому отдельному entry :) Вот реализация метода read для класса ZipInputStream: Видимо там каким-то образом реализовано, что каждый отдельный файл является этим entry и считывает только его)
LuneFox богатый программист в далёких мечтах Expert
11 ноября 2021, 12:04
А, то есть это уже магия реализации zipInputStream-а, теперь понятно. Тогда появляется вопрос, как вычитать его целиком, не перебирая энтри. Например, чтобы взять и скопировать куда-нибудь всё одним махом :)
fFamous
Уровень 51, Санкт-Петербург
11 ноября 2021, 13:41
Без перебора не получится. Если просто скопировать, то есть метод Files.copy, а так - никак, только если создавать отдельный метод самому) Я сколько не смотрел вариантов, везде так или иначе работа с entry.
Mixer-X
Уровень 41, Санкт-Петербург
27 ноября 2021, 13:15
В Коллекциях это проходится. Неясно почему в отрыве от тут. Там и написано: Отлично, тогда дам тебе два новых класса ZipInputStream и ZipOutputStream. — Zip? Это как zip-архив? — Именно. Эти потоки предназначены для работы с файлами, которые являются zip-архивами. С помощью них можно что-то читать прямо из zip-фала или писать в него! — Ух ты! Как интересно. Но ведь в zip-архиве может быть не один файл, как же они работают? — А для этого есть еще один специальный класс – ZipEntry. Он представляет файл, хранящийся в архиве. Из ZipInputStream можно читать только объекты типа ZipEntry, а в ZipOutputStream можно писать только объекты ZipEntry. А вот сами ZipEntry как раз можно читать и писать, как обычные файлы. Как всегда остальное надо загуглить.
LuneFox богатый программист в далёких мечтах Expert
27 ноября 2021, 14:22
Ох, вот оно что. Ну ничего, скоро начну квест с коллекциями и паззл сложится, надеюсь)
Mixer-X
Уровень 41, Санкт-Петербург
27 ноября 2021, 15:04
А я начал с Коллекций, думал они как бы раньше. Вспотел. Прочитал, что вначале вроде как Многопоточность и слился сюда. Но зацепил 7 первых уроков.
LuneFox богатый программист в далёких мечтах Expert
27 ноября 2021, 17:47
Я начал с того, что мне интереснее, потому что очень хотел узнать, как выполнять несколько кодов параллельно, и ещё чтобы они взаимодействовали друг с другом :) До этого писал только однопоточные программы, где последовательность выполнений всех действий была очевидна, и не представлял, как делается иначе.
Mixer-X
Уровень 41, Санкт-Петербург
27 ноября 2021, 20:39
Головача не смотрел на Ютубе? Он хорошо разжевывает на куче примеров кода.
LuneFox богатый программист в далёких мечтах Expert
27 ноября 2021, 21:42
Такого не смотрел, нет. Зато отсмотрел на том же ютубе все лекции по многопоточности от Jakob Jenkov, у него очень классная подача материала и замечательные схемы с примерами.
Mixer-X
Уровень 41, Санкт-Петербург
28 ноября 2021, 07:33
Для меня разговорный недоступен. Приходится своих смотреть. Надеюсь не хуже толкуют.
LuneFox богатый программист в далёких мечтах Expert
28 ноября 2021, 14:02
Вроде бы английский и для него самого не родной)
Blame
Уровень 35, Омск, Россия
10 августа 2021, 13:18
Знайте, что кроме Files.createDirectory есть еще Files.createDirectories .....
Orion
Уровень 31, Санкт-Петербург, Россия
20 ноября 2021, 20:21
я с удивлением только посреди решения этой задачи узнал данный факт...
Иван
Уровень 41, Москва
13 июля 2021, 14:35
Задачка отличная, но у меня по итогу получилось распаковать только в то место, откуда было запаковано. Валя сожрал.
Andrew Li
Уровень 45, Санкт-Петербург
26 июня 2021, 17:43
Самописную реализацию, хоть и полностью рабочую, валидатор как обычно не принял, но да ладно. Но вот почему-то решение от разработчиков постоянно выбивает NoSuchFileException при распаковке. У кого-нибудь эталонная реализация адекватно отрабатывает?
24 июня 2021, 06:12
Будьте бдительны: Для получения потоков чтения и записи используй Files.newInputStream(Path path), Files.newOutputStream(Path path). Без этого не принимает!
Денис Громович
Уровень 36, Минск, Беларусь
11 июня 2021, 20:06
Ошибки в пунктах: 2.Метод extractAll(Path outputFolder) должен бросать исключение WrongZipFileException, если файл архива не существует. 4.Метод extractAll(Path outputFolder) должен распаковывать все файлы из архива в директорию outputFolder. как оказалось были вызваны проверкой Files.notExists(zipFile)... Валик хотел !Files.isRegularFile(zipFile)
Flexo Bending Unit #3370318
8 июня 2021, 16:17
обработка WrongZipFileException должна быть проведена в ExtractCommand, иначе не валидацию не пройдёте я знаю, что эта обработка уже добавлена в Archiver 🤷‍♂️
Олег Д
Уровень 40, Москва, Россия
20 мая 2021, 11:30
Конечно писать пользовательский интерфейс перед самой логикой это была "гениальная идея" Зачем иметь возможность быстро тестировать код через main. Лучше написать кнопки делающие ничего...