FileNotFoundException при попытке распаковать архив с помощью java.util.zip.ZipFile - PullRequest
0 голосов
/ 04 ноября 2011

У меня глупая проблема, которую я не смог понять. Может кто-нибудь мне помочь? Мой код как:

String zipname = "C:/1100.zip";
    String output = "C:/1100";
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
        ZipFile zipFile = new ZipFile(zipname);
        Enumeration<?> enumeration = zipFile.entries();
        while (enumeration.hasMoreElements()) {
            ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();
            System.out.println("Unzipping: " + zipEntry.getName());
            bis = new BufferedInputStream(zipFile.getInputStream(zipEntry));
            int size;
            byte[] buffer = new byte[2048];

Папка не создается, но отладка показывает все генерируемое содержимое. Для создания папки я использовал код

if(!output.exists()){ output.mkdir();} // here i get an error saying filenotfoundexception

            bos = new BufferedOutputStream(new FileOutputStream(new File(outPut)));
            while ((size = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, size);
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        bos.flush();
        bos.close();
        bis.close();
    }

Мой zip-файл содержит изображения: a.jpg b.jpg ... и в той же иерархии у меня есть abc.xml. Мне нужно извлечь содержимое как в zip-файле. Любая помощь здесь.

1 Ответ

0 голосов
/ 04 ноября 2011

Есть несколько проблем с вашим кодом: где объявлен outPut?output - это не файл, а строка, поэтому exists() и mkdir() не существуют.Начните с объявления output как:

File output = new File("C:/1100");

Более того, outPut (с большим P) не объявлено.Это может быть что-то вроде output + File.seprator + zipEntry.getName().

 bos = new BufferedOutputStream(new FileOutputStream(output + File.seprator + zipEntry.getName()));

Обратите внимание, что вам не нужно передавать File в FileOutputStream, как показывают конструкторы в документации .

На этом этапе ваш код должен работать, если ваш Zip-файл не содержит директории.Однако при открытии выходного потока, если zipEntry.getName () имеет компонент каталога (например, somedir/filename.txt), открытие потока приведет к FileNotFoundException, так как родительский каталог файла, который вы пытаетесь создать, не делаетсуществовать.Если вы хотите иметь возможность обрабатывать такие zip-файлы, вы найдете ответ в: Как рекурсивно разархивировать файлы в Java?

...