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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.DoFileWork;

  2. import java.io.BufferedWriter;
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.io.FilenameFilter;
  6. import java.io.IOException;

  7. import java.util.ArrayList;
  8. import java.util.List;



  9. import com.File.FilterByName;

  10. public class work_ioAndFile {

  11.        

  12.         /*
  13.          *
  14.          * 获取指定目录下,指定扩展名的文件(包含子目录中的)
  15.          * 这些文件的绝对路径写入到一个文本文件中。
  16.          *
  17.          * 简单说,就是建立一个指定扩展名的文件的列表。
  18.          *
  19.          * 思路:
  20.          * 1,必须进行深度遍历。
  21.          * 2,要在遍历的过程中进行过滤。将符合条件的内容都存储到容器中。
  22.          * 3,对容器中的内容进行遍历并将绝对路径写入到文件中。
  23.          *
  24.          *
  25.          */
  26.         public static void main(String[] args) {
  27.                 File file=new File("E:\\使用Java实现面向对象编程");
  28.                 //匿名内部类,创建对象+重写一次欧
  29.                
  30.                 List<File> fileList=new ArrayList<File>();
  31.                 FilterByName filterByName=new FilterByName(".java");
  32.                 getListFiles(file, filterByName, fileList);
  33.                 System.out.println(fileList.size());
  34.                 File f=new File(file, "java.txt");
  35.                 writeToFile(fileList, f);
  36.                
  37.         }
  38.         /*
  39.          * 深度遍历文件夹,将其中所有包含.java文件的的文件对象放入指定的容器List<File>中
  40.          */
  41. private static void getListFiles(File dir,FilenameFilter filter ,List<File> fileList){
  42.                 File [] files=dir.listFiles();
  43.                 for(File fi:files){
  44.                         if(fi.isDirectory()){
  45.                                 getListFiles(fi, filter, fileList);
  46.                         }
  47.                         else{
  48.                                 //对遍历到的文件进行过滤器的过滤。将符合条件File对象,存储到List集合中。
  49.                                 if(filter.accept(dir, dir.getName())){
  50.                                         fileList.add(fi);
  51.                                 }
  52.                         }
  53.                 }
  54. }

  55. private static void writeToFile(List<File> fileList,File destFile){
  56.         BufferedWriter bfw=null;
  57.         try {
  58.                  bfw=new BufferedWriter(new FileWriter(destFile));
  59.                 for(File fi:fileList){
  60.                         System.out.println(fi.getAbsolutePath());
  61.                         bfw.write(fi.getAbsolutePath());
  62.                         bfw.newLine();
  63.                         bfw.flush();
  64.                 }
  65.         } catch (IOException e) {
  66.                
  67.                 throw new RuntimeException("写入失败");
  68.         }
  69.         finally{
  70.                 if(bfw!=null){
  71.                         try {
  72.                                 bfw.close();
  73.                         } catch (IOException e) {
  74.                                 throw new RuntimeException("关闭流失败");
  75.                         }
  76.                 }
  77.         }
  78. }
  79. }
复制代码
过滤器不起作用,没有过滤到.java的文件,应该是getListFiles()这个方法出了问题,但是我就是不知道哪里错了,也许当局者迷嘛,复制到eclipse帮我看看。

2 个回复

倒序浏览
FilterByName 这个类没有贴出来。自己debug调试下,跟踪下代码,看下哪步不是你预期的
回复 使用道具 举报
本帖最后由 Miss小强 于 2013-5-27 15:08 编辑

这道题目的根源在这里:
getListFiles(File dir,FilenameFilter filter ,List<File> fileList)
你这样得到的只是引用,对原来的fileList没有影响,也就是说文件根本没有添加进去;
解决方法:
在getListFiles这个方法中自己定义一个fileList集合,然后以返回值的形式返回;
主函数中用一个list集合进行接收就ok了。。。
这里必须要明白一点:引用传递和值传递。慢慢琢磨吧。。。
黑马云青年为你解答。。。
getListFiles(File dir,FilenameFilter filter){
   List<File> fileList=new ArrayList<File>();
//添加过滤代码;

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