2

在我的 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;
    }

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

4

4 回答 4

2

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

Collection<File> allTxtFiles = FileUtils.listFiles(folder, new String[]{"txt"}, true)
int count = allTxtFiles.size();

不确定它是否会更快,但使用非常流行的开源库而不是重新发明轮子通常是一种好习惯,因为:

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

只需尝试一下,看看它是否适合您。

于 2016-04-28T17:54:05.833 回答
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;
}
于 2016-04-28T17:01:13.160 回答
1

您可以使用Apache Commons I/O中的FileUtils递归搜索目录并获取以 .txt 结尾的文件名。此评论中给出了一个示例。

使用Java递归列出目录中的所有文件

于 2016-04-28T17:15:13.830 回答
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 类型的列表的原因是遍历到子目录的顺序是我们想要的。

于 2016-04-28T17:04:54.827 回答