A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 天涯追梦 中级黑马   /  2014-4-25 20:30  /  1010 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 天涯追梦 于 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. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

5 个回复

倒序浏览
我为什么没有看懂你想问什么问题呢?可以说的再清楚点吗?
而且你的代码也不全,也看不懂你到底想要干什么。。。
回复 使用道具 举报
世界公民 发表于 2014-4-25 20:37
我为什么没有看懂你想问什么问题呢?可以说的再清楚点吗?
而且你的代码也不全,也看不懂你到底想要干什么 ...

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

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

  • private static void getFileToList(File file, List<File> list,
  •                         FileFilterByName filter) {
  •                 File [] f = file.listFiles(filter);这句话有问题
因为你通过过滤只得到了文件对象,而把文件夹对象都给舍弃了,所以你只能得到第一层中的.txt文件对象
要想得到全部的.txt文件对象需要把过滤条件去掉即可:File [] f = file.listFiles();
  •                 for (File ff : f) {
  •                         if (ff.isDirectory()) {
  •                                 getFileToList(ff, list, filter);
  •                         }
  •                         else{
  •                                 当然在这里你要判读文件对象是不是以.txt结尾的,如果是你就存起来,不是则不存
  •                                 list.add(ff);
  •                         }
  •                 }
  •         }


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

你上层过滤多了,直接就过滤成.txt了。
回复 使用道具 举报
本帖最后由 创造命运 于 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;
        }
}


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马