Как читать содержимое файлов внутри Zip-файла, который находится внутри Zip-файла - PullRequest
0 голосов
/ 09 октября 2019

Структура Zip: -

OuterZip.zip--|
              |--Folder1---InnerZip.zip--|
                                         |--TxtFile1.txt    // Requirement is to read content of txt file 
                                         |--TxtFile2.txt    // Without extracting any of zip file

Теперь я могу читать имена текстовых файлов, но не их содержимое.

Код: -

public static void main(String arg[]){
ZipFile zip = new ZipFile("Outer.zip");
ZipEntry ze;
for (Enumeration e = zip.entries(); e.hasMoreElements();) {
    ZipEntry entry = (ZipEntry) e.nextElement();
    ZipInputStream zin = new ZipInputStream(zip.getInputStream(entry));
    while ((ze = zin.getNextEntry()) != null)
    {
        System.out.println(ze.getName());                                 //Can read names of txtfiles, Not contents
        zip.getInputStream(ze); // It is giving null
    }
}
}

PS: - 1. Хочет сделать это, не распаковывая zip в файловой системе.
2. Уже видел некоторые ответы по SOF.

1 Ответ

1 голос
/ 09 октября 2019
ZipFile zip = new ZipFile("Outer.zip");
...
zip.getInputStream(ze); // It is giving null

Содержимое ze (например, TxtFile1.txt) является частью InnerZip.zip, а не Outer.zip (представлено zip), следовательно, null.

Я бы использовалрекурсия:

public static void main(String[] args) throws IOException {
     String name = "Outer.zip";
     FileInputStream input = new FileInputStream(new File(name));
     readZip(input, name);
}

public static void readZip(final InputStream in, final String name) throws IOException {
    final ZipInputStream zin = new ZipInputStream(in);
    ZipEntry entry;
    while ((entry = zin.getNextEntry()) != null) {
        if (entry.getName().toLowerCase().endsWith(".zip")) {
            readZip(zin, name + "/" + entry.getName());
        } else {
            readFile(zin, entry.getName());
        }
    }
}

private static void readFile(final InputStream in, final String name) {
    String contents = new BufferedReader(new InputStreamReader(in)).lines().collect(Collectors.joining("\n"));
    System.out.println(String.format("Contents of %s: %s", name, contents));
}

0. while (...) мы перебираем все записи целиком.

1. (if (.endsWith(".zip"))) весли мы встречаемся с другим почтовым индексом, мы вызываем его рекурсивно (readZip()) и переходим к шагу 0.

2. (else), в противном случае мы печатаем содержимоефайла (при условии, текстовые файлы здесь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...