使用多线程查找指定目录下的所有文件
1. 使用 BlockingQueue 保存查找到的文件 File
2. 方法 enumerate(File directory) 中使用递归查找指定目录下的所有文件
import java.io.File;
import java.util.concurrent.BlockingQueue;
/**
* @ClassName: FileEnumerationTask
* @Description: 查找指定目录下的所有文件线程
* @author
* @company
* @date 2012-6-14
* @version V1.0
*/
public class FileEnumerationTask implements Runnable {
/** 队列,用于存放文件 */
private BlockingQueue<File> queue;
/** 文件目录 */
private File directory;
// 为了发出完成信号,枚举线程把一个虚拟对象放入队列
public static File DUMMY = new File("");
public FileEnumerationTask(BlockingQueue<File> queue, File directory) {
this.queue = queue;
this.directory = directory;
}
@Override
public void run() {
try {
// 查找指定目录下的所有文件
enumerate(directory);
// 把一个虚拟对象放入队列,表示完成查找
queue.put(DUMMY);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* @Title: enumerate
* @Description: 查找指定目录下的所有文件
* @param directory
* 目录
* @throws InterruptedException
* @author
* @date 2012-6-14
*/
public void enumerate(File directory) throws InterruptedException {
System.out.println("开始查找指定目录'" + directory + "'下的所有文件.");
// 查找目录directory下所有的文件
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
// 使用递归方法,查找该目录的子目录下的文件
enumerate(file);
} else {
// 如果是文件,则直接放入队列中
queue.put(file);
}
}
System.out.println("队列中的文件数量:" + queue.size());
System.out.println("结束查找指定目录'" + directory + "'下的所有文件.");
}
}
测试:
import java.io.File;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
/**
* @ClassName: Client
* @Description: 测试文件查找
* @author
* @company
* @date 2012-6-14
* @version V1.0
*/
public class Client {
static final int FILE_QUEUE_SIZE = 10;
static final int SEARCH_THREADS = 100;
/**
* @Title: main
* @Description: 主方法
* @param args
* :
* @author
* @date 2012-6-14
*/
public static void main(String[] args) {
// 在控制台输入目录
String directory = "C:\\Windows\\Boot\\DVD";
BlockingQueue<File> queue = new ArrayBlockingQueue<File>(
FILE_QUEUE_SIZE);
FileEnumerationTask enumerator = new FileEnumerationTask(queue,
new File(directory));
Executors.newFixedThreadPool(SEARCH_THREADS).execute(enumerator);
File file = null;
while (true) {
try {
// 获取并移除此队列的头部
file = queue.take();
if (file == FileEnumerationTask.DUMMY) {
//如果取出完成,则退出
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("队列中的文件:" + file);
}
}
}
测试结果:
开始查找指定目录'C:\Windows\Boot\DVD'下的所有文件.
开始查找指定目录'C:\Windows\Boot\DVD\PCAT'下的所有文件.
队列中的文件:C:\Windows\Boot\DVD\PCAT\BCD
队列中的文件:C:\Windows\Boot\DVD\PCAT\boot.sdi
开始查找指定目录'C:\Windows\Boot\DVD\PCAT\en-US'下的所有文件.
队列中的文件:C:\Windows\Boot\DVD\PCAT\en-US\bootfix.bin
队列中的文件数量:0
结束查找指定目录'C:\Windows\Boot\DVD\PCAT\en-US'下的所有文件.
队列中的文件:C:\Windows\Boot\DVD\PCAT\etfsboot.com
队列中的文件数量:0
结束查找指定目录'C:\Windows\Boot\DVD\PCAT'下的所有文件.
队列中的文件数量:0
结束查找指定目录'C:\Windows\Boot\DVD'下的所有文件.
至于怎么从 BlockingQueue 中取出文件,请查阅 java API 文档。
参照: http://test-touch.iteye.com/blog/1560522