当前位置:  开发笔记 > 编程语言 > 正文

从ZipInputStream读取到ByteArrayOutputStream

如何解决《从ZipInputStream读取到ByteArrayOutputStream》经验,为你挑选了2个好方法。

我试图从a读取一个文件java.util.zip.ZipInputStream,并将其复制到一个java.io.ByteArrayOutputStream(这样我就可以创建一个java.io.ByteArrayInputStream并将其交给第三方库,最终关闭流,我不希望我ZipInputStream关闭) .

我可能在这里遗漏了一些基本内容,但我从未在这里输入while循环:

ByteArrayOutputStream streamBuilder = new ByteArrayOutputStream();
int bytesRead;
byte[] tempBuffer = new byte[8192*2];
try {
    while ((bytesRead = zipStream.read(tempBuffer)) != -1) {
        streamBuilder.write(tempBuffer, 0, bytesRead);
    }
} catch (IOException e) {
    // ...
}

我错过了哪些可以让我复制流?

编辑:

我之前应该提到这ZipInputStream不是来自文件,所以我认为我不能使用ZipFile.它来自通过servlet上传的文件.

此外,我已经调用getNextEntry()ZipInputStream之前获取此代码片段.如果我不尝试将文件复制到另一个文件中InputStream(通过OutputStream上面提到的),并且只是将文件传递ZipInputStream给我的第三方库,那么库将关闭流,而我无法做更多的事情,比如处理剩下的文件流.



1> Benedikt Wal..:

你可能试过这样读FileInputStream:

ZipInputStream in = new ZipInputStream(new FileInputStream(...));

将不工作,因为一个zip压缩包可以包含多个文件,你需要指定读取的文件.

您可以使用java.util.zip.ZipFile和一个库,例如来自Apache Commons IO的IOUtils或来自Guava的ByteStreams,它们可以帮助您复制流.

例:

ByteArrayOutputStream out = new ByteArrayOutputStream();
try (ZipFile zipFile = new ZipFile("foo.zip")) {
    ZipEntry zipEntry = zipFile.getEntry("fileInTheZip.txt");

    try (InputStream in = zipFile.getInputStream(zipEntry)) {
        IOUtils.copy(in, out);
    }
}



2> Kevin Day..:

你的循环看起来有效 - 下面的代码(只是它自己的)会返回什么?

zipStream.read(tempBuffer)

如果它返回-1,那么zipStream会在你获得之前关闭,所有的赌注都会关闭.是时候使用你的调试器并确保传递给你的是真正有效的.

当你调用getNextEntry()时,它是否返回一个值,并且条目中的数据是否有意义(即getCompressedSize()是否返回有效值)?如果您只是阅读没有嵌入预读zip条目的Zip文件,那么ZipInputStream将不适合您.

关于Zip格式的一些有用的花絮:

嵌入在zip文件中的每个文件都有一个标题.此标头可以包含有用的信息(例如流的压缩长度,它在文件中的偏移量,CRC) - 或者它可以包含一些基本上说'信息不在流标题中的魔术值,你必须检查Zip post-amble'.

然后每个zip文件都有一个附加到文件末尾的表,其中包含所有zip条目以及实际数据.最后的表是必需的,其中的值必须正确.相反,不必提供嵌入在流中的值.

如果您使用ZipFile,它会读取zip末尾的表格.如果您使用ZipInputStream,我怀疑getNextEntry()尝试使用流中嵌入的条目.如果未指定这些值,则ZipInputStream不知道流可能有多长.inflate算法是自终止的(你实际上不需要知道输出流的未压缩长度以便完全恢复输出),但是这个读者的Java版本可能不能很好地处理这种情况.

我会说让servlet返回ZipInputStream是相当不寻常的(如果你要接收压缩内容,接收inflatorInputStream会更常见.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有