15

我正在压缩目录的内容,但在尝试打开压缩文件时遇到错误。

谁能告诉我的代码发生了什么?也许我没有分配足够的字节?

查看 zipDirectory() 内部,您会看到我正在压缩包含特殊扩展文件的文件夹。

不确定错误发生在哪里,所以也许有人可以帮助我!

非常感激

    private void zipDirectory() {

       File lazyDirectory = new File(defaultSaveLocation);

       File[] files = lazyDirectory.listFiles();

       for (File file : files) {

          if (file.isDirectory()) {
            System.out.println("Zipping up " + file);
            zipContents(file);
            }
        }       
    }


public static void addToZip(String fileName, ZipOutputStream zos) throws FileNotFoundException, IOException {

    System.out.println("Writing '" + fileName + "' to zip file");

    File file = new File(fileName);
    FileInputStream fis = new FileInputStream(file);
    ZipEntry zipEntry = new ZipEntry(fileName);
    zos.putNextEntry(zipEntry);

    byte[] bytes = new byte[1024];
    int length;
    while ((length = fis.read(bytes)) >= 0) {
        zos.write(bytes, 0, length);
    }

    zos.closeEntry();
    fis.close();

    }

public static void zipContents(File dirToZip) {

    List<File> fileList = new ArrayList<File>();

    File[] filesToZip = dirToZip.listFiles();

    for (File zipThis : filesToZip) {

        String ext = "";

        int i = zipThis.toString().lastIndexOf('.');

        if (i > 0) {
            ext = zipThis.toString().substring(i+1);
        }

        if(ext.matches("cpp|bem|gz|h|hpp|pl|pln|ppcout|vec|xml|csv")){
            fileList.add(zipThis);
        }

    }


    try {
        FileOutputStream fos = new FileOutputStream(dirToZip.getName() + ".zip");
        ZipOutputStream zos = new ZipOutputStream(fos);

        for (File file : fileList) {

            addToZip(file.toString(), zos);

        }

      } catch (FileNotFoundException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
    }

在此处输入图像描述

4

3 回答 3

32

与 Java 中 IO 流的大多数问题一样,您的错误几乎可以肯定是您没有正确关闭流。您需要添加:

zos.finish(); // good practice
zos.close();

在 for 循环之后。

于 2013-06-11T23:57:48.500 回答
3

对我来说,解决方法是您需要为每个文件条目执行此操作

zos.finish()
zos.flush()
zos.closeEntry()

然后再做以上的事情来关闭zos。否则,默认窗口无法正确打开压缩文件夹,但第三方应用程序可以正常工作。

于 2017-11-10T22:42:00.747 回答
0

如果您使用面向字符的编写器(例如 FileWriter)来创建解压缩文件(实际上包含二进制数据),也可能会发生这种情况

我无法读取我正在提取并切换到二进制输出流 (FileOutputStream) 的文件解决了这个问题

于 2017-12-21T05:25:38.570 回答