我有一个包装ZipEntrys的类,但是我很难看到如何编写一个从任何一个ZipEntry返回输入流的方法。我设法编写了一些可以为ZipFile返回输入流数组的东西,但是我需要一种方法来从一个ZipEntry获取输入流。
答案 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文件打开);
..