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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© LFW 中级黑马   /  2014-10-11 00:32  /  1364 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package cn.itcast.IOTest;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
* 需求:获取知道目录下所有的.java文件,包含子目录中的。
* 并将这些java文件的绝对路径写入到一个文件中,建立一个java文件清单列表
*
*思路:1、包含子目录,必须递归
*                        2、写数据到文件,输出流
*                        3、只要.java文件,需要过滤器
*                        4、需要过滤的条件或文件有可能非常多,先进行存储
*/
public class FileListingTest {
public static void main(String[] args) {
        //需要被遍历的目录
        File dir = new File("F:"+File.separator+"JAVA_workplace"+File.separator+""+File.separator+"Day01toDay05");
        //明确一个过滤器
        FileFilter filter = new FileFilterBySuffix(".java");
        //创建一个List,将符合过滤器的文件先存储起来(可能很多)
        List<File> alist = new ArrayList<>();
        //获取指定文件清单
        getFileListing(        dir,filter,alist);
       
        //将过滤出来的清单存储到指定文件(文件夹必定存在,就不判断是否存在了)
        File destFile = new File(dir,"FileListingTest_destFile.txt");
        writeToFile(alist,destFile);
        System.out.println(alist.toString());
}

private static void writeToFile(List<File> alist, File destFile) {
        // TODO Auto-generated method stub
        try(
                        BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream(destFile));
        ){
                for (File file : alist) {
                bufos.write((file.getAbsolutePath()+System.lineSeparator()).getBytes());
                bufos.flush();
                }
        }
        catch(IOException e){
                e.printStackTrace();
        }
}


/**
* 根据指定的过滤器在指定目录下获取所有符合过滤条件的文件
* @param dir
* @param filter
* @param alist
*/
        public static void getFileListing(        File dir , FileFilter filter,List<File> alist ) {
        File[] files = dir.listFiles();
        for (File file : files) {
                if(file.isDirectory()){
                        getFileListing(file, filter,alist);
                }else{
                        //如果是文件,传递到过滤器中
                        if(filter.accept(file)){
                        //        new FileOutputStream("xxx.txt",true);创建一个流就覆盖一下,必须true才能续写
                        //        System.out.println(file);
                                alist.add(file);
                        }
                }
        }
}
}
//过滤器就不传了,代码运行也没有问题的,但是我有疑问。毕老师的视频写的是原始的try{}catch{}finally{},他说finally中关闭资源失败,就谁调用谁处理,但我用了try-with-resource的话,压根就有finally,不管如何都是系统在做close资源动作,是否系统也会关闭失败呢?这种情况是否一定要写原始catch呢?

6 个回复

倒序浏览
LFW 中级黑马 2014-10-11 11:13:27
沙发
哇靠,要沉么?来点大神。
回复 使用道具 举报
LFW 中级黑马 2014-10-11 11:15:55
藤椅
还有,如果在try-with-resources里写的是输入流、打印流,会怎么处理掉呢???
回复 使用道具 举报
FileFilter有什么用的?
回复 使用道具 举报
LFW 中级黑马 2014-10-11 11:45:04
报纸
kid1943 发表于 2014-10-11 11:31
FileFilter有什么用的?

//明确一个过滤器
        FileFilter filter = new FileFilterBySuffix(".java");
回复 使用道具 举报
这应该是1.7的新特性,没有实战过,但是理论上会出问题。
回复 使用道具 举报
LFW 中级黑马 2014-10-11 15:11:31
7#
yueyazhishang 发表于 2014-10-11 11:53
这应该是1.7的新特性,没有实战过,但是理论上会出问题。

没错,新特性。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马