读书人

使用多线程查找指定目录上的所有文件

发布时间: 2012-08-24 10:00:21 作者: rapoo

使用多线程查找指定目录下的所有文件

?

使用多线程查找指定目录下的所有文件

?

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;}@Overridepublic 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

?

?

?

读书人网 >编程

热点推荐