【问题标题】:How to use FilenameFilter recursively如何递归使用 FilenameFilter
【发布时间】:2014-04-15 16:19:18
【问题描述】:

我一直在努力解决与 FilenameFilter 相关的问题。我想将实现 FilenameFilter 的类的一个对象传递给一个方法,该方法递归地将文件传递到文件夹树中。没有作为参数传递的 FilenameFilter 对象的此方法版本可以正常工作,但重载版本不能。问题是它不会递归地进入文件夹树,尽管它应该。也许一个可能的问题与 accept(File dir, String name); 的参数有关。 方法,有两个参数,我不太确定是否以及如何将值传递给它们......我将非常感谢任何帮助...... 附言。 listfilesRecursive(FilenameFilter filter) 方法适用于具有一个参数和一个字段 path

的类 MyFile 的对象
public class MyFile {

String path;
public MyFile (String path) {
    this.path = path;
}

List <File> list = new ArrayList<File> ();
List <String> nameList = new ArrayList <String> ();

 public List <File> listFilesRecursive(FilenameFilter fFilter) {

        File f1 = new File(path);

        File [] files = f1.listFiles(fFilter);

        for (File fil : files) {

            if (fil.isFile()) {
            list.add(fil);
            nameList.add(fil.getName());
        } else if (fil.isDirectory()) {
            this.path = fil.toString();
            this.listFilesRecursive(fFilter);

            }
        }
        Collections.sort(nameList);
        return list;
 }

下面是实现 FilenameFilter 的类:

class MyFilenameFilter implements FilenameFilter {

    String ext;
public MyFilenameFilter (String ext) {
    this.ext = ext;
}
@Override
    public boolean accept(File dir, String name) {
//      System.out.println(name + " <<<<<<<<<<");
        if(name.lastIndexOf('.')>0)
           {
              int lastIndex = name.lastIndexOf('.');
              String str = name.substring(lastIndex);

              if(str.equals(ext))
              {
                 return true;
              }
           }
           return false;
        }

}

最后,如果我想实现一种方法,通过文件夹选择它们并根据它们的名称过滤它们,FilenameFilter 是一个不错的选择吗?

【问题讨论】:

  • 谢谢你,但就我而言,我的工作是专门使用 FilenameFilter 对象实现一个方法,虽然我知道有更简单的方法来完成这项工作,但我必须使用 FilenameFilter 类...不过,您知道出了什么问题吗?
  • 我认为你的问题是这一行 this.path = fil.toString();尝试将此作为参数传递,而不是将其作为类成员
  • 好吧,但是我不需要这些对象中的任何字段,因此我将能够摆脱任何对象,我认为对吗?如果这个没有 FilenameFilter 参数的方法工作正常而有一个参数的方法没有,你不觉得这很奇怪吗?
  • 感谢您的帮助,但我刚刚解决了实际上不是您指出的问题。 :) 该方法根据 fFilter 创建了一个文件数组,这是一个错误的想法,因为如果主文件夹不包含搜索到的文件,则整个数组(基本上由该方法组成)是空的。所以我删除了初始 listFiles() 方法中的一个参数,并在循环的后面进行了比较。 :) 无论如何感谢您的帮助!

标签: java recursion


【解决方案1】:
package hasses.magical.xml.formatter;
import static hasses.magical.xml.formatter.UIOut.uiOut;

import java.io.FilenameFilter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class FormattingController
{
   private FilenameFilter fileFilter;

   public FormattingController(FormatParam settings)
   {
      super();
      this.settings = settings;
      //File filter  can of course be any old FileNameFilter implementation 
      fileFilter = new MagicFileNameFilter(settings);
   }

   private FormatParam settings;

   public Integer excecute()
   {
      //In this case dir is set from a placeholder but any old string will do
      try (Stream<Path> walk = Files.walk(Paths.get(settings.getDir()))) {
         //forEach can ofcourse be called path->formatFile(path, someOtherCoolParam) if needed 
         walk.filter(path->fileFilter.accept(null, path.toFile().getName())).forEach(this::formatFile);
         
      } catch (IOException e) {
         uiOut("IOException during traverse dir: %s please check this a valid directory",settings.getDir());
         return -99;
      }
      return 0;
   }

   private void formatFile(Path path)
   {
      if(settings.getVerbose()) {
         uiOut("Will attempt to format: %s",path);
      }
      //do formatting or whatever...
   }

}

【讨论】:

  • 请添加一些 cmets 或描述,而不仅仅是粘贴一些代码。
  • 好吧,这有点不言自明。类构造函数在我的情况下为我的项目创建 FilenameFilter。但是,任何 FilenameFilter 都可以。方法 excecute 递归遍历给定目录(在我的情况下,从给定占位符,但任何指向 dir 的旧字符串都可以)。文件名过滤器用于“walk”中的每个文件。对于每个通过过滤器的文件,我们使用给定的路径调用 formatFile 方法。
  • 澄清:对于每个将文件名传递给过滤器的文件
猜你喜欢
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2017-07-23
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多