前言
有个前人留下的日志清洗的程序,日志源是gz包的格式,后台拿到gz后进行解压并清洗日志,报错代码如下:
//代码里的file对象即为日之源的gz文件
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new GZIPInputStream(new FileInputStream(file)),decoder))
我将这行代码拆开,分别打断点发现报错出在GZIPInputStream这里。
报错
存在的问题
1、EOFException是什么错误?
2、为什么EOFException的内容是null?
3、为什么会报EOFException?
解决
1、EOFException是什么错误?
当输入过程中意外到达文件或流的末尾时,抛出此异常
2、为什么EOFException的内容是null?
代码里try catch后,会将异常getmessage的内容写入error日志里,但是现在看error日志发现是个null。
下图是EOFException的api内容
3、为什么会报EOFException?
报错得根本原因:存在一个空文件,那么为什么空文件会报EOFException呢,如下:
(1)输入流的read方法读取到文件末尾时,就会返回-1。
(2) 下图是GZIPInputStream的一段源码,也是报错的原因
因为是空文件,这个文件传入到这个方法里(即下图中的InputStream in):如(1)中描述,因为是空文件,所以读取第一个字节时直接到达文件末尾了,即返回-1;如果b=-1,则会抛出EOFException。
教训
这个代码问题太大了,在处理文件前都没有进行判空,即这个文件是不是个空文件。