原因1:绝大多数都是因为流关闭问题导致的。对文件流操作后要及时关闭。
场景1:
@Test void testDeleteFile2() throws FileNotFoundException { File source = new File("C:\\Users\\HL\\AppData\\Local\\Temp\\test\\test1.jpeg"); InputStream ins = new FileInputStream(source); File target = new File("C:\\Users\\HL\\AppData\\Local\\Temp\\test\\test2.jpeg"); FileUtil.writeFromStream(ins, target); target.delete(); source.delete(); }
target文件删除能成功
source文件删除失败:原因是 source的文件输入流ins没有关闭。
解决办法:1)显示地关闭流
2)try代码块结束时自动关闭流
File source = new File("C:\\Users\\HL\\AppData\\Local\\Temp\\test\\test1.jpeg"); try (InputStream ins = new FileInputStream(source);) { File target = new File("C:\\Users\\HL\\AppData\\Local\\Temp\\test\\test2.jpeg"); FileUtil.writeFromStream(ins, target); target.delete(); } catch (Exception e) { } source.delete();
总结:封装的文件(流处理)方法,在方法级别上应该处理流资源的关闭。否则不容易排查问题。
实战:我们有一个FileUtil 根据流获取md5值,没有做流的关闭,导致 文件delete失败。