Невозможно прочитать ZipInputStream, возвращаемый методом ZipFile.getInputStream (ZipEntry) - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь прочитать извлечение данного файла из ZIP-файла. Zip-файл также содержит каталоги и подкаталоги. Я пробовал apis файла nio Java7, но поскольку в моем zip-архиве есть подкаталоги, мне нужно указать полный путь для извлечения файла, что не подходит в моем сценарии. Поскольку мне нужно получить от пользователя ввод, извлеченный из файла. Я пытался выполнить код ниже, но каким-то образом читал метод ZipInputStream, не читая содержимое в буфер. При отладке я обнаружил, что значение объекта ZipEntry равно нулю внутри ZipInputStream, поскольку его метод чтения просто возвращает -1, но теперь я застрял, так как не могу понять, как это значение устанавливается для него.

try(OutputStream out=new FileOutputStream("filetoExtract");) {
    zipFile = new ZipFile("zipFile");
    Enumeration<? extends ZipEntry> e = zipFile.entries();
    while (e.hasMoreElements()) {
        ZipEntry entry = e.nextElement();
        if (!entry.isDirectory()) {
            String entryName = entry.getName();
            String fileName = entryName.substring(entryName.lastIndexOf("/") + 1);
            System.out.println(i++ + "." + entryName);
            if (searchFile.equalsIgnoreCase(fileName)) {
                System.out.println("File Found");
                BufferedInputStream bufferedInputStream = new BufferedInputStream(zipFile.getInputStream(entry));
                ZipInputStream zin = new ZipInputStream(bufferedInputStream);
                byte[] buffer = new byte[9000];
                int len;
                while ((len = zin.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
                out.close();
                break;
            }
        }
    }
} catch (IOException ioe) {
    System.out.println("Error opening zip file" + ioe);
} 

Пожалуйста, посоветуйте, что я здесь делаю не так. Спасибо

РЕДАКТИРОВАТЬ: После небольшой отладки я обнаружил, что класс ZipFile имеет внутренний класс с похожим именем (ZipFileInputStream). Таким образом, он создавал его объект, а не внешний класс ZipFileInputStream. Итак, я попробовал код ниже, и это сработало. Но я не совсем понимаю, что произошло. Если бы кто-нибудь мог мне помочь, логи c за кулисами было бы действительно здорово.

//  BufferedInputStream bufferedInputStream = new 
//BufferedInputStream(zipFile.getInputStream(entry));
//ZipInputStream zin = new ZipInputStream(bufferedInputStream);
InputStream zin= zipFile.getInputStream(entry);

1 Ответ

0 голосов
/ 17 июня 2020

Вторая строка не нужна, поскольку zipFile.getInputStream(entry) уже возвращает InputStream, представляющее распакованные данные. Следовательно, нет необходимости (или на самом деле это неправильно) заключать этот InputStream в еще один ZipInputStream:

BufferedInputStream bufferedInputStream = new BufferedInputStream(zipFile.getInputStream(entry));
ZipInputStream zin = new ZipInputStream(bufferedInputStream);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...