好吧,我读了很多东西,但是我没有弄清楚如何根据文件扩展名过滤文件夹(目录和子目录),例如,我想要仅包含“ .mp3”的文件夹(目录和子目录)列表”或“ .mp4”文件,并且我不希望使用Walk.Tree,如果有通过“ filenameFilter”或除Walk.tree方法以外的任何其他方式的方法。
这是到目前为止我尝试过的代码,没有错误,但也没有过滤特定文件的文件夹。它显示所有文件夹。
提前致谢。
File[] ff = f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".mp3") || new File(dir.toPath().toString(),name).isDirectory();
}
});
这是一个简单的控制台应用程序。
该算法如下所示:
public class MyApp {
public static void main(String[] args) {
File rootDir = new File("src/main/resources/dir1");
List<File> filesListWithValidExtension = new ArrayList<>();
recursiveSearch(rootDir, filesListWithValidExtension);
if (filesListWithValidExtension.size() == 0) {
System.out.println("Specified root directory has no file with mp3 extension");
return;
}
Set<File> requiredFolders = new HashSet<>();
for (File fileWithValidExtension : filesListWithValidExtension) {
File parent;
do {
parent = fileWithValidExtension.getParentFile();
if (requiredFolders.contains(parent)) {
break;
} else {
requiredFolders.add(parent);
fileWithValidExtension = parent;
}
}
while (!parent.getPath().equals(rootDir.getPath()));
}
System.out.println("Printing folders (from root) containing mp3 files");
recursivePrint(rootDir, requiredFolders);
}
private static void recursiveSearch(File file, List<File> filesListWithvalidExtension) {
if (!file.exists()) {
return;
}
if (file.isDirectory()) {
for (File f : file.listFiles()) {
recursiveSearch(f, filesListWithvalidExtension);
}
}
if (file.getName().toLowerCase().endsWith(".mp3")) {
filesListWithvalidExtension.add(file);
}
}
private static void recursivePrint(File file, Set<File> requiredFolders) {
if (!requiredFolders.contains(file)) {
return;
}
System.out.println(file.getPath());
for (File f : file.listFiles()) {
recursivePrint(f, requiredFolders);
}
}
}
该程序输出如下:
Printing folders (from root) containing mp3 files
src/main/resources/dir1
src/main/resources/dir1/dir12
src/main/resources/dir1/dir11
src/main/resources/dir1/dir11/dir111
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句