如何从ZipEntry创建输入流

Ste*_*hen 34 java zip

我有一个包装ZipEntrys的类,但我很难看到如何编写一个从任何一个ZipEntry返回输入流的方法.我设法编写了一些可以为ZipFile返回输入流数组的东西,但是我需要一种方法来从一个ZipEntry获取输入流.

Ovi*_*ler 29

这个怎么样?

ZipFile zipFile = new ZipFile("file.zip");
ZipEntry zipEntry = zipFile.getEntry("fileName.txt");       
InputStream inputStream = zipFile.getInputStream(zipEntry);
Run Code Online (Sandbox Code Playgroud)


小智 24

你没有ZipEntry来源的ZipFile实例吗?如果你这样做,你可以使用ZipFile.getInputStream(ZipEntry).

https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipFile.html

PS.只是快速查看代码,ZipEntry不是zip文件中底层数据的包装器.就我所见,它只是一个"占位符"(即压缩文件属性而不是数据).实际流是通过ZipFile类中的JNI调用创建的.这意味着我不相信你能以实际的方式做你想做的事.

  • 如果我没有将其作为文件,但我始终可以重新创建 ZipInputStream(例如,从 Uri)怎么办?是否有可能为 ZipInputStream 的每个条目轻松创建一个 InputStream? (2认同)

小智 7

 static void printInputStream(File zip) throws IOException
    {
        ZipInputStream zin = new ZipInputStream(new FileInputStream(zip));
        for (ZipEntry zipEntry;(zipEntry = zin.getNextEntry()) != null; )
        {
            System.out.println("reading zipEntry " + zipEntry.getName());
            Scanner sc = new Scanner(zin);
            while (sc.hasNextLine())
            {
                System.out.println(sc.nextLine());
            }
            System.out.println("reading " + zipEntry.getName() + " completed");
        }
       zin.close();
    }
Run Code Online (Sandbox Code Playgroud)

它在这里找到:
来自ZipInputStream的ZipEntry的getInputStream(不使用ZipFile类)

误解了从zip文件打开的输入流.解决方案:从zip文件ZipInputStream打开输入流zipInputStream = ZipInputStream(new FileInputStream(zipfile),运行循环zipInputStream.getNextEntry().对于每一轮你都有当前输入的输入流(之前为zip文件打开); ..

  • 该方法比`ZipFile.getInputStream()`方法更通用,因为它不需要来自实际文件的输入。因此,它可用于读取内存中的zip文件内容。 (2认同)
  • 不要忘记关闭扫描仪(`sc`)。 (2认同)