IO Exercise(Ⅰ)---------- 文件后缀名的过滤

对指定目录中的所有(包含子目录)特定后缀名的文件的绝对路径写入到一个文本文件中。
1. 首先,明确思路:以.java后缀名为例,设计思路
①. 对指定文件递归,将每个文件都遍历出来。
②. 将遍历出来的文件过滤。
③. 将②中满足的文件用容器存储。
④. 将容器中存储的文件绝对路径写入到一个文件中。

2. 分析所使用的技术:
①. 递归算法。
②. 文件过滤。
③. 集合。
④. IO

3.编码实现:
①. 对指定目录进行递归,使用文件过滤器过滤遍历出来的文件,将满足条件的存放到容器中。
/**
 * 定义一个功能对指定的目录进行递归
 * 
 * @param dir : 指定的目录
 * @param filenameFilter : 文件过滤器
 * @param list : 将符合条件的文件名保存的集合
 */
public static void listAllJavaFile(File dir, FilenameFilter filenameFilter,
		List<File> list) {
	// 遍历目录中的文件. File类的 public File[] listFiles()
	File[] files = dir.listFiles();
	if (files != null) {
		for (File file : files) {
			if (file.isDirectory()) { // 递归遍历
				listAllJavaFile(file, filenameFilter, list);
			} else {
				// 过滤特点后缀名的文件
				if (filenameFilter.accept(dir, file.getName())) {
					list.add(file);
				}
			}
		}
	}
}
②. 容器中存储的内容写入到文件中。
/**
 * 集合中存储的内容写入到文件中
 * 
 * @param files : 文件集合
 * @param des : 用写入的目的地
 * @throws IOException
 */
public static void write2File(List<File> files, File des)
		throws IOException {
	BufferedWriter bufferedWriter = null;
	try {
		bufferedWriter = new BufferedWriter(new FileWriter(des));
		// 便利集合
		for (File file : files) {
			bufferedWriter.write(file.getAbsolutePath());
			bufferedWriter.newLine();
			bufferedWriter.flush();
		}
	} finally {
		if (bufferedWriter != null)
			try {
				bufferedWriter.close();
			} catch (Exception e) {
				throw new RuntimeException("关闭失败!");
			}
	}
}
③. 自定义后缀名过滤器。
/**
 * 自定义文件过滤器
 */
public class MyFilenameFilter implements FilenameFilter {
	private String suffix;

	public MyFilenameFilter(String suffix) {
		this.suffix = suffix;
	}

	public boolean accept(File dir, String name) {
		return name.endsWith(suffix);
	}
}
④. 测试。
public static void main(String[] args) throws IOException {
	File dir = new File("E:\\pegasus");
	MyFilenameFilter filter = new MyFilenameFilter(".java");
	List<File> list = new ArrayList<>();
	listAllJavaFile(dir, filter, list);
	File file = new File(dir, "java文件目录.txt");
	write2File(list, file);
}

虽然以上文件过滤方法是很好了,但是我还知道一种方法,java NIO中的glob模式。
现在我给大家简要的解释下java NIO中的Glob模式:
①. 什么是Glob
在编程设计中,Glob是一种模式,他使用通配符来指定文件名。例如:*.java就是一个简单的Glob,他指定了所有扩展名为“.java”的文件。Glob模式中广泛使用了两个通配符“*”和“?”。其中星号表示“任意的字符或字符组成字符串”,而问号则表示“任意单个字符”。
②. Java NIO中的Glob
Java SE7的NIO库引用了Glob模式,它用于FileSystem类,在PathMatcher getPathMatcher(String syntaxAndPattern)方法中使用。Glob可以作为参数传递给PathMatcher。同样地,在Files类中也可以使用Glob来遍历整个目录。
③. 本例子使用Glob实现
Ⅰ.对目录下的文件匹配
/**
 * 打印一个目录下所有匹配glob规则的文件名称
 */
private static void match(String glob, String location) throws IOException {
	final PathMatcher pathMatcher = FileSystems.getDefault()
			.getPathMatcher(glob);
	Files.walkFileTree(Paths.get(location), new SimpleFileVisitor<Path>() {
		@Override
		public FileVisitResult visitFile(Path path,
				BasicFileAttributes attrs) throws IOException {
			if (pathMatcher.matches(path)) {
				System.out.println(path);
			}
			return FileVisitResult.CONTINUE;
		}
	});
}
Ⅱ.使用Junit单元测试
@Test
public void test(){
	String glob = "glob:**.java";
	String path = "E:/pegasus";
	match(glob, path);
}
成功的打印出了需要的文件,关于写入文件的操作,上面已解决。
若有什么错误,望不吝赐教(赶紧告诉我,我好改,改晚了耽误其他人)。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值