Java 如何递归使用FilenameFilter

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

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

公共类MyFile{
字符串路径;
公共MyFile(字符串路径){
this.path=path;
}
List=newarraylist();
List nameList=newarraylist();
公共列表ListFileRecursive(FilenameFilter fFilter){
文件f1=新文件(路径);
File[]files=f1.listFiles(fFilter);
用于(文件fil:文件){
if(fil.isFile()){
列表。添加(fil);
nameList.add(fil.getName());
}else if(fil.isDirectory()){
this.path=fil.toString();
这个.listFilesRecursive(fFilter);
}
}
集合。排序(名称列表);
退货清单;
}
下面是实现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;
        }
类MyFilenameFilter实现FilenameFilter{
字符串扩展;
公共MyFilenameFilter(字符串扩展){
this.ext=ext;
}
@凌驾
公共布尔接受(文件目录,字符串名称){
//System.out.println(name+“
包hasses.magical.xml.formatter;
导入静态hasses.magical.xml.formatter.UIOut.UIOut;
导入java.io.FilenameFilter;
导入java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.stream.stream;
公共类格式化控制器
{
私有文件名过滤器;
公共格式化控制器(FormatParam设置)
{
超级();
this.settings=设置;
//文件过滤器当然可以是任何旧的FileNameFilter实现
fileFilter=新的MagicFileNameFilter(设置);
}
私有格式化参数设置;
公共整数异常()
{
//在本例中,dir是从占位符设置的,但任何旧字符串都可以
试试(streamwalk=Files.walk(path.get(settings.getDir())){
//若需要,forEach当然可以称为path->formatFile(path,someOtherCoolParam)
walk.filter(path->fileFilter.accept(null,path.toFile().getName()).forEach(this::formatFile);
}捕获(IOE异常){
uiOut(“遍历目录期间发生IOException:%s请检查此目录是否有效”,settings.getDir());
返回-99;
}
返回0;
}
专用void格式文件(路径)
{
if(settings.getVerbose()){
uiOut(“将尝试格式化:%s”,路径);
}
//做格式化之类的。。。
}
}

谢谢你,但在我的例子中,我的工作是专门使用FilenameFilter对象实现一个方法,尽管我知道有更简单的方法来完成这项工作,但我必须使用FilenameFilter类……不过,你知道怎么回事吗?我想你的问题是这行代码this.path=fil.toString();尝试将此作为参数传递,而不是将其作为类memeberAll传递,但这样我就不需要这些对象中的任何字段,因此我将能够删除任何对象,我认为正确吗?如果此方法没有FilenameFilter参数,但有参数的方法没有工作,您不认为这会很奇怪吗?谢谢但是,为了您的帮助,我刚刚解决了一个问题,事实上,这个问题并不是您所指出的:)该方法根据fFilter生成了一个文件数组,这是一个错误的想法,因为如果主文件夹不包含搜索到的文件,则整个数组(基本上该方法由以下部分组成)是空的。因此我删除了初始listFiles()中的一个参数方法和我稍后在循环中进行了比较。:)无论如何,感谢您的帮助!请添加一些注释或说明,而不仅仅是粘贴一些代码。好的,我认为这是一种自解释的方法。在我的情况下,类构造函数为我的项目创建了一个特定的FilenameFilter。但是,任何FilenameFilter都可以。method excecute递归遍历在给定的目录上(在我的例子中是从给定的占位符,但任何指向目录的旧字符串都可以)。文件名筛选器用于“漫游”中的每个文件。对于通过筛选器的每个文件,我们使用给定的路径调用formatFile方法。澄清:对于将文件名传递给筛选器的每个文件
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;
        }
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...
   }

}