Java:如何使用 java.nio.file.FileSystem 在 zip 中创建目录

Posted

技术标签:

【中文标题】Java:如何使用 java.nio.file.FileSystem 在 zip 中创建目录【英文标题】:Java: How to create a directory in a zip using java.nio.file.FileSystem 【发布时间】: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 库文件系统而不是通用文件系统 【参考方案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 的具体操作

以上是关于Java:如何使用 java.nio.file.FileSystem 在 zip 中创建目录的主要内容,如果未能解决你的问题,请参考以下文章

Java技术_Java千百问(0018)_switch如何使用

JAVA中的Debug如何使用

如何使用 JAVA_OPTS 环境变量?

JAVA中 如何使用延迟?

java 中如何使用sql插入语句

Java技术_Java千百问(0020)_break与contine分别如何使用