如何从ZipEntry创建输入流

时间:2009-11-12 15:27:31

标签: java zip

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

3 个答案:

答案 0 :(得分:28)

这个怎么样?

ZipFile zipFile = new ZipFile("file.zip");
ZipEntry zipEntry = zipFile.getEntry("fileName.txt");       
InputStream inputStream = zipFile.getInputStream(zipEntry);

答案 1 :(得分:24)

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

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

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

答案 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();
    }

这里发现:
getInputStream for a ZipEntry from ZipInputStream (without using the ZipFile class)

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