黑马程序员技术交流社区

标题: 怎样通过FileFilter过滤整个盘符的文件 [打印本页]

作者: 天涯追梦    时间: 2014-4-25 21:04
标题: 怎样通过FileFilter过滤整个盘符的文件
本帖最后由 天涯追梦 于 2014-4-26 11:15 编辑

下面代码是:建立指定文件的清单文件。 将指定目录下的指定文件(包含子目录)的绝对路径写入到一个文件中。 该文件就作为指定文件的清单文件。                  例如:获取一个想要的指定文件的集合。获取javase_avi下(包含子目录)的所有的.avi 的文件对象。并存储到集合中。
问题是:我如果想获取整个e盘中的.avi 文件,而不是某一文件夹的,应该怎么修改下面程序呢?
              如果是修改File dir = new File("e:\\javase_avi"); 为 File dir = new File("e:\\");为什么会报错:java.lang.NullPointerException
请高手作答,谢谢!!

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

  8. public class Test {

  9.      
  10.         public static void main(String[] args) throws IOException {

  11.                

  12.                 File dir = new File("e:\\javase_avi");

  13.                 List<File> list = fileList(dir, ".avi");

  14.                 File destFile = new File("avilist.txt");
  15.                 write2File(list, destFile);

  16.         }

  17.         public static void write2File(List<File> list, File destFile) throws IOException  {

  18.                 //1,需要流对象,既然是写入字符。
  19.                 BufferedWriter bufw = null;
  20.                 try{
  21.                         bufw = new BufferedWriter(new FileWriter(destFile));
  22.                         
  23.                         //2,遍历集合。
  24.                         for(File file : list){
  25.                                 
  26.                                 bufw.write(file.getAbsolutePath());
  27.                                 bufw.newLine();
  28.                                 bufw.flush();
  29.                                 
  30.                         }
  31.                         
  32.                 }finally{
  33.                         if(bufw!=null){
  34.                                 try {
  35.                                         bufw.close();
  36.                                 } catch (IOException e) {
  37.                                        
  38.                                         throw new RuntimeException("关闭失败");
  39.                                 }
  40.                         }
  41.                 }
  42.                
  43.         }

  44.         /**
  45.          * 定义一个获取指定过滤器条件的文件的集合。
  46.          */
  47.         public static List<File> fileList(File dir, String suffix) {

  48.                 // 1,定义集合。
  49.                 List<File> list = new ArrayList<File>();

  50.                 // 2,定义过滤器。
  51.                 FileFilter filter = new FileFilterBySuffix(suffix);

  52.                 getFileList(dir, list, filter);

  53.                 return list;

  54.         }


  55.         public static void getFileList(File dir, List<File> list, FileFilter filter) {

  56.                 // 1,通过listFiles方法,获取dir当前下的所有的文件和文件夹对象。
  57.                 File[] files = dir.listFiles();

  58.                 // 2,遍历该数组。
  59.                 for (File file : files) {

  60.                         // 3,判断是否是文件夹。如果是,递归。如果不是,那就是文件,就需要对文件进行过滤。
  61.                         if (file.isDirectory()) {
  62.                                 getFileList(file, list, filter);
  63.                         } else {
  64.                                 // 4,通过过滤器对文件进行过滤
  65.                                 if (filter.accept(file)) {
  66.                                         list.add(file);
  67.                                 }
  68.                         }

  69.                 }
  70.         }
  71. }
复制代码



               


作者: 你为谁归来    时间: 2014-4-25 21:25
你的这个里面有个方法我不认识,考到我电脑里面一直报错。
我粘贴了一个我以前写的,你可以看下,只是我这个代码的作用是拷贝,不过可以实现你需求的,把里面所有avi的文件全部放到一个String数组里面。
  1. import java.io.*;
  2. //此代码的左右是将不同目录下的.avi文件拷贝到同一个目录下,方便使用。
  3. public class Demo11
  4. {
  5.         public static void main(String args[])throws Exception
  6.         {
  7.                 String[] str11 = Wenjian();               
  8.                 for(int i=0;i<str11.length;i++)
  9.                 {
  10.                         String[] str12 = Daowen1(str11[i]);
  11.                         sop(str12[0]);
  12.                         Chuanshu(str12[0],str11[i]);                       
  13.                 }               
  14.         }
  15.         public static String[] Wenjian()throws Exception
  16.         {
  17.                 File f = new File("F:\\黑马程序员\\1\\解压文件\\张孝祥JAVA加强");
  18.                
  19.                 String[] str1 = f.list();
  20.     return str1;       
  21.         }
  22.         public static String[] Daowen1(String stt) throws Exception
  23.         {
  24.                 File f = new File("F:\\黑马程序员\\1\\解压文件\\张孝祥JAVA加强\\"+stt);
  25.                 String[] str2 = f.list(new FilenameFilter(){
  26.                                                                       public boolean accept(File dir,String name)
  27.                                                                       {
  28.                                                                               return name.endsWith(".avi");
  29.                                                                       }
  30.                                                                  });
  31.                 return str2;                               
  32.         }
  33.         public static void Chuanshu(String sty,String stu) throws Exception
  34.         {
  35.                 BufferedInputStream buis = new BufferedInputStream(new FileInputStream("F:\\黑马程序员\\1\\解压文件\\张孝祥JAVA加强\\"+stu+"\\"+sty));                       
  36.                 BufferedOutputStream buos =new BufferedOutputStream(new FileOutputStream("F:\\黑马程序员\\1\\解压文件\\12345\\"+sty));               
  37.                 byte[] buf = new byte[1024*1024];
  38.                 int len=0;
  39.                 while((len=buis.read(buf))!=-1)
  40.                 {
  41.                         buos.write(buf,0,len);
  42.                 }
  43.                 buis.close();
  44.                 buos.close();               
  45.         }       
  46.         public static void sop(Object obj)
  47.         {
  48.                 System.out.println(obj);
  49.         }
  50. }
复制代码

作者: 你为谁归来    时间: 2014-4-25 21:28
Sorry忘记注释了,你把我在main里面的那个chuanshu的方法注释掉就可以了,但是程序执行完会报个异常。这样就可以啦!呵呵!




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