【问题标题】:Java: How to create a directory in a zip using java.nio.file.FileSystemJava:如何使用 java.nio.file.FileSystem 在 zip 中创建目录
【发布时间】:2015-04-16 12:46:35
【问题描述】:

我已按照this page 告诉我的内容进行操作,但我无法让它工作。我想要它,以便在我的 test.zip 中有一个名为“new”的文件夹。每当我运行下面的代码时,它都会给出FileAlreadyExistsException,并且只会创建一个空的 zip 文件。

    Map<String, String> env = new HashMap<>();
    env.put("create", "true");
    Path path = Paths.get("test.zip");
    URI uri = URI.create("jar:" + path.toUri());
    try (FileSystem fs = FileSystems.newFileSystem(uri, env)) {
        Path nf = fs.getPath("new/");
        Files.createDirectory(path);

    } catch (IOException e) {
        e.printStackTrace();
    }

【问题讨论】:

  • 修复了标题拼写,删除了文件系统标签,因为这是 Java 库文件系统而不是通用文件系统

标签: java nio zipfile


【解决方案1】:

因为Files.createDirectory() 声明在javadoc

抛出 FileAlreadyExistsException - 如果 dir 存在但不是 目录(可选的特定例外)

你需要检查文件夹是否已经存在:

try (FileSystem fs = FileSystems.newFileSystem(uri, env)) {
    Path nf = fs.getPath("new");
    if (Files.notExists(nf)) {
        Files.createDirectory(nf);
    }
}

【讨论】:

    【解决方案2】:

    你试过 java.util.zip.ZipEntry 吗?

    FileOutputStream f = new FileOutputStream("test.zip");
    ZipOutputStream zip = new ZipOutputStream(new BufferedOutputStream(f));
    zip.putNextEntry(new ZipEntry("new/"));
    

    【讨论】:

    • 我之所以要使用 FileSystem 是因为你可以使用它追加到 zip 文件中,据我所知,ZipFile 和 ZipEntry 做不到。
    • 好吧,zipfilesystem 可以与 FileSystem 一起使用,但它是在 java7 中引入的
    • 问题不在于一般如何做,而在于新的 nio API 的具体操作