18.1.2 目录实用工具

下边展示了一个根据给定目录和正则匹配出其下所有匹配到的子文件的示例

package com.cnsuning.file;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;

public class Directory {
	public static File[] local(File file, final String regex) {
		return file.listFiles(new FilenameFilter() {
			Pattern filePattern = Pattern.compile(regex);

			public boolean accept(File arg0, String arg1) {
				return filePattern.matcher(arg1).matches();
			}
		});
	}

	public static File[] local(String path, final String regex) {
		return local(new File(path), regex);
	}

	public static class TreeInfo implements Iterable<File> {
		public List<File> files = new ArrayList<File>();
		public List<File> dirs = new ArrayList<File>();

		public Iterator<File> iterator() {
			return files.iterator();
		}

		public void addAll(TreeInfo other) {
			files.addAll(other.files);
			dirs.addAll(other.dirs);
		}

		public String toString() {
			String fileStr = Arrays.asList(this.files).toString();
			String dirStr = Arrays.asList(this.dirs).toString();
			return "files :" + fileStr + "\n dirs :" + dirStr;
		}
	}

	public static TreeInfo recursDirs(File file, String regex) {
		TreeInfo treeInfo = new TreeInfo();
		File[] fileList = file.listFiles();
		for (File thisFile : fileList) {
			if (thisFile.isDirectory()) {
				treeInfo.dirs.add(thisFile);
				treeInfo.addAll(recursDirs(thisFile, regex));
			} else {
				if(thisFile.getName().matches(regex)){
					treeInfo.files.add(thisFile);
				}
			}
		}
		return treeInfo;
	}

	public static TreeInfo walk(File file, String regex) {
		return recursDirs(file, regex);
	}

	public static TreeInfo walk(String path, String regex) {
		return walk(new File(path), regex);
	}

	public static void main(String[] args) {
		// File[] fileList = local("D:\\download", "[\\w|.]*");
		// System.out.println(fileList.length);
		// System.out.println(Arrays.asList(fileList));
		System.out.println(recursDirs(new File("D:\\download"), "[\\w|.]*"));
	}

}

下边这个示例利用了上边的工具类, 对匹配到的文件进行处理

package com.cnsuning.file;

import java.io.File;

public class ProcessFile {
	// 提供接口化的process方法, 可供调用者定制遍历处理程序
	public interface Strategy {
		public void process(File file);
	}

	private Strategy strategy;
	private String ext;

	public ProcessFile(Strategy strategy, String ext) {
		this.strategy = strategy;
		this.ext = ext;
	}

	public void processDirectoryTree(File root) {
		if(!root.exists()){
			//文件不存在
			return;
		}
		if(root.isDirectory()){
			//目录的, 利用directory获取全部文件列表后process
			for (File file : Directory.walk(root, ".*\\." + this.ext)) {
				this.strategy.process(file);
			}
		}
		else{
			//文件, 直接process
			String fileName = root.getName();
			if(fileName.endsWith("."+this.ext)){
				this.strategy.process(root);
			}
		}
		return;
	}

	public void start(String[] args) {
		if (0 == args.length) {
			// 空命令行参数的, 遍历当前目录
			this.processDirectoryTree(new File("."));
		}
		else{
			for(String arg: args){
				this.processDirectoryTree(new File(arg));
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ProcessFile pf = new ProcessFile(new ProcessFile.Strategy() {
			
			@Override
			public void process(File file) {
				// TODO Auto-generated method stub
				System.out.println(file.getAbsolutePath());
			}
		},"jpg");
		pf.start(args);
	}

}

遍历程序利用了内部接口的设计, 这样可以更清楚的看到其上下文关系.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值