zip Файлы не распаковываются в ту же папку?

Здесь у меня есть папка (ZipFilesFolder), состоящая из 10 zip-файлов, например one.zip, two.zip, three.zip..ten.zip, я каждый раз передаю файл из этой папки в zipFileToUnzip как zipFilename. Мне нужно результат в той же папке (ZipFilesFolder) мне нужно распаковать эти файлы, и вместо one.zip, two.zip, .. одна, две, три папки должны быть видны.

public static void zipFileToUnzip(File zipFilename) throws IOException {
    try {
        //String destinationname = "D:\\XYZ";
        byte[] buf = new byte[1024];
        ZipInputStream zipinputstream = null;
        ZipEntry zipentry;
        zipinputstream = new ZipInputStream(new FileInputStream(zipFilename));

        zipentry = zipinputstream.getNextEntry();
        while (zipentry != null) {
            //for each entry to be extracted
            String entryName = zipentry.getName();
            System.out.println("entryname " + entryName);
            int n;
            FileOutputStream fileoutputstream;
            File newFile = new File(entryName);
            String directory = newFile.getParent();

            if (directory == null) {
                if (newFile.isDirectory()) {
                    break;
                }
            }
            fileoutputstream = new FileOutputStream(
                    destinationname + entryName);
            while ((n = zipinputstream.read(buf, 0, 1024)) > -1) {
                fileoutputstream.write(buf, 0, n);
            }
            fileoutputstream.close();
            zipinputstream.closeEntry();
            zipentry = zipinputstream.getNextEntry();
        }//while
        zipinputstream.close();
    } catch (IOException e) {
    }
}

Это мой код, но он не работает, может ли кто-нибудь мне помочь, как получить желаемый результат.


person tajMahal    schedule 30.05.2014    source источник


Ответы (1)


С вашим кодом есть пара проблем:

  • он не компилируется, поскольку destinationname комментируется, но на него ссылаются при открытии FileOutputStream
  • IOException ловятся и игнорируются. Если вы их бросите, вы получите сообщения об ошибках, которые помогут вам диагностировать проблему.
  • при открытии FileOutputStream вы просто объединяете две строки без добавления разделителя пути между ними.
  • если создаваемый файл находится в каталоге, каталог не создается, и поэтому FileOutputStream не может создать файл.
  • потоки не закрываются при возникновении исключений.

Если вы не возражаете использовать гуаву, которая упрощает жизнь при копировании потоков в файлы, вы можете вместо этого использовать этот код:

public static void unzipFile(File zipFile) throws IOException {
    File destDir = new File(zipFile.getParentFile(), Files.getNameWithoutExtension(zipFile.getName()));
    try(ZipInputStream zipStream = new ZipInputStream(new FileInputStream(zipFile))) {
        ZipEntry zipEntry = zipStream.getNextEntry();
        if(zipEntry == null) throw new IOException("Empty or no zip-file");
        while(zipEntry != null) {
            File destination = new File(destDir, zipEntry.getName());
            if(zipEntry.isDirectory()) {
                destination.mkdirs();
            } else {
                destination.getParentFile().mkdirs();
                Files.asByteSink(destination).writeFrom(zipStream);
            }
            zipEntry = zipStream.getNextEntry();
        }
    }
}

В качестве альтернативы вы также можете использовать zip4j, см. Также этот question.

person Volker Stampa    schedule 30.05.2014