下边展示了一个根据给定目录和正则匹配出其下所有匹配到的子文件的示例
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);
}
}
遍历程序利用了内部接口的设计, 这样可以更清楚的看到其上下文关系.