黑马程序员技术交流社区

标题: 获取指定文件夹下(包含子目录)指定类型文件的集合 [打印本页]

作者: @白纸嘿字@    时间: 2015-10-6 20:11
标题: 获取指定文件夹下(包含子目录)指定类型文件的集合
本帖最后由 @白纸嘿字@ 于 2015-10-6 20:24 编辑

FileFilterBySuffix
  1. package com.itheima.io.filter;

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

  4. public class FileFilterBySuffix implements FileFilter {
  5.         private String suffix;
  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. }
复制代码
FileTest
  1. package com.itheima.io.Test;

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

  6. import com.itheima.io.filter.FileFilterBySuffix;

  7. public class FileTest {

  8.         /**
  9.          * @param args
  10.          */
  11.         public static void main(String[] args) {
  12.                 /*
  13.                  * 获取指定文件夹下(包含子目录)的指定类型的文件的集合。
  14.                  *
  15.                  * 思路:
  16.                  * 1、既然包含子目录,就需要递归。
  17.                  * 2、要求指定类型的文件,在递归中使用过滤器。
  18.                  * 3、满足以上条件,就存储集合中
  19.                  */
  20.                 File dir=new File("I:\\");
  21.                 List<File> list=fileList(dir,".pdf");
  22.                 for (File file : list) {
  23.                         System.out.println(file);
  24.                 }
  25.         }
  26.         /*
  27.          *  获取指定文件夹下指定类型文件集合的功能
  28.          */
  29.         public static List<File> fileList(File dir,String suffix){
  30.                 /*
  31.                  * 建立“容器”对象
  32.                  */
  33.                 List<File> list=new ArrayList<File>();
  34.                 /*
  35.                  * 建立过滤器对象
  36.                  */
  37.                  FileFilter fileFilter=new FileFilterBySuffix(suffix);
  38.                  
  39.                  getFileList(dir, list, fileFilter);
  40.                  
  41.                  return list;
  42.         }
  43.         /**
  44.          * 递归中的每一级都是用同一个“容器”和过滤器,故“容器”和过滤器不能在递归函数中定义,要作为递归函数参数
  45.          *
  46.          * @param dir 被指定的文件夹
  47.          * @param list 存储满足条件的File对象的“容器”
  48.          * @param filter 过滤器(指定类型)
  49.          */
  50.         public static void getFileList(File dir,List<File> list,FileFilter filter){
  51.                 /*
  52.                  * 通过listFiles(),获取dir的所有文件和文件夹对象
  53.                  */
  54.                 File[] files=dir.listFiles();
  55.                 /*
  56.                  * 获取指定文件夹中每一个文件和文件夹
  57.                  */
  58.                 for (File file : files) {
  59.                         /*
  60.                          * 是不是文件夹?是,递归。不是,用过滤器获取指定文件。
  61.                          */
  62.                         if(file.isDirectory()){
  63.                                 getFileList(file, list, filter);
  64.                         }else{
  65.                                 if(filter.accept(file)){
  66.                                         list.add(file);
  67.                                 }
  68.                         }
  69.                 }
  70.         }

  71. }
复制代码

编译没有通过,报告“java.lang.NullPointerException”,可是看了几遍,没有发现问题出在哪?
ps:这个根目录是有的。


作者: fmi110    时间: 2015-10-6 20:11
@白纸嘿字@ 发表于 2015-10-11 20:19
我已经私信版主,但他还没有回复......

谢谢啦   如果没有回复就算了
谢谢哈
作者: 年强    时间: 2015-10-7 14:27
package Demo;

import java.io.*;
import java.util.*;

public class writeListToFile {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                File dir = new File("E:\\");
                List<File> list = new ArrayList<File>();
               
                fileTolist(dir,list);
               
                //System.out.println(list.get(0));
//                System.out.println(list.size());
               
                //备份到文件的操作或输出这里我是写到文件中的,输出太多了
                File filename = new File(dir,"writeToList.txt");
                writeToList(list, filename.toString());
               
        }
       
        public static void fileTolist(File dir,List<File> list)
        {
                File []files = dir.listFiles();
               
                for (File f : files)
                {
                        if (f.isDirectory())
                        {
                                fileTolist(f,list);
                        }
                        else
                        {
                                if (f.getName().endsWith(".java"))
                                {
                                        list.add(f);
                                }
                        }
                }
        }
       
        public static void writeToList(List<File> list,String filename)
        {
                BufferedWriter br = null;
                try {
                        br = new BufferedWriter(new FileWriter(filename));
                        for (File f:list)
                        {
                                String path = f.getAbsolutePath();
                                br.write(path);
                                br.newLine();
                                br.flush();
                        }
                } catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                }
                finally
                {
                        try {
                                if (br!=null)
                                {
                                        br.close();
                                }
                        } catch (Exception e2) {
                                // TODO: handle exception
                                e2.printStackTrace();
                        }
                }               
        }

}



