Если Вы добавили B как слушатель A, и A предназначен для переживания B, завершить запрос B никогда не будут называть, потому что существует экземпляр B в A, таким образом, это никогда не будет собираться "мусор". Вы могли обойти это путем хранения ссылки на B в как WeakReference (который не считают ссылкой во время набора гаража), но было бы лучше явно вычеркнуть из списка B от, когда Вам больше не нужен он.
В целом рекомендуется в Java не использовать завершить метод в Java, потому что Вы никогда не можете быть уверены, когда это назовут, и Вы не можете использовать его для вычеркивания из списка себя от другого класса.
Согласно документации Archive :: Zip , вам лучше использовать Archive :: Extract :
Если вы просто собираетесь для извлечения zip-архивов (и / или других архивов) рекомендуется использовать вместо этого Archive :: Extract, так как он намного проще в использовании и не учитывает специфические для архива функции.
Это интересно, потому что Archive: : Extract сначала попробует Archive :: Zip, а затем вернется к двоичному файлу unzip
, если не удастся. Таким образом, кажется, что Archive :: Zip является предпочтительным вариантом.
Archive :: Zip использует Compress :: Raw :: Zlib , который является интерфейсом низкого уровня для системной библиотеки zlib; так что это не чистая реализация Perl, что означает, что по производительности она будет аналогична unzip
. Другими словами,
Если вы выполните двоичный файл unzip
, ваш процесс будет выполнять fork / exec и
Вам также необходимо указать правильный путь к распаковке
. Учитывая все это, я бы сильно предпочел библиотечный подход.
Одна проблема связана с памятью. Мы на собственном опыте обнаружили (отказ рабочего веб-сервера), что Archive :: Tar
имела утечку памяти. Таким образом, хотя в целом использование модуля вместо системного вызова внешней команды является хорошей идеей (см. Другие ответы для обоснования), вам необходимо убедиться, что в модуле нет ошибок.