Почему getNextZipEntry пропускает корневой каталог для нескольких файлов?
Привет, когда я пытаюсь распаковать мой файл, я использую следующий фрагмент
public static List<String> unZip(File tarFile) throws IOException {
List<String> result = new ArrayList<String>();
InputStream inputStream = new FileInputStream(tarFile);
ZipArchiveInputStream in = new ZipArchiveInputStream(inputStream);
ZipArchiveEntry entry = in.getNextZipEntry();
while (entry != null) {
System.out.println("Entry name ::: "+entry);
if (entry.isDirectory()) {
System.out.println("This entry is a directory ");
entry = in.getNextZipEntry();
continue;
}
result.add(entry.getName());
entry = in.getNextZipEntry();
}
in.close();
return result;
}
Мой приведенный выше фрагмент кода выводится как
Entry name ::: lib/docssdk.jar
Entry name ::: lib/jackson-annotations-2.7.4.jar
Entry name ::: lib/jackson-core-2.7.4.jar
Entry name ::: lib/jackson-databind-2.7.4.jar
Entry name ::: lib/jsonapi-converter-0.3.jar
Entry name ::: lib/okhttp-3.0.1.jar
Entry name ::: lib/okio-1.7.0.jar
Entry name ::: lib/retrofit-2.0.2.jar
Я ожидаю, что это будет как
Entry name ::: lib/
Entry name ::: lib/docssdk.jar
Entry name ::: lib/jackson-annotations-2.7.4.jar
Entry name ::: lib/jackson-core-2.7.4.jar
Entry name ::: lib/jackson-databind-2.7.4.jar
Entry name ::: lib/jsonapi-converter-0.3.jar
Entry name ::: lib/okhttp-3.0.1.jar
Entry name ::: lib/okio-1.7.0.jar
Entry name ::: lib/retrofit-2.0.2.jar
Корневая папка lib/ отсутствует
Я получаю ожидаемый вывод, когда я распаковываю содержимое файла на моей машине и снова создаю zip в папке lib.
Почему мне не хватает моей корневой папки здесь при получении getNextZipEntry
? Пожалуйста, посоветуйте мне это.
Я приложил скриншот структуры zip вместе с этим
Оригинальный Zip-файл для воспроизведения этой проблемы
2 ответа
Вы не видите lib/
запись, потому что она не существует в вашем ZIP-файле:
$ zipinfo zip_root_folder_issue.zip
Archive: zip_root_folder_issue.zip
Zip file size: 1878250 bytes, number of entries: 8
-rw-r--r-- 3.0 unx 17596 bx defN 16-Aug-02 13:38 lib/docssdk.jar
-rw-r--r-- 3.0 unx 50897 bx defN 16-Aug-02 13:40 lib/jackson-annotations-2.7.4.jar
-rw-r--r-- 3.0 unx 253001 bx defN 16-Aug-02 13:39 lib/jackson-core-2.7.4.jar
-rw-r--r-- 3.0 unx 1204187 bx defN 16-Aug-02 13:39 lib/jackson-databind-2.7.4.jar
-rw-r--r-- 3.0 unx 36004 bx defN 16-Aug-02 13:39 lib/jsonapi-converter-0.3.jar
-rw-r--r-- 3.0 unx 326467 bx defN 16-Aug-02 13:39 lib/okhttp-3.0.1.jar
-rw-r--r-- 3.0 unx 69868 bx defN 16-Aug-02 13:38 lib/okio-1.7.0.jar
-rw-r--r-- 3.0 unx 86225 bx defN 16-Aug-02 13:38 lib/retrofit-2.0.2.jar
8 files, 2044245 bytes uncompressed, 1876818 bytes compressed: 8.2%
Менеджеры архивов, скорее всего, отображают промежуточные "отсутствующие" папки, но для zip-файла не нужны записи для них. Некоторые форматы файлов, использующие zip (например, xlsx), даже не ожидают ни одного из них.
В вашем случае, я думаю, вам нужно будет сделать то, что делают эти менеджеры: показать / создать папку, если она не существует.
@subramanian rasapan, если вы хотите извлечь только Zip-файлы, я могу предложить сторонний инструмент для простейшего извлечения вместе с решением вышеупомянутой проблемы.
Название инструмента Zip4J: www.lingala.net/zip4j/download.php
Просто добавьте его в свою библиотеку, и вы можете использовать следующий код для извлечения:
public void unZipFile(String filePath)
{
String destination = "<desired-destination>";
try
{
String zipFileName = new File(filePath).getName();
ZipFile zipFile = new ZipFile(filePath);
zipFile.extractAll(destination);
}
catch (ZipException e)
{
}
}
Для работы вышеуказанного кода вам понадобятся следующие операции импорта:
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
Я предоставляю тестовую программу для распаковки любого zip-файла:
package unzip;
import java.io.File;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
public class Unzip
{
public static void main(String[] args)
{
String fileName = "abc.zip";
String destination = "D:\\copiedTo";
try
{
String zipFileName = new File(fileName).getName();
ZipFile zipFile = new ZipFile(fileName);
zipFile.extractAll(destination+"\\"+zipFileName);
}
catch (ZipException e)
{
}
}
}
Извлеченный файл из Zip-файла будет сохранен в d:\copiedto\\.
Моя структура почтового индекса:
abc.zip (zip-файл) |_abc |_1.txt |_2.txt |_3.txt |_4.txt |_5.txt |_6.txt
При извлечении папка имеет ту же структуру, что и zip-файл (вместе с корневой папкой).
Я прилагаю ссылки на файлы, с которыми я тестировал, пожалуйста, проверьте их при необходимости:
Почтовый файл: https://drive.google.com/file/d/0B4fTzD5zwqL0M1lqM3EwazVzWUE/view?usp=sharing Извлеченный файл: https://drive.google.com/open?id=0B4fTzD5zwqL0T0xVaXhmSzZ6VWc
Пожалуйста, проверьте и сообщите, если есть какая-то путаница. Спасибо и С уважением.