黑马程序员技术交流社区

标题: try-with-resources的局限性? [打印本页]

作者: LFW    时间: 2014-10-11 00:32
标题: try-with-resources的局限性?
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呢?


作者: LFW    时间: 2014-10-11 11:13
哇靠,要沉么?来点大神。
作者: LFW    时间: 2014-10-11 11:15
还有,如果在try-with-resources里写的是输入流、打印流,会怎么处理掉呢???
作者: kid1943    时间: 2014-10-11 11:31
FileFilter有什么用的?
作者: LFW    时间: 2014-10-11 11:45
kid1943 发表于 2014-10-11 11:31
FileFilter有什么用的?

//明确一个过滤器
        FileFilter filter = new FileFilterBySuffix(".java");
作者: yueyazhishang    时间: 2014-10-11 11:53
这应该是1.7的新特性,没有实战过,但是理论上会出问题。
作者: LFW    时间: 2014-10-11 15:11
yueyazhishang 发表于 2014-10-11 11:53
这应该是1.7的新特性,没有实战过,但是理论上会出问题。

没错,新特性。。




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