java.util.zip.ZipEntry中setMethod()的等效Java NIO Zip文件系统

我有一些现有的代码来创建工作正常的Epub 2格式的zip文件。

在试图更新我的代码以支持Epub 3格式时,我想我会尝试Java NIO Zip文件系统而不是java.util.zip.ZipFile 。 我几乎在那里除了一件小东西。

有一个20字节mimetype必须投入非压缩格式压缩ePub格式所需的文件。 java.util.zip.ZipEntry API提供setMethod(ZipEntry.STORED)来实现这一点。

我在Java NIO FileSystem API文档中找不到任何对此的引用。 有没有相当于ZipEntry.setMethod()

编辑1

好的,所以我看到如何显示属性,并感谢您的示例,但我无法找到任何有关如何创建属性(例如(zip:method,0))的文档,即使在Oracle自己的Oracle上也是如此。 Java 7中的NIO增强似乎只有20%左右的记录。 api doc的属性非常稀疏,特别是如何创建属性。

我开始感受到的是,NIO Zip文件系统可能不是对java.util.zip的改进,并且需要更多代码才能实现相同的结果。

编辑2

我尝试了以下内容:

String contents = "application/epub+zip"; /* contents of mimetype file */
Map<String, String> map = new HashMap<>();
map.put("create", "true");

Path zipPath = Paths.get("zipfstest.zip");
Files.deleteIfExists(zipPath);

URI fileUri = zipPath.toUri(); // here
URI zipUri = new URI("jar:" + fileUri.getScheme(), fileUri.getPath(), null);

try (FileSystem zipfs = FileSystems.newFileSystem(zipUri, map)) {
    Path pathInZip = zipfs.getPath("mimetype");
    Files.createFile(pathInZip, new ZipFileAttribute<Integer>("zip:method", 0));
    byte[] bytes = contents.getBytes();
    Files.write(pathInZip, bytes, StandardOpenOption.WRITE);
    }

ZipFileAttribute类是属性接口的最小实现。 我可以发布它,但它只是一个键值对(名称,值)

这段代码成功创建了zipFile,但是当我用7zip打开zipFile时,我发现mimetype文件作为DEFLATED(8)存储在zip中,而不是我需要的STORED(0)。 所以问题是,我如何正确编码属性,使其存储为STORED。


这没有很好的记录,但JDK的zip文件系统提供程序通过名称zip支持FileAttributeView

这里是我的邮编代码:

public static void main(final String... args)
    throws IOException
{
    final Path zip = Paths.get("/home/fge/t.zip");
    final Map<String, ?> env = Collections.singletonMap("readonly", "true");
    final URI uri = URI.create("jar:" + zip.toUri());

    try (
        final FileSystem fs = FileSystems.newFileSystem(uri, env);
    ) {
        final Path slash = fs.getPath("/");
        Files.readAttributes(slash, "zip:*").forEach( (key, val) -> {
            System.out.println("Attribute name: " + key);
            System.out.printf("Value: %s (class: %s)n", val,
                val != null ? val.getClass(): "N/A");
        });
    }
}

输出:

Attribute name: size
Value: 0 (class: class java.lang.Long)
Attribute name: creationTime
Value: null (class: N/A)
Attribute name: lastAccessTime
Value: null (class: N/A)
Attribute name: lastModifiedTime
Value: 1969-12-31T23:59:59.999Z (class: class java.nio.file.attribute.FileTime)
Attribute name: isDirectory
Value: true (class: class java.lang.Boolean)
Attribute name: isRegularFile
Value: false (class: class java.lang.Boolean)
Attribute name: isSymbolicLink
Value: false (class: class java.lang.Boolean)
Attribute name: isOther
Value: false (class: class java.lang.Boolean)
Attribute name: fileKey
Value: null (class: N/A)
Attribute name: compressedSize
Value: 0 (class: class java.lang.Long)
Attribute name: crc
Value: 0 (class: class java.lang.Long)
Attribute name: method
Value: 0 (class: class java.lang.Integer)

看起来像“zip:方法”属性是你想要的。

所以,如果你想改变方法,如果你有一个到你的zip文件系统的Path ,它看起来像你可以做(​​未测试!):

Files.setAttribute(thePath, "zip:method", ZipEntry.DEFLATED);

基于下面非常有趣的回复,我重新阅读了所有可用的API文档,并尝试了各种设置属性的猜测。 两人都画了一张空白。 我不得不得出这样的结论:这个功能最好没有记录,甚至可能在Java NIO中不可用。 因此,任何想要以EPUB格式创建文件的人都必须继续使用旧的基于ZipFile的API。 另一种方法是使用ZipFile或其他语言创建的shell zip,然后切换到NIO。 这两种选择都是 - 我怎么说 - 有点不雅。 我认为它的目的是随着时间的推移java.io.File成为半弃用的。

链接地址: http://www.djcxy.com/p/24471.html

上一篇: Java NIO Zip Filesystem equivalent of setMethod() in java.util.zip.ZipEntry

下一篇: Is there a reliable way of detecting whether io.js or node.js is running?