【发布时间】:2009-11-12 15:27:30
【问题描述】:
我有一个包装 ZipEntrys 的类,但我正在努力了解如何编写一个从任何一个 ZipEntry 返回输入流的方法。我设法编写了一些可以返回 ZipFile 的输入流数组的东西,但我需要一种方法来从一个 ZipEntry 获取输入流。
【问题讨论】:
我有一个包装 ZipEntrys 的类,但我正在努力了解如何编写一个从任何一个 ZipEntry 返回输入流的方法。我设法编写了一些可以返回 ZipFile 的输入流数组的东西,但我需要一种方法来从一个 ZipEntry 获取输入流。
【问题讨论】:
这个怎么样?
ZipFile zipFile = new ZipFile("file.zip");
ZipEntry zipEntry = zipFile.getEntry("fileName.txt");
InputStream inputStream = zipFile.getInputStream(zipEntry);
【讨论】:
您没有作为 ZipEntry 来源的 ZipFile 实例吗?如果你这样做,你可以使用 ZipFile.getInputStream(ZipEntry)。
https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipFile.html
PS。只是快速查看了代码,ZipEntry 不是 zip 文件中基础数据的包装器。据我所知,它只是条目的“占位符”(即压缩文件属性而不是数据)。实际流是通过 ZipFile 类中的 JNI 调用创建的。这意味着我不相信您可以以实际的方式做您想做的事情。
【讨论】:
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 文件打开输入流
ZipInputStreamzipInputStream = ZipInputStream(new FileInputStream(zipfile),
运行周期zipInputStream.getNextEntry()。
对于每一轮,您都有当前条目的输入流(之前为 zip 文件打开过);
..
【讨论】:
ZipFile.getInputStream() 方法更通用,因为它不需要来自实际文件的输入。因此,它可以用来读取内存中的 zip 文件内容。
sc)。