黑马程序员技术交流社区

标题: 【黑马云青年 胡浩】这到底是怎么回事,帮我瞅瞅 [打印本页]

作者: 胡浩    时间: 2013-5-26 16:17
标题: 【黑马云青年 胡浩】这到底是怎么回事,帮我瞅瞅
  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帮我看看。
作者: 顾玲玉    时间: 2013-5-27 12:51
FilterByName 这个类没有贴出来。自己debug调试下,跟踪下代码,看下哪步不是你预期的
作者: Miss小强    时间: 2013-5-27 15:03
本帖最后由 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;
}




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