当前位置: 首页 > 知识库问答 >
问题:

如何使用Java NIO从嵌套zip文件中读取文件

衡泰
2023-03-14

我想从嵌套的zip文件中读取(另一个zip中的zip文件)

a.zip->b.zip->c.txt

以下是测试程序:

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)

共有1个答案

宋涵衍
2023-03-14

您需要第二次使用p(Path)作为参数:

try (FileSystem zipP = FileSystems.newFileSystem(p, null)) {
                                System.out.println("Success :-)");
                            } 
 类似资料:
  • 问题内容: 我必须使用SFTP从ZIP存档(只有一个文件,我知道它的名称)中获取文件内容。我唯一拥有的是ZIP的。大多数示例说明如何使用以下语句获取内容: 但是正如我所说,我的本地计算机上没有ZIP文件,也不想下载它。是够看了? UPD: 这是我的方法: 问题答案: 好吧,我已经做到了: 它可以帮助我阅读ZIP的内容而无需写入另一个文件。

  • 我必须使用SFTP从ZIP存档(只有一个文件,我知道它的名称)获取文件内容。我唯一拥有的是ZIP的InputStream。大多数示例显示了如何使用此语句获取内容: 但正如我所说,我的本地机器上没有ZIP文件,我不想下载它。输入流是否足以读取? UPD:我就是这样做的:

  • 问题内容: 我从SUN网站(http://java.sun.com/developer/technicalArticles/Programming/compression/)找到了示例,但是它返回BufferedOutputStream。但是我想将ZipEntry文件作为InputStream,然后处理下一个文件。那可能吗?我的程序无法访问硬盘,因此它甚至无法临时保存文件。 问题答案: 好吧,只需

  • 我有一个zip文件(在一个jar文件中),我想读取init。我知道我可以使用getResourceAsStream(…)轻松读取txt文件,避免“URI不分层”错误。但现在确定我该如何为zip文件做到这一点。 下面是我的代码,但当我将代码导出到runnable jar并运行它时,它会抛出“URI非层次错误”。

  • 我有一个压缩文件。“test.zip”,其中包含另外两个zip文件-a.zip和b.zip。我只想提取a.zip的内容,而不触及b.zip。 我尝试了下面的代码片段,但还没有找到运气- 请告知如何实现这一目标。

  • 我试图创建一个简单的java程序,从zip文件中读取并提取文件内容。Zip文件包含3个文件(txt、pdf、docx)。我需要阅读所有这些文件的内容,为此我正在使用ApacheTika。 有人能帮我实现这个功能吗。到目前为止,我已经试过了,但没有成功 代码片段