Java 复制\u属性不适用于Zip文件系统

Java 复制\u属性不适用于Zip文件系统,java,nio,Java,Nio,使用Java nio文件时,Zip文件系统不会复制文件属性。使用StandardCopyOption.copy\u attributes复制方法。应该是吗 下面的示例代码演示了这个问题。它将两个文件复制到一个zip文件中:一个是普通文件,另一个是只读文件。如果您随后列出zip文件(例如使用7-zip),您将看到它们都是普通文件,而不是只读文件 public static void main(String[] args) throws Exception { Path tmpdir = F

使用Java nio
文件时,Zip文件系统不会复制文件属性。使用
StandardCopyOption.copy\u attributes
复制
方法。应该是吗

下面的示例代码演示了这个问题。它将两个文件复制到一个zip文件中:一个是普通文件,另一个是只读文件。如果您随后列出zip文件(例如使用7-zip),您将看到它们都是普通文件,而不是只读文件

public static void main(String[] args) throws Exception {
    Path tmpdir = Files.createTempDirectory(null);
    createFiles(tmpdir);
    createZip(tmpdir);
}

private static void createFiles(Path tmpdir) throws IOException {
    Files.write(tmpdir.resolve("a.txt"), Collections.singleton("Hello, world! (a)"));
    Files.write(tmpdir.resolve("b.txt"), Collections.singleton("Hello, world! (b)"));
    Files.setAttribute(tmpdir.resolve("b.txt"), "dos:readonly", true);
}

private static void createZip(Path dir) throws IOException
{
    Path zip = dir.resolve("data.zip");
    URI uri = URI.create("jar:" + zip.toUri());
    try (FileSystem fs = FileSystems.newFileSystem(uri, Collections.singletonMap("create", "true"))) {
        for (Path path : Files.newDirectoryStream(dir))
            if (!path.equals(zip)) {
                String name = path.getFileName().toString();
                Files.copy(path, fs.getPath(name), StandardCopyOption.COPY_ATTRIBUTES);
            }
    }
}