java代码上一步是把n个结果文件打包,要求是当程序结束后,将除了结果的压缩文件,其他程序运行中生成的单个文件都删除,但在写代码的时候会报一个线程的错,根据debug发现有两个问题,一是结果文件还没有写进压缩包下面的文件就开始删了,整个程序主体处理文件用的定长线程池,不过后面的打包和删除文件在主线程里面,第二个原因也是应为前面处理文件用的多线程所以造成有时候可以删除部分文件,有的时候就报后面显示的错。如果把删除文件的步骤注释掉则功能无异常,有什么可行的解决方法吗?
出问题的是下面的代码
//文件打包成zip
File zipResult = new File(resultPath,"result.zip");
//调用工具类把jieguo_files_arr文件数组打包
FileUtil.zipFiles(jieguo_files_arr,zipResult);
//删掉未打包的文件
File[] deletFiles = new File(resultPath).listFiles();
for (File e : deletFiles ){
if(!e.getName().equals("result.zip")){
e.delete();
}
}
报错如下
Exception in thread "pool-1-thread-1" class com.aspose.pdf.internal.ms.System.lh: An element with the same key already exists in the dictionary.
com.aspose.pdf.internal.ms.System.Collections.Generic.lf.addItem(Unknown Source)
java.lang.NullPointerException: null
at java.io.FileInputStream.(FileInputStream.java:130) ~[na:1.8.0_181]
at com.wy.utils.FileUtil.zipFiles(FileUtil.java:81) ~[communal-1.1.jar:na]
at com.wy.utils.FileUtil.zipFiles(FileUtil.java:105) ~[communal-1.1.jar:na]
at com.wy.worldmatter.service.impl.PDFSServiceImpl.apPdfToDocx(PDFSServiceImpl.java:182) ~[classes/:na]
哎呦我去,解决了,吃午饭的时候,发现在排查问题的时候,有一行关流操作被注释掉了整体运行没取消注释
用countdownlatch等压缩完再删呗
按道理楼上说的没毛病,你确定你们逻辑没问题?如果子线程全部生成完文件然后主线程生成压缩文件并且删除其他文件,你这里不会出现压缩文件都没生成完就去做删除操作的
实在不行可以试试CyclicBarrier
CyclicBarrier 比countdownlatch更强大的点,countdownlatch是主线程阻塞到数据为0后继续在执行,CyclicBarrier 是所有子线程阻塞到某一时候后继续执行,删除文件的操作交给生成文件的子线程自己来处理,阻塞到主线程生成压缩文件后子线程单独去执行删除文件操作,而不是主线程去删除所有文件