Java使用ZipEntry 读取/解压 ZIP包中 多个/指定 文件与源文件不同的错误
(2016-03-16 13:44:31)
标签:
javaio |
分类: Java |
问题场景:
代码是想把ZIP中的所有文件都解压出来(没有目录结构所以遇到目录不作处理),想法挺简单的,单个文件也不大,就直接zis.read()一次就把单个文件全读出来:
ZipInputStream zis = new ZipInputStream(fileInputStream); while ((entry = zis.getNextEntry()) != null) { } |
结果发现读出的文件的MD5和原来的文件不一致,说明读错了。出错的文件是最大的那个文件。于是写了个非常难看的代码,试图逐1024个字节读出:
ZipInputStream zis = new ZipInputStream(fileInputStream); while ((entry = zis.getNextEntry()) != null) { } |
结果还是不对,调试后发现那个最大的文件读到一定位置之后,后面的全是’0’,而将1024减少到1则不会出错(大于1都会出错)。
错误原因:
是由于zis.read(buf, off, 1024),即使指定一次读1024个字节而且剩余entry字节数大于1024的情况下,读取出的字节数也可能小于1024个。
代码改为:
ZipInputStream zis = new ZipInputStream(fileInputStream); while ((entry = zis.getNextEntry()) != null) { } |