Java 查找目录中存在的特定格式的总文件的最有效方法

Java 查找目录中存在的特定格式的总文件的最有效方法,java,algorithm,file-search,Java,Algorithm,File Search,在我的android应用程序中,我需要查找目录中是否存在某种格式的文件。我写了代码,它工作得很好,但如果目录有太多的目录,其中每个目录都有许多文件和目录,它会变得有点慢 注意:我还在计算目录中的txt文件总数 这是我的密码 int count = 0; private boolean containsTXT(File file) { boolean result = false; String fList[] = file.list(); if

在我的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;
    }
int count=0;
私有布尔containsTXT(文件){
布尔结果=假;
字符串fList[]=file.list();
if(fList==null)
返回false;
否则{
for(int i=0;i

我基本上遵循最通用的方法,但有些应用程序与我在应用程序中尝试做的工作相同,而且速度更快。有人知道更好的方法或算法来完成这项任务吗?谢谢

以下是您的代码,稍作修改,以使用短路评估:

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;
}
private boolean containsTXT(文件){
字符串fList[]=file.list();
if(fList==null)
返回false;
for(int i=0;i
通过将遍历过程中遇到的文件保存在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;
}
private boolean containsTXT(文件根路径){
布尔结果=假;
LinkedList fileFIFO=新LinkedList();
fileFIFO.add(rootPath);//将根路径添加到fifo列表
//遍历FIFO链接列表,直到其为空
而(!fileFIFO.isEmpty()){
File File=fileFIFO.poll();//从头部检索项目
System.out.println(文件.getAbsolutePath()+“\n”);
if(file.isDirectory()){//if从fifo列表中检索到的项是一个目录
File[]filesInDir=File.listFiles();
if(filesInDir!=null){
fileFIFO.addAll(Arrays.asList(file.listFiles());//将目录中的所有文件添加到fifo
}
}else if(file.isFile()&&(file.getName().endsWith(“txt”)){
结果=真;
打破
}
}
System.out.println(“ContainsTXT:+结果”);
返回结果;
}
使用FIFO类型的列表的原因是,子目录的遍历按我们希望的方式排序。

您可以使用from递归搜索目录并获取以.txt结尾的文件名。本评论中给出了一个示例


您可以使用apache commons io库。特别是静态方法

Collection<File> allTxtFiles = FileUtils.listFiles(folder, new String[]{"txt"}, true)
int count = allTxtFiles.size();
Collection allTxtFiles=FileUtils.listFiles(文件夹,新字符串[]{“txt”},true)
int count=allTxtFiles.size();
不确定它是否会更快,但使用非常流行的开源库而不是重新发明轮子通常是一种好做法,因为:

  • 您不应该花时间开发现有功能
  • 它们很可能没有bug,因为已经被很多人使用了很长时间
  • 它们经过了许多经验丰富的程序员的审查,很可能非常高效,并且使用了快速算法等
  • 其他开发人员和您以后更容易阅读它们

  • 试试看它是否适合您。

    不要使用递归。让它迭代而不是递归是一个好的开始,我想说,它是否需要扫描所有内容,或者在找到第一个txt文件时是否可以停止?看起来您可以将
    result=true
    更改为
    return true
    @BrentWashburne,这应该是一个答案。该算法是错误的。@BrentWashburne,很抱歉,它实际上需要是result=true,因为我还在计算目录中的txt文件总数(在我的应用程序中需要),我编辑了代码。谢谢,虽然这是一个优化,但我的需要不止于此。迭代方法会更快吗?