作者: 年强    时间: 2015-10-7 14:29
希望对你有帮助。。。你的程序我也看看了。。。报的是空指针异常,=。。。我也做了处理可是也没出结果。。。重写了一个

作者: kamo    时间: 2015-10-7 17:21
你好
    本人将你的代码复制到本人的机器上,稍作修改(只是改了目录,和结尾文件类型),结果并没用报错,反而成功运行了,运行结果也没什么问题。(截图在附件)
   
   希望能给你参考。

QQ截图20151007171128.png (111.06 KB, 下载次数: 61)

运行结果

运行结果

作者: fmi110    时间: 2015-10-8 15:24
应该把报错的提示贴出来 看看
其实你过滤文件部分不用实现类来处理啊,代码那么简单 写成函数啊

作者: fmi110    时间: 2015-10-8 15:48
按照图片上修改程序就能知道为什么错 了
读取了jvm没有权限处理的文件
我的是读了这个文件  f:\System Volume Information
这个文件在pe下能访问 ,在windows里访问不了,看不到
所以提示空指针异常   你可以通过再过滤 隐藏文件  来避免访问这个文件

1.png (67.32 KB, 下载次数: 61)

1.png

作者: 斑点狗    时间: 2015-10-9 10:07
刚开始我把你的代码拷过来,没改路径时会报空指针异常。我改过我的路径后,[attach]89601[/attach]  ,刚开始程序不显示任何结果,也不报错, ,最后发现都没问题,那些.pdf结尾的都能出来,只是稍等一会,
      ,建议楼主换一个盘的地址试试,代码没错



作者: @白纸嘿字@    时间: 2015-10-9 14:33
本帖最后由 @白纸嘿字@ 于 2015-10-9 14:36 编辑
fmi110 发表于 2015-10-8 15:48
按照图片上修改程序就能知道为什么错 了
读取了jvm没有权限处理的文件
我的是读了这个文件  f:\System Volu ...

我也把这个帖子发在CSDN上,http://bbs.csdn.net/topics/391838608,只要看“我”和“mg2flyingff”之间交流的内容即可,我觉得他讲的有道理,但又解释不了我想问的一个问题——为什么根目录不可以?(在我对他最后的回复中)
作者: fmi110    时间: 2015-10-9 17:26
@白纸嘿字@ 发表于 2015-10-9 14:33
我也把这个帖子发在CSDN上,http://bbs.csdn.net/topics/391838608,只要看“我”和“mg2flyingff”之间交 ...

额 我在论坛回复你了  
根本原因还是因为访问了受保护的隐藏系统文件,没有权限访问时,就会返回null指针,解决方法我也贴在那了,
通过超级管理员登录,然后获取文件夹的访问权限就可以了。我刚刚在自己计算机上试验了,获取权限后不会再报null异常
还有,我上传错了一张图,涉及到敏感信息的,麻烦楼主帮我删了  好像我删除不了。。。郁闷
作者: @白纸嘿字@    时间: 2015-10-10 00:16
fmi110 发表于 2015-10-9 17:26
额 我在论坛回复你了  
根本原因还是因为访问了受保护的隐藏系统文件,没有权限访问时,就会返回null指针 ...

我试了一下,发现我也没有使用编辑功能的权限!后来,看了看《CSDN用户准则》.......

我再试一试联系版主!如果删除了,我在黑马论坛里给你“发消息”!

作者: fmi110    时间: 2015-10-10 10:04
@白纸嘿字@ 发表于 2015-10-10 00:16
我试了一下,发现我也没有使用编辑功能的权限!后来,看了看《CSDN用户准则》.......

我再试一试联系版 ...

好的 谢了哈
昨天太疏忽了
作者: @白纸嘿字@    时间: 2015-10-11 20:19
fmi110 发表于 2015-10-10 10:04
好的 谢了哈
昨天太疏忽了

我已经私信版主,但他还没有回复......
作者: 徐慧shanghai    时间: 2015-10-12 09:47
正常情况下是对的,就是异常情况没有处理
不存在那个 I盘的时候,以及I盘下没有pdf文件的时候没有做处理,添加一些空指针判断就好
另外这个不是编译时异常  是运行时异常




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