【发布时间】:2015-01-30 15:50:15
【问题描述】:
我有一些现有的代码可以创建 Epub 2 格式的 zip 文件,它可以正常工作。
在尝试更新我的代码以支持 Epub 3 格式时,我想我会尝试使用 Java NIO Zip 文件系统而不是 java.util.zip.ZipFile。除了一件小物件外,我几乎到了。
Epub 格式需要一个 20 字节的 mimetype 文件,必须以未压缩的形式放入 zip 中。 java.util.zip.ZipEntry api 提供了setMethod(ZipEntry.STORED) 来实现这一点。
我在 Java NIO FileSystem API 文档中找不到对此的任何引用。有没有 ZipEntry.setMethod() 的等价物?
编辑 1
好的,我知道了如何显示属性,感谢您提供的示例,但我找不到任何关于如何创建属性的文档,例如 (zip:method,0 ),甚至在 Oracle 自己的 oracle 上。在我看来,Java 7 中的 NIO 增强功能只记录了大约 20%。 attributes 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。
【问题讨论】:
标签: java zip compression nio