package com.test.io;
import java.io.File;
import java.io.FilenameFilter;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
public class FileSearch implements Callable<List<File>> {
private File directory;
private FilenameFilter filter;
public FileSearch(File directory, FilenameFilter filter) {
super();
this.directory = directory;
this.filter = filter;
}
public static void main(String[] args) throws Exception {
File dir = new File("E:\\workspace\\Test");
FileSearch search = new FileSearch(dir, new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
FutureTask<List<File>> task = new FutureTask<List<File>>(search);
Thread t = new Thread(task);
t.start();
for (File f : task.get()) {
System.out.println(f.getPath());
}
}
public List<File> call() throws Exception {
List<File> list = new ArrayList<File>();
File[] files = directory.listFiles();
ArrayList<Future<List<File>>> results = new ArrayList<Future<List<File>>>();
for (File f : files) {
if (f.isDirectory()) {
Callable<List<File>> runnable = new FileSearch(f, filter);
FutureTask<List<File>> task = new FutureTask<List<File>>(runnable);
results.add(task);
Thread t = new Thread(task);
t.start();
} else if (filter.accept(f.getParentFile(), f.getName())) {
list.add(f);
}
}
for (Future<List<File>> result : results) {
list.addAll(result.get());
}
return list;
}
}
改进:这个程序产生了大量生命周期很短的线程,每个目录产生一个线程,可以使用一个线程池来运行任务。