在我的Android应用程序中,我需要查找目录中是否存在某种格式的文件。我编写了代码并且运行良好,但是如果目录中有太多目录,每个目录都有很多文件和目录,那就会变得有点慢。
注意:我还在计算目录
中的总txt文件这是我的代码
int count = 0;
private boolean containsTXT(File file) {
boolean result = false;
String fList[] = file.list();
if (fList == null)
return false;
else {
for (int i = 0; i < fList.length; i++) {
File file = new File(file, fList[i]);
if (file.isFile() && (file.getName().endsWith("txt"))) {
result = true;
count++; // This counts total txt files in the dir
} else if (file.isDirectory()) {
result = containsTXT(file);
}
}
}
return result;
}
我基本上遵循最常规的方法,但有些应用程序执行的工作与我在我的应用程序中尝试的工作相同并且速度更快。有谁知道这个任务的更好的方法或算法?谢谢!!
答案 0 :(得分:2)
你可以使用apache commons io library。特别是FileUtils.listFiles静态方法
Collection<File> allTxtFiles = FileUtils.listFiles(folder, new String[]{"txt"}, true)
int count = allTxtFiles.size();
不确定它是否会更快,但通常使用非常流行的开源库而不是重新发明轮子是一种好习惯,因为:
试一试,看看它是否适合你。
答案 1 :(得分:1)
这里稍微修改了您的代码以使用短路评估:
private boolean containsTXT(File file) {
String fList[] = file.list();
if (fList == null)
return false;
for (int i = 0; i < fList.length; i++) {
File file = new File(file, fList[i]);
if (file.isFile() && (file.getName().endsWith("txt")))
return true;
if (file.isDirectory() && containsTXT(file))
return true;
}
return false;
}
答案 2 :(得分:1)
您可以使用FileUtils中的Apache Commons I/O递归搜索目录并获取以.txt结尾的文件名。本评论中给出了一个例子。
答案 3 :(得分:0)
通过将遍历期间遇到的文件保存在FIFO类型的列表中,可以使其迭代而不是递归。
在列表末尾添加当前遍历目录中的所有文件。 从头部删除当前正在遍历的文件。
private boolean containsTXT(File rootPath) {
boolean result = false;
LinkedList<File> fileFIFO = new LinkedList<>();
fileFIFO.add(rootPath); //Add root path to the fifo list
//Traverse the FIFO linkedlist until it's empty
while(!fileFIFO.isEmpty()){
File file = fileFIFO.poll(); //Retrieve item from the head
System.out.println(file.getAbsolutePath()+"\n");
if(file.isDirectory()){ //If retrieved item from fifo list is a directory
File[] filesInDir = file.listFiles();
if(filesInDir != null){
fileFIFO.addAll(Arrays.asList(file.listFiles())); //Add all files in directory to fifo
}
}else if(file.isFile() && (file.getName().endsWith("txt"))){
result = true;
break;
}
}
System.out.println("ContainsTXT: "+result);
return result;
}
使用FIFO类型列表的原因是,以我们想要的方式对遍历子目录进行排序。