黑马程序员技术交流社区

标题: 关于使用FilenameFilter的问题 [打印本页]

作者: 邱本超老师    时间: 2011-11-6 22:00
import java.io.File;
import java.io.IOException;
public class TestReadSubDirectory {
  public static void main(String[] args) throws IOException {
    TestReadSubDirectory p = new TestReadSubDirectory();
    p.read("\\user\\123\\1");
  }
  public void read(String filepath) throws IOException {
    File f = new File(filepath);// 定义文件路径
    if (f.exists() && f.isDirectory()) {// 判断是文件还是目录
      if (f.listFiles().length == 0) {// 若目录下没有文件则直接操作
        // f.delete(); 对空目录的操作
      } else {// 若有则把文件放进数组,并判断是否有下级目录
        File file[] = f.listFiles();
        int i = f.listFiles().length;
        for (int j = 0; j < i; j++) {
          if (file[j].isDirectory()) {
            // 对当前目录的操作
            read(file[j].getAbsolutePath());// 递归调用del方法并取得子目录路径
          }
          // 对文件的操作/
        }
      }
      read(filepath);// 递归调用
    }
  }
}

作者: 齐国峰    时间: 2011-11-6 22:01
应该改为:

public boolean accept(File dir, String name) {
                 File file = new File(dir,name);
                 if(file.isFile())
                         return file.getName().toLowerCase().endsWith(extName.toLowerCase());
                 else
                         return true;
         }
这样的话是文件就会判断是否采用指定的扩展名结尾.
文件夹就直接返回true,再在你的主程序里递归遍历子目录应该就可以了.

作者: 周敏2011nc    时间: 2011-11-7 11:45
首先你要明白public boolean accept(File dir, String name) 的工作原理 。
该方法就像一个已经封装好了的递归方法,它只便利当前路径下的所有文件(不包含子目录下的文件),目录下有多少个文件,就会便利多少次,如果想要得到子目录下的文件吗,也就是要写一个自己的递归方法嵌套在里面,在递归中写递归,容易会现重复输出,到现在我也没解决这个问题..我的代码......
class MyListFileFilenameFilter implements FilenameFilter{

        public boolean accept(File dir, String name) {
                //System.out.println(2);
                File[] file  = dir.listFiles();
                for(File filename : file){
                        if(filename.isDirectory()){
                                System.out.println(filename);
                                accept(filename,name);
                        }
                        else{
                                         return filename.isFile();
                        }                                       
                }
                return true;       
        }
}
用这个方法实现该功能有很多不便,自己写一个递归更简便。
作者: 喻尚健    时间: 2011-11-7 14:11
public class TestFilter {        
public static void main(String[] args) {                 
        find("d:\\java\\");                 
}   
public static void find(String strPath) {  
        MyFilenameFilter filter=new MyFilenameFilter(".txt");
        File dir = new File(strPath);         
        File[] files = dir.listFiles(filter);               
    if (files == null)            
            return;         
    for (int i = 0; i < files.length; i++) {            
            if (files[i].isDirectory()) {               
                    find(files[i].getAbsolutePath());            
                    }
            else {                 
                    String strFileName = files[i].getAbsolutePath().toLowerCase();               
                    System.out.println("---"+strFileName);                                                                  
                    }        
            }   
    }
}
class MyFilenameFilter implements FilenameFilter{
    private String extName=null;
    public MyFilenameFilter(String extName) {            
            this.extName = extName;
    }
    public boolean accept(File dir, String name) {
            File file = new File(dir,name);  
            if(file.isFile())
            return file.getName().toLowerCase().endsWith(extName.toLowerCase());
            return true;
           
    }   
}
用了你的MyFilenameFilter最后return false;改为return true;





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2