IO流关闭问题

SunshineDreamer 2017-03-15 05:05:16
首先,错误是这样的→java.io.IOException: invalid CRC for file:(这里是文件名)
这是一个压缩文件里的其中一个文件,我用的zip4j包来读取。
这个包里有个ZipInputStream,我把它装到InputStreamReader里然后给BufferedReader去读取行。
压缩文件中有许多个子文件,我通过zip4j可以实现直接读取压缩文件中的某个子文件。
我有一个Read类,我在构造器中初始化各个流,,然后在read()方法里进行读取一行操作,最后有一个closeStream()方法专门关闭流,每个流的关闭我都分别单独try-catch。
这样我在其他类里边循环遍历子文件,然后每个子文件循环读取行,读完每个文件后我会调用closeStream()方法。

一开始读两个文件都没问题,但是循环读完第三个文件时,调用closeStream()时报错了!固定到这一步报错,而且是所有流的关闭都报错。求大神解答
...全文
803 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zs808 2017-03-17
  • 打赏
  • 举报
回复
如果方便的话,可以把你“循环读取文件”的这段代码贴上来吗?这要好解决问题。
zs808 2017-03-17
  • 打赏
  • 举报
回复
引用 4 楼 SunshineDreamer 的回复:
[quote=引用 2 楼 zs808 的回复:] CRC校验失败,应该是你的Zip文件包有问题。 CRC是一个用来校验文件完整性的算法,如果CRC校验失败,代表当前文件已经被修改,不可靠。 因为Zip文件的CRC分为Zip文件头CRC与每个文件内容的CRC,你的文件头没问题就可以正确打开该Zip文件,你Zip包中某个文件CRC没问题就可以解压该文件。但是一旦遇到文件CRC错误的,那么就会抛出异常。
那么怎么压缩文件才能避免这个问题,或者说怎么close才能不报错。主要是close [/quote] 你要确保你在调用closeStream的时候已经将文件正确的读取完了。因为当你的文件没有解压完全的时候,调用close()会出错。
zs808 2017-03-16
  • 打赏
  • 举报
回复
而且,CRC计算是在文件解压过程中进行的,在close的时候会进行校验,这也就是为什么你调用close()时出错的原因
zs808 2017-03-16
  • 打赏
  • 举报
回复
CRC校验失败,应该是你的Zip文件包有问题。 CRC是一个用来校验文件完整性的算法,如果CRC校验失败,代表当前文件已经被修改,不可靠。 因为Zip文件的CRC分为Zip文件头CRC与每个文件内容的CRC,你的文件头没问题就可以正确打开该Zip文件,你Zip包中某个文件CRC没问题就可以解压该文件。但是一旦遇到文件CRC错误的,那么就会抛出异常。
  • 打赏
  • 举报
回复
jar包, zip4j包, 测试代码发出来瑟
SunshineDreamer 2017-03-16
  • 打赏
  • 举报
回复
引用 2 楼 zs808 的回复:
CRC校验失败,应该是你的Zip文件包有问题。 CRC是一个用来校验文件完整性的算法,如果CRC校验失败,代表当前文件已经被修改,不可靠。 因为Zip文件的CRC分为Zip文件头CRC与每个文件内容的CRC,你的文件头没问题就可以正确打开该Zip文件,你Zip包中某个文件CRC没问题就可以解压该文件。但是一旦遇到文件CRC错误的,那么就会抛出异常。
那么怎么压缩文件才能避免这个问题,或者说怎么close才能不报错。主要是close
月明星稀灬 2017-03-15
  • 打赏
  • 举报
回复
是不是因为你读取的时候,字符集没设置好

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