java - 该输入流是否已关闭?

标签 java arrays inputstream apache-commons-compress

在使用org.apache.commons.compress读取嵌入式存档文件时,我遇到了一些非常奇怪的错误,我怀疑是我的经验不足困扰着我。

运行我的代码时,我收到各种截断的 zip 文件错误(以及其他截断的文件错误)。我怀疑这是我对 ArchiveInputStream

的使用
private final void handleArchive(String fileName, ArchiveInputStream ais) {
   ArchiveEntry archiveEntry = null;

   try {
      while((archiveEntry = ais.getNextEntry()) != null) {

         byte[] buffer = new byte[1024];

         while(ais.read(buffer) != -1) {
            handleFile(fileName + "/" + archiveEntry.getName(), archiveEntry.getSize(), new ByteArrayInputStream(buffer));
   } catch(IOException ioe) {
      ioe.printStackTrace();
   }
}

当我执行此操作时,archiveEntry = ais.getNextEntry() 是否有效地关闭了我的 ais,并且有什么方法可以使用 commons 读取嵌入式存档文件的字节压缩?

最佳答案

你做了一些奇怪的事情stuff it seems? For each archieve entry while your reading your archieve您递归地调用读取存档方法,这会导致打开下一个存档,而您的父代码仍在处理上一个存档。

在处理压缩文件中的任何新存档条目之前,您应该完全循环遍历存档条目。类似的东西

ArArchiveEntry entry = (ArArchiveEntry) arInput.getNextEntry();
byte[] content = new byte[entry.getSize()];
LOOP UNTIL entry.getSize() HAS BEEN READ {
    arInput.read(content, offset, content.length - offset);
}

the examples on the apache site 中所述

关于java - 该输入流是否已关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18065623/

相关文章:

java - 在 ListView 元素内绘制到 Canvas

php - 获取通过 mysql 搜索创建的数组中元素的位置 - PHP

java - 如何从 ActivityGroup 调用 ActivityGroup 的子 Activity 中的非静态方法?

java - 对 Java 插件控制面板的编程访问

javascript - 从三个数组创建对象

java - 运行 .jar 时的 getResourceAsStream 文件路径

java - 将输入流转换为文件

java - Android 上通过蓝牙进行数据处理导致数据完整性不佳

java - 使用正则表达式对字符串的各个部分进行分组

arrays - 使用较小的向量在 Matlab 中填充向量