`
xurichusheng
  • 浏览: 336830 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

阅读更多

 

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

 

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

 

 

 

分享到:
评论
2 楼 xurichusheng 2013-04-01  
对,对!
忘了关了,这个挺严重的。
1 楼 jation 2013-03-30  
BlockingQueue<File> queue = new LinkedBlockingQueue<File>(30);
FileListByBlockingQueue fileListByBlockingQueue = new FileListByBlockingQueue(new File(directory), queue);
ExecutorService exes = Executors.newFixedThreadPool(1);
exes.submit(fileListByBlockingQueue);

File file = null;
while(true){
try {
file = queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(file == FileListByBlockingQueue.DUMMY){
break;
}
System.out.println("队列中的文件:"+file.getName());
}
exes.shutdown();

把main函数改下比较好,等while结束了,同时把ExecutorService 给关掉。

相关推荐

    多线程搜索文件程序

    本程序用多线程对某个文件进行搜索,如果是文件就查找这个文件是否包含某个关键字,包含就输出文件名,如果不是文件,而是文件夹则再继续处理,如果是压缩文件又另外处理

    查找文件 修改版本 备份 FTP备份 多线程查找修改的文件,生成更新版本。可以查询指定目录、扩展名,可以排除目录和扩展名

    查找文件 修改版本 备份 FTP备份 多线程查找修改的文件,生成更新版本。可以查询指定目录、扩展名,可以排除目录和扩展名 运行环境:.net framework 4.0及以上。

    一个用多线程实现文件查找的例子 .zip

    以前下载的时候多半要下载到很多看不了,解压出错的东西,这次我将自己手里的资料整理了一下,给大家一个质量的保证! 3.请大家下载后点击评论,这样即看到书,有不丢失您的分数! 4.电脑里存储了大量文章和源...

    【原创】c# 文件全盘搜索 多线程 vs2005 winform

    原作者的话【自己写的多线程文件搜索,支持全盘搜索、路径搜索、支持扩展,默认搜索指定文件名的所有类型文件,可自行按需要修改。做这个东东是因为最近项目里用到了,网上这方面的代码不多,特别是多线程的,所以...

    多线程字符串代码文件搜索器

    VC实现 功能: 在指定目录下的所有文件中,搜索 查找提定的多个字符串 可以创建指定个数的线程,最多30个,并支持设置各个线程的优先级

    反编译指定文件夹下的所有jar包和calss文件,并放到原目录结构中(本项目是java开发的项目使用了springboot框架)

    1.此工具会查找目标文件夹下所有jar包,并解压到源文件目录 2.没有解压到其他目录是因为减少复制的时间 3.解压完成后程序会删除原来的jar包 4.删除jar包的原因是程序可以手动终止,重启会继续解压剩下的jar(类似...

    文件遍历器,支持子目录遍历,后缀名以及搜索特定文件

    1. 首先设定一个要遍历的文件夹,可以设置要遍历文件的后缀名或者不设置,可以选择是否遍历子目录或者只是根目录,进行所有文件的遍历并输出找到的文件的文件名,文件完整路径,修改时间,文件大小到超级列表框。...

    文件快速查找

    vc++平台下的多线程快速查找指定目录下的文件。快速,无遗漏!

    c#递归扫描指定文件夹下的所有word文件,查找文件中是否包含某一字符串

    c#扫描指定文件夹下的word文件,查找文件中是否包含某一字符串,使用NPOI实现,可以递归扫描子文件夹,这是一个例子的源代码,没有用多线程,建议自己加上线程处理。使用.Net framework 4.5

    Http/FTP多线程断点续传下载组件

    点量Http/FTP下载组件(DLL)支持多线程、断点续传、显示详细下载过程、自动查找镜像网址、支持代理传输等完善的功能。 点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++...

    socket-支持断点续传java多线程下载

    2 通过webservice将本地版本号与服务器版本号进行比对,如果服务器发布的版本号大于客户端版本号,则从服务器查找要更新的文件。 3 启动主线程,根据线程个数划分每个线程的下载范围。 4启动下载子线程开始下载,...

    实现一个文件查找程序(linux)实现代码

    myfind命令从指定的目录下开始,递归地查找指定文件。其命令格式如下: myfind PATH -option 参数 [-print] [-exec 命令 {} \;] PATH:查找的起始目录。 -option 参数:用来控制搜索方式,具体如下(以下只给我常用...

    c#多线程抓取网页内容

    所以,爬虫需要有多线程(可控数量)同时下载网页。 好了,认识、分析完问题,就是解决问题了: 多线程在C#中并不难实现。它有一个命名空间:System.Threading,提供了多线程的支持。 要开启一个新线程,需要...

    代码查找器源代码

    压缩包是纯粹的源代码,主要实现功能:1,遍历指定目录查找文件和文件夹,并从文件内容中查找;2,无边框移动窗体;3,多线程应用;4,像VB代码一样有色区别代码中的注释内容和非注释内容。 注:因为用到了多线程,...

    Visual C++程序开发范例宝典 - 第5章

    实例178 使用多线程实现文件快速搜索 实例179 检查文件是否存在 实例180 提取指定文件夹目录到INI文件 5.3 与文件目录相关的命令操作 实例181 删除文件目录 实例182 重命名文件目录 5.4 文件、文件夹的复制和移动 ...

    网站备份文件扫描工具

    1.无限设置多个关键词和长尾词,软件会自动使用搜索智能引擎搜索,获取结果的域名进行网站空间文件扫描。 2.智能引擎搜索支持多种主流搜索引擎,目前支持百度,GOOGLE,有道,搜狗,雅虎,搜搜。 3.可导入自己本地域名...

    rar压缩软件.rar

    例如,这个命令将从当前目录中所有的 RAR 压缩文件中解压的 *.asm 文件: rar e '*.rar' '*.asm' 命令可以是下列中的任何一个: a 添加文件到压缩文件中。 例子: 1) 从当前目录添加所有的 *.hlp 文件到 ...

Global site tag (gtag.js) - Google Analytics