主要写了三类:Directory、PPrint、ProcessFiles
1、首先PPrint是将Collection产生String,以便打印输出,利用pformat函数返回一个String,代码如下
package java_IO;
import java.util.Arrays;
import java.util.Collection;
public class PPrint {
public static String pformat(Collection<?> c) {
if(c.size() == 0) return "[]";
StringBuilder result = new StringBuilder("[");
for(Object elem : c) {
if(c.size() != 1)
result.append("\n ");
result.append(elem);
}
if(c.size() != 1)
result.append("\n");
result.append("]");
return result.toString();
}
public static void pprint(Collection<?> c) {
System.out.println(pformat(c));
}
public static void pprint(Object[] c) {
System.out.println(pformat(Arrays.asList(c)));
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
2、Directory类,通过使用local()方法产生由本地目录中的文件构成的File对象数组,walk()产生给定目录下由整个目录树中所有文件构成的List<File>(包括dirs,files),类的代码如下
package java_IO;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;
public class Directory {
public static File[] local(File dir, final String regex) {
return dir.listFiles(new FilenameFilter() {
private Pattern pattern = Pattern.compile(regex);
public boolean accept(File dir, String name) {
return pattern.matcher(
new File(name).getName()).matches();
}
});
}
public static File[] local(String path, final String regex) { // Overloaded
return local(new File(path), regex);
}
// A two-tuple for returning a pair of objects:
public static class TreeInfo implements Iterable<File> {
public List<File> files = new ArrayList<File>();
public List<File> dirs = new ArrayList<File>();
// The default iterable element is the file list:
public Iterator<File> iterator() {
return files.iterator();
}
void addAll(TreeInfo other) {
files.addAll(other.files);
dirs.addAll(other.dirs);
}
public String toString() {
return "dirs: " + PPrint.pformat(dirs) +
"\n\nfiles: " + PPrint.pformat(files);
}
}
public static TreeInfo walk(String start, String regex) { // Begin recursion
return recurseDirs(new File(start), regex);
}
public static TreeInfo walk(File start, String regex) { // Overloaded
return recurseDirs(start, regex);
}
public static TreeInfo walk(File start) { // Everything
return recurseDirs(start, ".*");
}
public static TreeInfo walk(String start) {
return recurseDirs(new File(start), ".*");
}
static TreeInfo recurseDirs(File startDir, String regex){
TreeInfo result = new TreeInfo();
for(File item : startDir.listFiles()) {
if(item.isDirectory()) {
result.dirs.add(item);
result.addAll(recurseDirs(item, regex));
} else // Regular file
if(item.getName().matches(regex))
result.files.add(item);
}
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
3、这是一种策略设计模式,Strategy接口内嵌在ProcessFiles内部,若是希望实现它,则必须实现ProcessFiles。利用Strategy接口,我们可以对提出来的File做不同的操作,而不用改变原ProcessFiles里的代码,而是在外部实现接口,对文件进行操作。代码如下
package java_IO;
import java.io.File;
import java.io.IOException;
public class ProcessFiles {
public interface Strategy{
void process(File file);
}
private Strategy strategy;
private String ext;
public ProcessFiles(Strategy s,String e){
strategy=s;
ext=e;
}
public void start(String[] args){
try{
if(args.length==0)
processDirectoryTree(new File("."));
else{
for(String arg:args){
File fileArg=new File(arg);
if(fileArg.isDirectory())
processDirectoryTree(fileArg);
else{
if(!arg.endsWith("."+ext))
arg+="."+ext;
strategy.process(new File(arg).getCanonicalFile());
}
}
}
}
catch(IOException e){
throw new RuntimeException(e);
}
}
public void processDirectoryTree(File root) throws IOException{
for(File file:Directory.walk(root.getAbsolutePath(),".*\\."+ext))
strategy.process(file.getCanonicalFile());
}
/**
* @param args
*/
public static void main(String[] args) {
new ProcessFiles(new ProcessFiles.Strategy() {
public void Process(File file)
System.out.println(file)
},"java").start(args);
// TODO Auto-generated method stub
}
}