工作代码:

InputStream is  = zipFile.getInputStream(zipArchiveEntry);
BufferedReader br = new BufferedReader(new InputStreamReader(zis));
StringBuilder sb = new StringBuilder();

String line;
while ((line = br.readLine()) != null) {
      System.out.println(line);
}


不起作用的代码

    InputStream is  = zipFile.getInputStream(zipArchiveEntry);

    ZipArchiveInputStream zis = new ZipArchiveInputStream(is);
    if(zis.canReadEntryData(zipArchiveEntry)) {
            // Start
        BufferedReader br = new BufferedReader(new InputStreamReader(zis));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
                System.out.println(line);
        }
}


想法不是从InputStream读取数据,而是尝试从InputStream创建ZipArchiveInputStream,以便可以利用canReadEntryData()方法。 canReadEntryData()可以正常工作。对于正常文件,它返回true,但是我无法从ZipArchiveInputStream读取内容。

请帮忙。请指出我要去哪里。

最佳答案

ZipArchiveInputStreamZipFile

似乎ZipArchiveInputStream有一些限制,如官方documentation所述:


  ZIP存档按顺序存储存档条目,并包含一个
  存档末尾的所有条目的注册表。它是
  可接受包含多个相同名称的条目的存档
  并让注册表(称为中央目录)决定哪个
  该条目实际上是要使用的(如果有)。
  
  此外,ZIP格式仅将某些信息存储在
  中央目录,但不与条目本身一起,是:
  
  
  内部和外部属性
  不同或额外的额外字段
  
  
  这意味着ZIP格式实际上不能正确解析
  读取不可搜索的流,这就是ZipArchiveInputStream
  被迫做。结果ZipArchiveInputStream
  
  
  可能会返回根本不属于中央目录的条目,并且不应将其视为存档的一部分。
  可能会返回多个具有相同名称的条目。
  不会返回内部或外部属性。
  可能会返回不完整的额外字段数据。
  
  
  ZipArchiveInputStream
  java.util.zip.ZipInputStream
  
  ZipFile能够首先读取中央目录并提供
  正确和完整的信息有关任何ZIP存档。
  
  ZIP档案知道一项称为数据描述符的功能,这是一种方法
  在条目数据之后存储条目的长度。这只能工作
  如果可以从中央获取尺寸信息,则可靠
  目录或数据本身可以表明它已完成,这是事实
  使用DEFLATED压缩算法压缩的数据。
  
  ZipFile有权访问中央目录,并且可以提取条目
  可靠地使用数据描述符。情况也是如此
  ZipArchiveInputStream,只要该条目为DEFLATED。对于存储
  条目ZipArchiveInputStream可以尝试先阅读,直到找到
  下一个条目,但是这种方法并不安全,必须通过以下方式启用
  显式的构造函数参数。


结论:


  如果可能的话,您应该始终首选ZipFile而不是ZipArchiveInputStream


我相信,通过ZipFile上面的句子意味着使用通过InputStream创建的ZipFile

InputStream is = zipFile.getInputStream(zipArchiveEntry);

09-26 02:16