gpt4 book ai didi

java - 从 ZipInputStream 读取到 ByteArrayOutputStream

转载 作者:太空狗 更新时间:2023-10-29 22:39:25 24 4
gpt4 key购买 nike

我正在尝试从 java.util.zip.ZipInputStream 中读取单个文件,并将其复制到 java.io.ByteArrayOutputStream 中(以便我可以然后创建一个 java.io.ByteArrayInputStream 并将其交给最终将关闭流的第 3 方库,我不希望我的 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 上传的文件。

另外,在获取这段代码之前,我已经在 ZipInputStream 上调用了 getNextEntry()。如果我不尝试将文件复制到另一个 InputStream(通过上面提到的 OutputStream),而只是将 ZipInputStream 传递给我的第 3 方library,library 关闭了流,我不能再做任何事情,比如处理流中剩余的文件。

最佳答案

您的循环看起来有效 - 以下代码(仅自身)返回什么?

zipStream.read(tempBuffer)

如果它返回 -1,那么 zipStream 在你得到它之前就被关闭了,所有的赌注都被取消了。是时候使用您的调试器并确保传递给您的内容确实有效。

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

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

压缩文件中嵌入的每个文件都有一个标题。这个头可以包含有用的信息(比如流的压缩长度,它在文件中的偏移量,CRC) - 或者它可以包含一些神奇的值,基本上说“信息不在流头中,你必须检查Zip 后同步码'。

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

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

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

关于java - 从 ZipInputStream 读取到 ByteArrayOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com