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

 

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

 

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

 

 

 

你可能感兴趣的:(BlockingQueue)