依然在学习毕向东老师的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