一、需求:
获取指定目录下,指定扩展名的文件(包含子目录中的) 这些文件的绝对路径写入到一个文本文件中。
简单说,就是建立一个指定扩展名的文件的列表。
二、思路
1、需要进行深度遍历
2、在深度遍历的过程中按条件进行过滤。将符合过滤条件的目录名存入容器中
3、遍历容器,将容器中的绝对路径写入文本文件中
三、技术
1、需要使用io File创建文件对象,指定文件路径,为了提高效率,可使用缓冲区BufferedWriter
2、file对象获取所有文件 file.listFiles。
3、file对象判断是否为目录 file.isDirectory();
4、递归算法
5、FilenameFilter 文件过滤器接口
6、file对象获取绝对路径名 file.getAbsolutePath()
7、缓冲区对象 写入writer()、换行newLine()、刷新flush( )、关闭流close()
四、代码实现
/**
* @author James
* @create 2020-01-08 16:01
* 获取指定目录下,指定扩展名的文件(包含子目录中的) 这些文件的绝对路径写入到一个文本文件中。
*
* 简单说,就是建立一个指定扩展名的文件的列表。
*
* 思路:
* 1,必须进行深度遍历。
* 2,要在遍历的过程中进行过滤。将符合条件的内容都存储到容器中。
* 3,对容器中的内容进行遍历并将绝对路径写入到文件中。
*/
public class IoTest {
public static void main(String[] args) throws IOException {
File file =new File("D:\\idea_workspace");
SuffixFilter suffixFilter =new SuffixFilter(".java");
List<File> list =new ArrayList<>();
getFilePathByFileName(file,suffixFilter,list);
File desFile =new File(file,"javaList.txt");
writerByFile(desFile,list);
}
/**
* 将指定文件目录中,指定的扩展文件名路径遍历存入list集合中
*
* @param dir 文件所在目录
* @param filter 文件过滤器
* @param list 存放满足过滤条件后得到的路径集合
*/
public static void getFilePathByFileName(File dir, SuffixFilter filter, List<File> list){
//获取路径中所有的文件
File[] files = dir.listFiles();
for (File file:files){
//判断是否为目录,是目录则继续递归遍历
if (file.isDirectory()){
//递归
getFilePathByFileName(file,filter,list);
}else {
//对文件进行条件过滤,满足条件的存入list
if (filter.accept(file,file.getName())){
list.add(file);
}
}
}
}
/**
* 将集合中的目录写入指定目录下的文件
* @param dir 目录位置
* @param list 存有遍历后的路径集合
*/
public static void writerByFile(File dir,List<File> list) throws IOException {
BufferedWriter bufw =null;
try {
//创建缓冲区。提高效率
bufw = new BufferedWriter(new FileWriter(dir));
//遍历集合
for (File file:list){
//获取文件名写入
bufw.write(file.getAbsolutePath());
bufw.newLine();
bufw.flush();
}
}catch (IOException e) {
e.printStackTrace();
} finally {
if (bufw!=null){
bufw.close();
}
}
}
}