- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试从 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/
我需要合并两个ByteArrayOutputStream并传递给xdo api TemplateHelper.processTemplate以生成报告 编写以下代码是为了在两个 ByteArrayOu
这个问题在这里已经有了答案: Java - Is ByteArrayOutputStream safe without flush() and close()? (3 个答案) 关闭 6 年前。 有
我在将文件上传到google drive时遇到这个问题,我正在将录制的音频上传到google drive,当时出现了这个异常 用于写入文件内容的代码 Out
我有一堆ByteArrayOutputstreams,在这些流上可以根据特定工作流程的不同部分编写 pdf 报告。我使用 IText 来完成此任务。现在,最后我想将所有这些单个 ByteArrayOu
在下面的函数中,我遇到了数组越界问题。它应该将数字字符串转换为 BCD 格式,如下所示: "12345"-> 0x01 0x23 0x45 。字符串的长度未知。 public void Stringt
我正在编写一个应用程序,它有一个方法可以从我的服务器下载文本文件。该文本文件将包含约 1,000 个代理 IP。下载每 10 分钟进行一次。我需要找到最有效的方法来做到这一点。 目前,我在名为 Con
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
可以将ByteArrayOutputStream存储到其他容器中,例如HashMap吗? 如果不是,我如何合并所有流,然后按条目压缩存档到 1 个文件中。 public class CFr { p
我正在开发一个与签名板交互的小程序。签名板 API 有一个返回 BufferedImage 的函数(假设其名为 API_CALL_TO_RETURN_BUFFERED_IMAGE())。我可以编码为
我有一个用这种方法压缩的目录: public byte[] archiveDir(File dir) { try(ByteArrayOutputStream bos = new ByteA
好的,所以我想要的是将字节写入 dataouptustream 并将该输出流发送出去。这一切我都可以做得很好。我遇到的问题是如何在字节内写入各个位,例如: 我想将LSB(0)写为1,然后剩余的1-7位
我正在编写一个简单的客户端-服务器应用程序,我希望能够获取 Header 类的属性,将它们转换为 byte[],将它们发送到其他主机,然后将它们转换回很容易解析标题。我使用 ByteArrayOutp
我有一个 XmlObject,它具有我需要的正确值。例如:1½-2Y 但是当我尝试将其转换为流字节时,我看到的结果是 1½-2Y。 示例代码: import org.apache.xmlbeans.X
我提出了一个新问题,因为这与我上一个帖子不同。我现在更确切地知道问题是什么。 我创建一个新的 bytearrayoutputstream ByteArrayOutputStream byteArray
我创建了 ByteArrayOutputStream barr = new ByteArrayOutputStream(1);,即容量为 1 个字节并写入超过 1 个字节 barr.write("12
在我从网站下载 RSS 提要数据后,我遇到了编码问题。某些字符无法正确解释。我使用 HttpResponse.getEntity() 并放入循环读取 inputStream 并写入 ByteArray
我使用了非常有用的 ByteArrayOutputStream,但是对于我的需要来说,限制太大了(即我正在处理 +-32,768 范围内的数字) 这是我要使用它的代码: ByteArrayOutput
我有: ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); encoder.encode(question, outpu
我想从进程的输出和错误流中读取并将它们合并到一个文本流中。我的程序是常规的,读起来像这样: def mergeStream = new ByteArrayOutputStream() process.
我需要将多个图像添加到输出流并在 JSF 中显示这些图像。 Ex 代码: List images = list of inputstream - each image is one input str
我是一名优秀的程序员,十分优秀!