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呢?
|
|