java - 如何使用 Java NIO 从嵌套的 zip 文件中读取文件
问题描述
我想从嵌套的 zip 文件中读取(另一个 zip 中的 zip 文件)
a.zip -> b.zip -> c.txt
使用 Java NIO 但我得到一个 NullPointerException 为内部 zip 文件创建文件系统。
Java NIO 支持吗?你有什么暗示我做错了什么吗?
这是测试程序:
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class NestedZipTest
{
public static void main(String[] args)
throws IOException, URISyntaxException
{
Path path = Paths.get("c:\\temp\\a.zip");
System.out.println("Open: " + path.toUri());
try (FileSystem zipfs = FileSystems.newFileSystem(path, null))
{
for (Path rootPath : zipfs.getRootDirectories())
{
Files.walk(rootPath).forEach(p -> {
System.out.println("Root-Path " + rootPath + " File: " + p);
if (p.toString().endsWith(".zip"))
{
System.out.println("Try to open nested zip file " + p);
try
{
URI u = p.toUri();
System.out.println("Nested zip file URI: " + u);
try (FileSystem zipP = FileSystems.newFileSystem(u, null))
{
System.out.println("Success :-)");
}
}
catch (Throwable exp)
{
System.err.println("Creating file system for nested zip file failed :-(");
exp.printStackTrace();
}
}
});
}
}
}
}
和输出:
Open: file:///c:/temp/a.zip
Root-Path / File: /
Root-Path / File: /b.zip
Try to open nested zip file /b.zip
Nested zip file URI: jar:file:///c:/temp/a.zip!/b.zip
Creating file system for nested zip file failed :-(
java.lang.NullPointerException
at com.sun.nio.zipfs.ZipFileSystem.<init>(ZipFileSystem.java:103)
at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:117)
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:326)
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:276)
at NestedZipTest.lambda$0(NestedZipTest.java:32)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at NestedZipTest.main(NestedZipTest.java:22)
解决方案
您需要第二次使用 p (Path) 作为参数:
try (FileSystem zipP = FileSystems.newFileSystem(p, null)) {
System.out.println("Success :-)");
}
推荐阅读
- java - ArrayList 列表=新的 ArrayList(); 列表列表=新的 ArrayList(); 两者有什么区别?
- python - 使用 Python Selenium 在 click() 后提取内容
- python - 一个点积示例中的“矩阵未对齐”,但在另一个示例中工作正常
- flutter - Flutter:通过键盘隐藏警报对话框
- css - 应用于一个元素而不是另一个元素时的混合混合模式工作
- javascript - 使用 html、javascript 和 css 从表单中为每个用户输入在 div 中制作特定的错误消息
- python - Python线程类实例更改所有实例的变量
- java - 需要 Eclipse IDE 插件开发帮助:重命名 Active Editor、TextEditor 的文件资源
- javascript - Ramda.js 如何用挖掘对象采摘
- json - 将其他列组合为 JSON 而不聚合