我有一个嵌套文件夹的结构
我想删除包含名称"_bla"的结构中的所有文件(而不是文件夹)
这是我的代码,但很麻烦
你知道有什么更整洁的方法吗?
cleanDirectoryAccordingToBlackList(Constants.RESOURCES_PATH, ImmutableList.of("_bla"));
和
public void cleanDirectoryAccordingToBlackList(String root, List<String> blackList) {
File dir = new File(root);
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeFilesInDirectory(aFile, blackList);
}
}
}
}
public void removeFilesInDirectory(File file, List<String> blackList) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (File aFile : files) {
removeFilesInDirectory(aFile, blackList);
}
}
} else {
for (String name : blackList) {
if (file.getName().contains(name)) {
file.delete();
}
}
}
}
这里有一个使用java-8 的解决方案
public static void main(String[] args) throws Exception {
Files.walk(Paths.get("D:\"), FileVisitOption.FOLLOW_LINKS)
.filter(f -> f.toFile().isFile() &&
f.getFileName().toString().contains("fresh"))
.forEach(f -> {
try{
Files.delete(f);
} catch (IOException ioe) {
ioe.printStackTrace();
}
});
}
您可以用Java 8流优雅地做到这一点:
List<File> filesToDelete =
Files.walk(Paths.get("root"))
.map(Path::toFile)
.filter(file -> file.getName().contains("_fresh"))
.collect(Collectors.toList());
或者让它更通用:
cleanMatchingFilesUnderRoot(file -> file.getName().contains("_fresh"));
public void cleanMatchingFilesUnderRoot(String root, Predicate<File> predicate) {
Files.walk(Paths.get(root))
.map(Path::toFile)
.filter(predicate.and(File::isFile))
.forEach(file -> {
try {
boolean deleted = file.delete();
LOG.warn(file.getAbsolutePath() + " was not deleted");
} catch (IOException e) {
LOG.warn(file.getAbsolutePath() + " could not be deleted", e);
}
});
}
我提出了一个异常处理,但您可能需要根据您的用例进行其他选择。