依然在学习毕向东老师的java基础系列。讲求系统化学习,同时以验证自己的输入是否等于输出为目,分享其中的知识点给大家。
现在有一需求:获取指定目录下,指定拓展名的文件(包括子目录),并将这些文件的绝对路径写入到一个文本文件中。
如何来实现呢?首先我们必须要使用到递归方法来获取指定目录下(包括子目录)所有的文件;需求中有提到“指定的拓展名”,那么必须还需要过滤器类进行过滤操作;最后是文本文件操作相关的IO流技术。这些小知识点我们都有学过,但是结合起来到底该如何用呢?
我们先来构建一个过滤器类,可以实现在构造函数中输入“指定拓展名”,进而提高便捷性:
package file;
import java.io.File;
import java.io.FilenameFilter;
public class SuffixFilter implements FilenameFilter{
private String suffix;
public SuffixFilter(String suffix) {
super();
this.suffix = suffix;
}
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(suffix);
}
接下来就是实现我们全部想法的时候了!我选定的是遍历“d:\\CTEX\\”文件夹,并将所有以“.exe”结尾的文件的绝对路径名写入到“abc.txt”文本文件中,代码如下:
package properties;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import file.SuffixFilter;
/**
* @ClassName: Test
* @Description: TODO
* 获取指定目录下,指定拓展名的文件(包括子目录的)
* 并将这些文件的绝对路径写入到一个文本文件中
* @author Shaw
* @date 2014年12月26日 下午6:48:56
*
*/
public class Test {
/**
* @throws IOException
* @Title: main
* @Description: TODO(这里用一句话描述这个方法的作用)
* @param @param args 设定文件
* @return void 返回类型
*/
public static void main(String[] args) throws IOException {
//源文件夹
File f1 = new File("d:\\CTEX\\");
if(!f1.exists()){
f1.createNewFile();
}
//目的文件
File f2 = new File("abc.txt");
if(!f2.exists()){
f2.createNewFile();
}
//存储容器
List<File> filelist = new ArrayList<File>();
//过滤器
SuffixFilter sf = new SuffixFilter(".exe");
getFiles(f1,sf,filelist);
write2File(filelist,f2);
}
/**
* @Title: getFiles
* @Description: TODO
* 对指定目录中的内容进行深度遍历,并按照指定过滤器进行过滤
* 将过滤后的内容存储到容器中
* @param @param dir
* @param @param filter
* @param @param list 设定文件
* @return void 返回类型
*/
public static void getFiles(File dir,FilenameFilter filter,List<File> list){
//得到一个Filel类下的所有文件与文件夹
File[] files = dir.listFiles();
for(File file : files){
if(file.isDirectory()){
//递归
getFiles(file,filter,list);
}
else{
//过滤
if(filter.accept(dir, file.getName())){
list.add(file);
}
}
}
}
/**
*
* @Title: write2File
* @Description: TODO(将容器中的文件对象的绝对路径写入到文本文件中)
* @param @param list
* @param @param destFile 设定文件
* @return void 返回类型
*/
public static void write2File(List<File> list, File destFile){
//使用缓冲区类提高读写效率
BufferedWriter bufw =null;
try {
bufw = new BufferedWriter(new FileWriter(destFile));
for(File file:list){
//写入 换行 刷新
bufw.write(file.getAbsolutePath());
bufw.newLine();
bufw.flush();
}
} catch (IOException e) {
throw new RuntimeException();
}finally{
if(bufw!=null)
try {
bufw.close();
} catch (IOException e) {
throw new RuntimeException();
}
}
}
}
输出到文本的部分信息如下(太多未全写):
d:\CTEX\CTeX\cct\bin\gb2wncyr.exe
d:\CTEX\MiKTeX\miktex\bin\afm2afm.exe
d:\CTEX\WinEdt\Uninstall.exe