我需要一个帮助。
在我们的应用程序中,我们正在通过作业从磁盘空间删除一些目录和文件
有时,由于目录数量众多,此工作需要很多时间,而与此同时
第二次触发,并尝试删除一些已经被删除的文件
第一份工作。结果,我们在for (File file : files)
行中得到了Null Pointer Exception
因为parent.listFiles()
返回null
要解决此问题,我可以添加一个空检查。但是我在想是否可以使用Stream API 因为我认为从性能角度来看,它比其他方法要领先一点(如果我错了,请纠正我)。
所以我的问题是:
在foreach()方法中是否存在任何null检查(如下所述)? 换句话说,使用安全吗?我检查了那个方法但是我没有 了解很多
请建议是否有比此更好的方法。
出现问题的代码:
public void deleteFile(File parent) {
if (parent.isDirectory()) {
File[] files = parent.listFiles();
for (File file : files) {
deleteFile(file);
}
}
parent.delete();
}
解决方案:
Files.walk(rootPath)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.peek(System.out::println)
.forEach(java.io.File::delete);
答案 0 :(得分:0)
forEach是一种方法,如果有数据,即您的案例文件中有数据,该方法将运行,如果没有文件,则控制将脱离forEach。
我们不需要在forEach中检查null。
答案 1 :(得分:0)
没有空检查。 Java中的foreach构造非常适合NullPointerException
File[] files = null;
for (File file : files) {
deleteFile(file);
}
您应该始终检查!!!
if(files !=null) {
for (File file : files) {
deleteFile(file);
}
}
答案 2 :(得分:0)
考虑使用空检查,例如:
Files.walk(rootPath)
.filter(Objects:notNull)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.peek(System.out::println)
.forEach(java.io.File::delete);
但不确定Files.walk如何产生空对象。