接着上一篇的笔记做一些改进,之前看过的File类操作文件夹的文章都只是复制指定目录下的文件夹和文件,没有任何筛选,现在要做的是在前人的基础上,实现只复制包含指定格式文件的文件夹,并在新创建的同名文件夹中创建同名的另一种格式的文件,具体的功能如下(说的有点绕,看代码和实现结果图就明白了):
1、获取指定目录下面,指定扩展名的文件,
2、在另一个目录中复制包含指定文件的所有文件夹,并在创建的同名文件夹中创建同名的csv文件。
示例如下:
package com.daxiang.filenamefilter;
/**
* File类操作文件综合应用
* 需求:获取指定目录下面,指定扩展名的文件,
* 在指定目录中复制包含指定文件的所有文件夹,并在创建的同名文件夹中创建同名的csv文件。
*
* 思路:
* 1.需要深度遍历。--递归
* 2.遍历的过程中过滤指定扩展名的文件--过滤器FileNameFilter,将文件存入容器中
* 3.将容器中的内容遍历,在指定目录中复制包含指定文件的所有文件夹,并在创建的同名文件夹中创建同名的csv文件
*
*/
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class FileNameFilterTest {
// 源文件夹
static String url1 = "D:\\daxiang\\saztest";
// 目标文件夹
static String url2 = "D:\\daxiang\\saztest\\output";
public static void main(String[] args) throws IOException {
// 创建目标文件夹
File file2 = new File(url2);
if (!file2.exists()) {
file2.mkdirs();
}
// 获取源文件夹当前下的文件或目录
File dir = new File(url1);
FilenameFilter filter = new FilterBySaz(".saz");// 过滤.saz文件
List<File> fileList = new ArrayList<File>();
getFileList(dir, filter, fileList);
createCsvFile(fileList);
}
/**
* @param dir 需要遍历的目录
* @param filter 过滤满足条件的文件
* @param fileList 存放符合条件的容器
*/
public static void getFileList(File dir, FilenameFilter filter,
List<File> fileList) {
if (dir.exists()) {
File[] files = dir.listFiles();// 找到目录下面的所有文件
for (File file : files) {
// 递归
if (file.isDirectory() && !(file.getName().equals("output"))) {
getFileList(file, filter, fileList);
} else {
// 对遍历的文件进行过滤,符合条件的放入List集合中
if (filter.accept(dir, file.getName())) {
fileList.add(file);
// 输出各种路径名称,调试代码用
String path1 = file.getAbsolutePath();
System.out.println(path1);
String path2 = file.getPath();
System.out.println(path2);
String path3 = file.getParent();
System.out.println(path3);
String path4 = file.getParentFile().getParent();
System.out.println(path4);
String path5 = path3.substring(path4.length()+1);
System.out.println(path5);
String path6 = file.getName();
System.out.println(path6);
}
}
}
}
}
/**
* 将容器中的文件遍历,写入到目的文件中
*
* @param list 存放满足条件的文件的集合
* @throws IOException
*/
public static void createCsvFile(List<File> fileList) throws IOException {
// 遍历List集合
for (File file : fileList) {
// File csvfile1 = new File((file.getParent() + File.separator + file
// .getName().replace("saz", "csv")));
// csvfile1.createNewFile();
// 在目标文件夹中创建存放有saz文件的同名文件夹
String path1 = file.getParent();
String path2 = file.getParentFile().getParent();
String path3 = path1.substring(path2.length()+1);
File file2 = new File(url2 + File.separator + path3);
if (!file2.exists()) {
file2.mkdirs();
}
// 在新建的同名文件夹中创建同名的与相应的saz文件同名的csv文件
File csvfile2 = new File((url2 + File.separator + path3 + File.separator + file
.getName().replace("saz", "csv")));
csvfile2.createNewFile();
}
}
}
package com.daxiang.filenamefilter;
/**
* 说明:
* 自定义FilterBySaz类,过滤指定扩展名的文件
*
*/
import java.io.File;
import java.io.FilenameFilter;
public class FilterBySaz implements FilenameFilter{
private String ext;
public FilterBySaz(String ext) {
this.ext = ext;
}
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(ext);
}
}
程序执行之前所操作的文件夹中是没有output这个文件夹的,文件夹结构如下图所示, 其中只有144P-1080P这6个文件夹中包含saz格式的文件,其他文件夹都没有:
程序执行之后生成了output文件夹,output文件夹里生成了所要求的文件夹和文件,结构如下图所示,: