有效使用FileSystems列出存储在资源中的zip文件条目

时间:2013-09-02 15:38:17

标签: java file-io java-7 zipfile

Java 7中的Zip文件可以像文件系统一样对待:
http://fahdshariff.blogspot.cz/2011/08/java-7-working-with-zip-files.html

在我的项目中,我想处理存储在资源中的zip文件。但我找不到任何有效的方法将资源流(getResourceAsStream)直接转换为新的FileSystems对象,而不首先将该文件存储到磁盘:

Map<String, String> nameMap = new HashMap<>();
Path path = Files.createTempFile(null, ".zip");
Files.copy(MyClass.class.getResourceAsStream("/data.zip"), path, StandardCopyOption.REPLACE_EXISTING);

try (FileSystem zipFileSystem = FileSystems.newFileSystem(path, null)) {

    Files.walkFileTree(zipFileSystem.getPath("/"), new NameMapParser(nameMap));
}
Files.delete(path);

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

不,这是不可能的。原因是a)流经常无法读取两次; b)ZIP档案需要随机读取。

文件列表附在最后,因此您需要跳过数据,找到文件条目,找到数据条目的位置,然后向后搜索。

这就是像Java WebStart这样的代码下载和缓存文件的原因。

请注意,您不必将ZIP存档写入磁盘。您可以使用ShrinkWrap创建内存中的文件系统。