使用try自动关闭流报错排查
一、使用try自动关闭流报错
1.附上自己自动关闭流的代码 try (InputStream is = new FileInputStream("D:\\lx-studyResources\\example.xlsx");OutputStream out = new FileOutputStream("D:\\lx-studyResources\\example.xlsx")){ XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is); //取出第一个工作表 sheet = xssfWorkbook.getSheetAt(0); //设置字体 XSSFFont font = xssfWorkbook.createFont(); font.setColor(Font.COLOR_RED); //设置样式 XSSFCellStyle style = xssfWorkbook.createCellStyle(); style.setFont(font); String value = sheet.getRow(0).getCell(0).getRawValue(); sheet.getRow(0).getCell(0).setCellStyle(style); sheet.getRow(0).getCell(0).setCellValue("lx_pb"); xssfWorkbook.write(out); }catch (Exception e){ e.printStackTrace(); }
2.报错的截图
我的Excel中明明不是空,为啥还会报这个错呢?
我写代码的意图是想读取Excel的内容,然后筛选数据进行修改。如果我按照老版本的jdk的关闭流的写法就不会发生错误,而按照自动关闭的方式就会报错,那么排查的点就先放在自动关闭流这块。
二、问题排查
1.我如果只是输入流自动关闭,不会报错;只自动关闭输出流,文件也会变为空。根据输出流生成文件的规则来说,根据具体路径生成输出流的同时,新的Excel文件就会生成。打断点调试截图如下:
证明推断正确,最新的sheet页没write之前就生成了新的Excel,所以当输入流指定的具体文件和输出流指定的具体文件时同一个的时候,输出流会再生成一次此文件,所以Excel为空,读取sheet页时就会报错。
结论:解决办法就是:要么输出流到一个新的Excel文件,这样就不会出现文件冲突的问题(不是同一个Excel文件);要么就在最新的sheet页生成了,要输出到文件中时,再创建输出流,手动关闭输出流(始终操作的是同一个Excel)。