使用多线程查找指定目录下的所有文件
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