Мне нужен небольшой фрагмент кода, который разархивирует несколько файлов из данного ZIP-файла и предоставляет отдельные файлы в соответствии с форматом, в котором они были в заархивированном файле. Пожалуйста, поделитесь своими знаниями и помогите мне.
Переведено автоматически
Ответ 1
Версия peno была немного оптимизирована. Увеличение производительности заметно.
while ((ze = zis.getNextEntry()) != null) { filename = ze.getName();
// Need to create directories if not exists, or // it will generate an Exception... if (ze.isDirectory()) { Filefmd=newFile(path + filename); fmd.mkdirs(); continue; }
На основе ответа Василия Сочинского немного доработано и с небольшим исправлением:
publicstaticvoidunzip(File zipFile, File targetDirectory)throws IOException { ZipInputStreamzis=newZipInputStream( newBufferedInputStream(newFileInputStream(zipFile))); try { ZipEntry ze; int count; byte[] buffer = newbyte[8192]; while ((ze = zis.getNextEntry()) != null) { Filefile=newFile(targetDirectory, ze.getName()); Filedir= ze.isDirectory() ? file : file.getParentFile(); if (!dir.isDirectory() && !dir.mkdirs()) thrownewFileNotFoundException("Failed to ensure directory: " + dir.getAbsolutePath()); if (ze.isDirectory()) continue; FileOutputStreamfout=newFileOutputStream(file); try { while ((count = zis.read(buffer)) != -1) fout.write(buffer, 0, count); } finally { fout.close(); } /* if time should be restored as well long time = ze.getTime(); if (time > 0) file.setLastModified(time); */ } } finally { zis.close(); } }
Заметные отличия
public static - это статический служебный метод, который может быть где угодно.
2 File параметра, потому что String это:/ для файлов, и раньше нельзя было указать, куда нужно извлечь zip-файл. Также path + filename конкатенация > https://javalang.ru/a/412495/995891
throws - потому что ловить поздно - добавьте try catch, если они действительно не интересны.
на самом деле гарантирует, что требуемые каталоги существуют во всех случаях. Не каждый zip-файл содержит все необходимые записи каталогов перед записями файлов. В нем было 2 потенциальных ошибки.:
если zip содержит пустой каталог, а вместо результирующего каталога есть существующий файл, это было проигнорировано. Важно возвращаемое значение mkdirs().
может произойти сбой при работе с zip-файлами, которые не содержат каталогов.
увеличенный размер буфера записи должен немного повысить производительность. Хранилище обычно состоит из блоков 4k, а запись меньшими порциями обычно выполняется медленнее, чем необходимо.
использует магию finally для предотвращения утечки ресурсов.