黑马程序员技术交流社区

标题: 一个关于IO流中FileFilter接口的问题 [打印本页]

作者: 创造命运    时间: 2014-4-27 16:57
标题: 一个关于IO流中FileFilter接口的问题
昨天晚上在论坛里看到一个问题,意思就是通过使用FileFilter将一个目录下(包括子目录)的所有.txt文件挑选出来。
下面是我写代码:
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
public class Test1{   
        public static void main(String[] args) {
                File file = new File("e:\\JAVA\\String\\Test");
                FileFilterByName ffbn = new FileFilterByName();
                //File[] files = file.listFiles(ffbn);
                //System.out.println(files.length);
                List<File> list = new ArrayList<File>();
                getFileToList(file, list, ffbn);

                for (File file2 : list){
                        System.out.println(file2);       
                }
        }

        private static void getFileToList(File file, List<File> list, FileFilter ffbn) {
                File[] files1 = file.listFiles();
                File[] files2 = file.listFiles(ffbn);
                for (File file1 : files1) {
                        if (file1.isDirectory()) {
                                getFileToList(file1, list, ffbn);
                        }
                }
                for (File file2 : files2)
                {
                        list.add(file2);
                }
        }
}
class FileFilterByName implements FileFilter
{
        /*private File file;
        public FileFilterByName(File file)
        {
                this.file = file;
        }*/
        public boolean accept(File file)
        {
                if (file.getName().endsWith(".txt"))
                {
                        return true;
                }
                return false;
        }
}

以上代码已经实现了上述要求的功能,但是问题不在这里。在这之前我不知道有FileFilter这个接口,所以就慢慢查API文档来做的。
刚开始我在创建一个类实现FileFilter这个接口的时候,代码是这样写的,就是将上面代码的FileFilterByName类中的注释去掉。这样就出问题了,我一直认为没有错,可是我在主函数里用这两句话File[] files = file.listFiles(ffbn);  System.out.println(files.length); 测试,输出的结果总是0。当时就搞郁闷了,不知道问题到底出在哪。然后就在网上找相关问题,后来知道将下面几条代码注释掉就可以了。
        private File file;
        public FileFilterByName(File file)
        {
                this.file = file;
        }

我的问题是:为什么我显示的给accept这个方法传递一个参数,反而不能实现过滤的功能呢?
如果不给accept显示的传递一个参数,那么它的参数又是如何得到的?它的参数所代表的的路径又是什么呢?它是如何获取到该路径的呢?

作者: 362688114    时间: 2014-4-27 18:40
用 递归 可以解决。
作者: 天涯追梦    时间: 2014-4-28 20:41
楼主FileFilter是个抽象类,FileFilterByName 既然是继承的 FileFilter,而FileFilter的构造方法只有FileFilter() ,所以楼主写自定义构造方法private File file;
        public FileFilterByName(File file)
        {
                this.file = file;}
貌似有些不妥吧,

继承FileFilter只是为了创建过滤器,即只需指定过滤器按什么过滤就行了,没必要再把文件创建在过滤器中呀
如果过滤中要想自定义何类型种文件可以这么定义
  1. import java.io.File;
  2. import java.io.FileFilter;

  3. public class FileFilterBySuffix implements FileFilter {

  4.         private String suffix;
  5.        
  6.        
  7.         public FileFilterBySuffix(String suffix) {
  8.                 super();
  9.                 this.suffix = suffix;
  10.         }


  11.         @Override
  12.         public boolean accept(File pathname) {

  13.                 return pathname.getName().endsWith(suffix);
  14.         }

  15. }
复制代码

作者: 天涯追梦    时间: 2014-4-28 20:47
下面是完整代码,楼主可以参考一下
功能:建立指定文件的清单文件。 将指定目录下的指定文件(包含子目录)的绝对路径写入到一个文件中。 该文件就作为指定文件的清单文件。

代码1:
  1. package mytest;

  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileFilter;
  5. import java.io.FileWriter;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8. import java.util.List;

  9. public class TestTest {

  10.        
  11.        
  12. public static void main(String[] args) throws IOException {
  13.         File file = new File ("e:\\");
  14.         File files = new File("e:\\path.txt");
  15.         List <File> list = new ArrayList<File>();
  16.         FileFilterByName filter =new FileFilterByName("txt");
  17.        
  18.         getFileToList(file, list ,filter);
  19.        
  20.   getPath(list,files);
  21.   
  22.         for (File file2 : list) {
  23.                 System.out.println(file2);
  24.                
  25.         }
  26.         }



  27.         private static void getPath(List<File> list, File files) throws IOException {
  28.                 BufferedWriter bw = new BufferedWriter(new FileWriter(files));
  29.                 for (File file : list) {
  30.                         bw.write(file.getAbsolutePath());
  31.                         bw.newLine();
  32.                         bw.flush();
  33.                 }
  34.                 bw.close();
  35.         }



  36.         private static void getFileToList(File file, List<File> list,
  37.                         FileFilterByName filter) {
  38.                 File [] f = file.listFiles();
  39.                 for (File ff : f) {
  40.                         if (ff.isDirectory()) {
  41.                                 getFileToList(ff, list, filter);
  42.                         }
  43.                         else{
  44.                                 if (filter.accept(ff)) {
  45.                                         list.add(ff);
  46.                                 }
  47.                                
  48.                         }
  49.                        
  50.                 }
  51.         }

  52. }
复制代码




代码2:

  1. package mytest;

  2. import java.io.File;
  3. import java.io.FileFilter;

  4. public class FileFilterByName implements FileFilter {

  5.         private String suffix;

  6.         public FileFilterByName(String suffix) {
  7.                 super();
  8.                 this.suffix = suffix;
  9.         }

  10.         @Override
  11.         public boolean accept(File pathname) {
  12.                 // TODO Auto-generated method stub
  13.                 return pathname.getName().endsWith(suffix);
  14.         }

  15. }
复制代码






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