首页 > 解决方案 > 从 nio 中的模式或 java 中的文件对象中查找文件名的最快方法

问题描述

我有一个存储了 100 万个文件的位置。我想获取列表中的所有文件,并从该列表中查找文件名中包含单词的所有文件。这里唯一重要的是性能应该非常好。所有的事情都应该很快发生,因此我正在寻找最快的方法。我很困惑是应该使用 java 传统文件对象还是应该使用 NIO。我尝试了如下文件对象:

    String[] fileList = null;
    String fileNamePart = "somepartoffileName";
      try{
        File rootFolder = new File(dir);
        if(rootFolder.isDirectory()){
            fileList = rootFolder.list();

       }
        catch(Exception e){
        System.out.println("Not a valid directory "+dir);
    }

    String[] listFiles = Arrays.stream(fileList).filter(s -> 
    s.contains(FileNamePart)).toArray(String []::new);

有没有更快的方法来实现这一目标?我不介意使用文件数组或来自 nio 的东西,但我的性能应该更快。此外,要匹配的模式可以从 1 到 1000。因此可以匹配一个字符串,或者该字符串可以包含 1000 个逗号分隔值

标签: javajava-8

解决方案


即使按照 Java 8 之前的标准,您的代码也过于复杂。API 规范没有提到为无效目录引发的任何异常(该方法将改为返回)null,因此没有理由添加此异常处理。此外,null如果文件不是目录,则该方法将返回,因此该rootFolder.isDirectory()测试也已过时。

所以,得到一个未经过滤的列表,就像

File rootFolder = new File(dir);
String[] fileList = rootFolder.list();

并且很容易添加过滤器,现在调用File.list(FilenameFilter),使用 Java 8 功能:

File rootFolder = new File(dir);
String[] fileList = rootFolder.list((p, n) -> n.contains(fileNamePart));

推荐阅读