黑马程序员技术交流社区

标题: 关于递归的问题 [打印本页]

作者: 天涯追梦    时间: 2014-4-25 20:30
标题: 关于递归的问题
本帖最后由 天涯追梦 于 2014-4-27 10:42 编辑

下面是自己写的使用递归方法,并经过文件过滤器FileFilter,把指定文件存入集合List中,
可是问什么只存入了根目录的东西,子目录的没存上呢,好像是递归方法没起作用,请问哪里出现错误了,谢谢!

  1. package mytest;

  2. import java.io.File;
  3. import java.io.FileFilter;
  4. import java.util.ArrayList;
  5. import java.util.List;

  6. public class TestTest {

  7.         
  8. public static void main(String[] args) {
  9.         File file = new File ("e:\\abcde");
  10.         List <File> list = new ArrayList<File>();
  11.         FileFilterByName filter =new FileFilterByName(".txt");
  12.         
  13.         getFileToList(file, list ,filter);
  14.         for (File file2 : list) {
  15.                 System.out.println(file2);
  16.                
  17.         }
  18.         }

  19.         private static void getFileToList(File file, List<File> list,
  20.                         FileFilterByName filter) {
  21.                 File [] f = file.listFiles(filter);
  22.                 for (File ff : f) {
  23.                         if (ff.isDirectory()) {
  24.                                 getFileToList(ff, list, filter);
  25.                         }
  26.                         else{
  27.                                 
  28.                                 list.add(ff);
  29.                         }
  30.                         
  31.                 }
  32.         }

  33. }
复制代码




作者: 世界公民    时间: 2014-4-25 20:37
我为什么没有看懂你想问什么问题呢?可以说的再清楚点吗?
而且你的代码也不全,也看不懂你到底想要干什么。。。
作者: 天涯追梦    时间: 2014-4-25 20:50
世界公民 发表于 2014-4-25 20:37
我为什么没有看懂你想问什么问题呢?可以说的再清楚点吗?
而且你的代码也不全,也看不懂你到底想要干什么 ...

代码全啊,我运行过了,我是想通过文件过滤器把一个文件夹中所有指定类型的文件(如以.txt结尾的)都存入一个集合中去,可是结果只存了一部分,子文件夹的内容没存进去,不知道为什么
作者: 世界公民    时间: 2014-4-25 21:20
本帖最后由 世界公民 于 2014-4-25 21:29 编辑

你需要递归所有文件夹,所以你就要得到文件夹下的所有文件对象。具体说明如下

因为你通过过滤只得到了文件对象,而把文件夹对象都给舍弃了,所以你只能得到第一层中的.txt文件对象
要想得到全部的.txt文件对象需要把过滤条件去掉即可:File [] f = file.listFiles();



作者: 你为谁归来    时间: 2014-4-25 22:29
public File[] listFiles(FilenameFilter filter)返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的路径名必须满足过滤器外,此方法的行为与 listFiles() 方法相同。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在此抽象路径名及其表示的目录中的文件名或目录名上调用过滤器的 FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 时,该路径名才满足过滤器。

你上层过滤多了,直接就过滤成.txt了。
作者: 创造命运    时间: 2014-4-27 00:04
本帖最后由 创造命运 于 2014-4-27 00:47 编辑

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");
                List <File> list = new ArrayList<File>();
                getFileToList(file, list);

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

        private static void getFileToList(File file, List<File> list) {
                File[] files = file.listFiles();
                for (File file1 : files) {
                        if (file1.isDirectory()) {
                                getFileToList(file1, list);
                        }
                        else{
                                if (file1.getName().endsWith(".txt"))
                                {
                                        list.add(file1);
                                }
                        }        
                }
        }
}
上面的代码我没有用到过滤器,也实现了你所要求的功能。但是我知道你可能就是想用一下过滤器,我也就试了试,下面是我的代码;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();
                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);
                }
        }
}
//文件过滤类,实现FileFilter接口
class FileFilterByName implements FileFilter
{
        public boolean accept(File file)
        {
                if (file.getName().endsWith(".txt"))
                {
                        return true;
                }
                return false;
        }
}







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