我认为您可以利用[ Zip文件系统提供程序 ] [1]来实现这一目标。使用FileSystems.newFileSystem
它时,您可以将该ZIP中的对象视为“常规”文件。
在上面的链接文档中:
在传递给FileSystems.newFileSystem
方法的java.util.Map对象中指定zip文件系统的配置选项。有关zip文件系统的提供程序特定的配置属性的信息,请参见[Zip文件系统属性] [2]主题。
有了zip文件系统的实例后,就可以调用[ java.nio.file.FileSystem
] [3]和[ java.nio.file.Path
] [4]类的方法来执行诸如复制,移动和重命名文件以及修改文件属性之类的操作。
jdk.zipfs
[Java 11状态] [5]中的模块文档:
zip文件系统提供程序将zip或JAR文件视为文件系统,并提供了处理文件内容的功能。FileSystems.newFileSystem
如果已安装,则可以通过[ ] [6] 创建zip文件系统提供程序。
这是我使用您的示例资源做的人为示例。请注意,a .zip
是a .jar
,但您可以修改代码以改用classpath资源:
建立
cd /tmp
mkdir -p x/y/z
touch x/y/z/{a,b,c}.html
echo 'hello world' > x/y/z/d
zip -r example.zip x
爪哇
import java.io.IOException;
import java.net.URI;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.Collections;
import java.util.stream.Collectors;
public class MkobitZipRead {
public static void main(String[] args) throws IOException {
final URI uri = URI.create("jar:file:/tmp/example.zip");
try (
final FileSystem zipfs = FileSystems.newFileSystem(uri, Collections.emptyMap());
) {
Files.walk(zipfs.getPath("/")).forEach(path -> System.out.println("Files in zip:" + path));
System.out.println("-----");
final String manifest = Files.readAllLines(
zipfs.getPath("x", "y", "z").resolve("d")
).stream().collect(Collectors.joining(System.lineSeparator()));
System.out.println(manifest);
}
}
}
输出量
Files in zip:/
Files in zip:/x/
Files in zip:/x/y/
Files in zip:/x/y/z/
Files in zip:/x/y/z/c.html
Files in zip:/x/y/z/b.html
Files in zip:/x/y/z/a.html
Files in zip:/x/y/z/d
-----
hello world