工作代码:
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读取内容。
请帮忙。请指出我要去哪里。
最佳答案
ZipArchiveInputStream
与ZipFile
似乎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);