【问题标题】:Recursive method to search through folder tree and find specific file types递归方法搜索文件夹树并查找特定文件类型
【发布时间】:2012-09-21 07:35:10
【问题描述】:

所以我正在编写一个代码来定位蛋白质数据库中的某些信息。我知道递归文件夹搜索是找到这些文件的最佳方法,但我对这种语言非常陌生,并且被告知用 Java 编写(我通常使用 C++)

这么说来,我会用什么方法:

首先:找到桌面上的文件夹
第二:打开每个文件夹和那个文件夹子文件夹
第三:找到以“.dat”类型结尾的文件(因为这些是唯一存储蛋白质信息的文件

感谢您提供的所有帮助

【问题讨论】:

标签: java recursion directory subdirectory


【解决方案1】:
  1. java.io.File“文件和目录路径名的抽象表示”
  2. File.listFiles 提供目录中包含的所有文件的列表(如果 File 对象代表一个目录)
  3. File.listFiles(FileFilter) 让您能够根据需要过滤文件列表

那么,有了这些信息……

您可以使用类似...的方式指定路径位置

File parent = new File("C:/path/to/where/you/want");

您可以检查File 是一个包含...的目录

if (parent.isDirectory()) {
    // Take action of the directory
}

您可以通过...列出目录的内容

File[] children = parent.listFiles();
// This will return null if the path does not exist it is not a directory...

你可以用类似的方式过滤列表...

File[] children = parent.listFiles(new FileFilter() {
        public boolean accept(File file) {
            return file.isDirectory() || file.getName().toLowerCase().endsWith(".dat");
        }
    });
// This will return all the files that are directories or whose file name ends
// with ".dat" (*.dat)

其他有用的方法包括(但不限于)

【讨论】:

  • 很好的解释和结构!
【解决方案2】:

使用递归 foldr 搜索并使用函数 endsWith() 来查找 .bat 文件,然后您可以使用任何字符串函数来查找您需要的信息。

【讨论】:

    【解决方案3】:

    这样的事情可以解决问题:

    public static void searchForDatFiles(File root, List<File> datOnly) {
        if(root == null || datOnly == null) return; //just for safety   
        if(root.isDirectory()) {
            for(File file : root.listFiles()) {
                searchForDatFiles(file, datOnly);
            }
        } else if(root.isFile() && root.getName().endsWith(".dat")) {
            datOnly.add(root);
        }
    }
    

    此方法返回后,传递给它的List&lt;File&gt; 将填充您目录的.dat 文件,以及所有子目录(如果我没记错的话)。

    【讨论】:

    • 这很棒。非常干净和容易。因此,一旦我实现了这一点,我将需要通过一个方法运行“.dat”,该方法通过一个循环运行字符串,该循环检查它的某些数据,然后将该数据放入另一个名为蛋白质的类中。因此,在 else if(root.isFile() && root.getName().endsWith(".dat")) 中,我必须添加什么才能调用 .dat 上的其他方法
    • 这也会检查整个树的所有 .dat 吗?
    • 是的,它将处理所有的 .dat-s。如果要收集它们,请将添加一个集合作为参数(例如 List),并将文件添加到 else if 分支中
    • root.isFile() 部分在else 部分中真的有必要吗?我可能在这里忘记了一些重要的事情,但是,通过输入 else 部分,这是文件不是文件夹的结果,您不是天生就已经确定文件是文件吗?
    【解决方案4】:

    您应该看看 Java File API。特别是您应该查看listFiles method 并编写FileFilter 来选择目录,当然还有您感兴趣的文件。

    返回所有符合您条件的文件的方法(假设您实现了FileFilter)是这样的:

    List<File> searchForFile(File rootDirectory, FileFilter filter){
        List<File> results = new ArrayList<File>();
        for(File currentItem : rootDirectory.listFiles(filter){
          if(currentItem.isDirectory()){
              results.addAll(searchForFile(currentItem), filter)
          }
          else{
              results.add(currentItem);
          }
        }
        return results;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-02
      • 2017-08-17
      • 2014-04-09
      • 2013-01-02
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多