【问题标题】:zip directory with files and subdirectories without the absolute path in Java带有文件和子目录的 zip 目录,没有 Java 中的绝对路径
【发布时间】:2012-02-22 07:02:54
【问题描述】:

我有一个 Java 程序,可以压缩一个目录的所有文件和子目录。它使用绝对路径创建一个 zip 文件,例如 c:\dir1\dirzip\,但我希望它创建的文件只有 de 文件和子目录,而不是绝对路径。 可以帮助我吗? 这是我的代码:

import java.io.*;
import java.util.zip.*;

public class zip {

    public static void main(String argv[]) {
        try {

            ZipOutputStream zos =
                new ZipOutputStream(new FileOutputStream(
                    "c:\\pruebazip\\dancedragons.zip"));

            zipDir("c:\\pruebazip\\dancedragons\\", zos);

            zos.close();
        }
        catch (Exception e) {

        }
    }

    public static void zipDir(String dir2zip, ZipOutputStream zos) {
        try {

            File zipDir = new File(dir2zip);
            // lista del contenido del directorio
            String[] dirList = zipDir.list();
            // System.out.println(dirList[1]);
            byte[] readBuffer = new byte[2156];
            int bytesIn = 0;

            System.out.println(dirList.length);
            // recorro el directorio y añado los archivos al zip
            for (int i = 0; i < dirList.length; i++) {
                File f = new File(zipDir, dirList[i]);
                if (f.isDirectory()) {

                    String filePath = f.getPath();
                    zipDir(filePath, zos);

                    System.out.println(filePath);
                    continue;
                }

                FileInputStream fis = new FileInputStream(f);

                ZipEntry anEntry = new ZipEntry(f.getPath());

                zos.putNextEntry(anEntry);

                while ((bytesIn = fis.read(readBuffer)) != -1) {
                    zos.write(readBuffer, 0, bytesIn);
                }

                fis.close();
            }
        }
        catch (Exception e) {
            // handle exception
        }

    }

}

【问题讨论】:

标签: java directory zip


【解决方案1】:

如果您希望将每个 zip 条目存储在相对于压缩文件夹的目录结构中,那么不要使用文件完整路径构建 ZipEntry:

new ZipEntry(f.getPath());

使用相对于压缩目录的路径构造它:

String relativePath = zipDir.toURI().relativize(f.toURI()).getPath();
new ZipEntry(relativePath);

【讨论】:

    【解决方案2】:

    你的问题可能是声明

    new ZipEntry(f.getPath())
    

    仔细检查 f.getPath() 不是像 C:\dir\... 这样的绝对路径。

    您可能想要new ZipEntry(dirList[i]) 之类的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2014-02-15
      • 2010-12-09
      • 2019-07-02
      • 1970-01-01
      • 2021-01-12
      • 2012-01-24
      相关资源
      最近更新 更多