java - 有效使用文件系统列出存储在资源中的 zip 文件条目

标签 java file-io java-7 zip

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);

我错过了什么吗?

最佳答案

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

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

这就是 Java WebStart 之类的代码下载并缓存文件的原因。

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

关于java - 有效使用文件系统列出存储在资源中的 zip 文件条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18576756/

相关文章:

java - FileNotFoundException,文件存在 Java

C 编程项目

java - Java 7 中是否有等效的 getRequestedServerNames()?

java - Axon从2.4.3版本迁移到3.1.1有什么具体方法

java - 在 JMeter 中使用带有外部 SDK 的 Guava Optional

java - Android Lint 提示 ActionBar 可能出现 NullPointerException

java - 尝试运行 Vogella.de JPA 教程时,我不断收到 "No Persistence provider for EntityManager"

java - Mac 版 Java 中的文件输入

java - JDK 日期/时间的问题是否已修复,或者是否仍被视为已损坏?

java - UseG1GC选项在仅安装JRE的系统中起作用吗?