`
xurichusheng
  • 浏览: 346315 次
  • 性别: 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 给关掉。

相关推荐

    全盘遍历查找文件(多线程)

    本文将详细讲解如何利用C#编程语言,结合多线程技术实现全盘遍历查找文件,并使用递归算法提高查找效率。 首先,让我们了解“全盘遍历查找文件”的基本概念。这指的是遍历计算机硬盘上的所有目录和子目录,查找符合...

    C# 多线程查找文件

    在多线程查找文件的场景下,我们可能希望在多个线程上并行搜索指定目录下的文件。这可以显著减少搜索时间,特别是对于大型文件系统。我们可以使用Directory类和File类提供的方法,如Directory.GetFiles(),来遍历...

    Delphi多线程查找文件工具(源码)

    本项目“Delphi多线程查找文件工具”是一个采用Delphi编程语言实现的实用工具,适用于Delphi XE6及更高版本。这个工具的设计目的是利用多线程技术在Windows操作系统中快速地搜索指定磁盘中的文件,并记录下搜索过程...

    查找指定目录的所有文件(PB9)

    标题 "查找指定目录的所有文件(PB9)" 涉及的是在编程环境下,特别是PowerBuilder 9(PB9)中实现文件系统操作的功能。PowerBuilder是Sybase公司开发的一种可视化的、面向对象的编程工具,主要用于构建桌面应用程序。...

    使用线程动态遍历查找文件变化

    总之,"使用线程动态遍历查找文件变化"是一种实用的技术,它结合了基本的文件操作和多线程编程,用于实时监测文件系统的变化。这在开发需要实时响应文件变动的应用,如版本控制系统、日志分析工具,或是自动化测试...

    c#x写的多线程文件搜索查找

    例如,`Directory.GetFiles()`方法可以递归查找指定目录下的所有文件,而`Directory.GetDirectories()`则用于获取子目录。配合多线程,可以将搜索任务分配到不同的线程上,加快搜索速度。 3. **ListView 控件**:...

    易语言多线程读取大文本文件源码

    而多线程读取则可以分块处理文件,避免一次性加载所有数据,提高程序响应速度。 在易语言中,我们可以创建多个线程,每个线程负责读取文件的一部分。具体步骤可能包括以下几点: 1. **初始化线程**:使用“创建...

    VC++编写的多线程查找文件(功能增强版).

    6. **.cpp文件**:这些是C++源代码文件,比如`多线程查找文件.cpp`可能包含了主程序逻辑,`RapidFinder.cpp`可能包含了快速查找算法的实现,`SetAttr.cpp`可能涉及设置文件属性,`Rename.cpp`则可能是关于文件重命名...

    多线程查找文件工程增强版[分享]

    本文将深入探讨“多线程查找文件工程增强版”的核心知识点,帮助你理解和掌握如何利用多线程优化文件搜索效率。 首先,我们要理解什么是多线程。在计算机科学中,线程是操作系统分配处理器时间的基本单位,一个进程...

    多线程文件搜索器非常好

    每个线程负责一个独立的搜索任务,例如在一个磁盘分区或者特定目录下查找指定文件,这样能显著减少整体的等待时间。 二、VC++与多线程 Visual C++(简称VC++)是微软开发的一款强大的C++集成开发环境,支持创建...

    VC实现多线程进行文件搜索

    对于**文件搜索**功能,通常我们需要遍历指定目录及其子目录,查找符合特定条件的文件。在多线程环境中,我们可以将每个目录的搜索任务分配给一个单独的线程,这样可以同时搜索多个目录,显著提高搜索速度。 线程间...

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

    1. **查找文件**:此工具能够快速定位到用户指定目录下的文件,这可能是通过遍历文件系统目录结构,使用深度优先或广度优先搜索算法来实现的。用户可以自定义搜索条件,例如特定的文件名或文件扩展名。 2. **修改...

    VC 多线程查找文件程序示例.rar

    这个"VC 多线程查找文件程序示例"旨在展示如何利用多线程技术来加速文件查找过程。在单线程环境中,查找操作会依次检查每个文件,而在多线程环境下,可以同时处理多个文件,从而显著提高效率。 多线程的基本概念是...

    查找文件目录下的所有txt文件源代码

    为了提高效率,可以考虑使用递归方式遍历子目录,或者使用多线程并行处理不同子目录。同时,如果目录结构非常大,还可以添加缓存机制来避免重复读取已检查过的文件。 5. **错误处理**: 在实际应用中,应添加适当...

    多线程搜索文件程序

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

    多线程文件搜索器.zip

    例如,在文件搜索器中,这个函数可能包含了遍历文件夹、查找指定文件类型的逻辑。 3. **多线程退出函数** 当线程完成任务或需要终止时,需要有一个机制来安全地退出。在MFC中,可以使用`AfxEndThread`函数来结束...

    获取指定目录下的文件

    在本教程中,我们将探讨如何利用QT5库来获取指定目录下的特定类型文件,以实现一个基本的文件搜索功能。QT5是一个强大的跨平台应用程序开发框架,它提供了丰富的API用于文件和目录操作。 首先,我们要导入QT5中的`...

    vc用多线程查找文件的例子.visual c++

    总的来说,这个例子提供了一个学习如何在VC++中使用多线程查找文件的良好起点。通过分析源代码,你可以深入理解线程的创建、同步以及如何利用Windows API进行文件搜索。这将有助于提升你的C++和多线程编程能力,特别...

    C#,多线程,搜索文件,查找文件,源代码

    使用`Directory.GetFiles`方法可以实现指定目录下文件的搜索,通过传入通配符(如"*.*")可以匹配所有文件类型。 多线程搜索文件的基本思路是将文件夹结构分解为多个任务,每个任务在一个单独的线程上运行。可以...

    BCB如何搜索指定目录下的文件

    当处理大量文件时,应考虑使用异步或多线程来提高性能。可以使用 `TTask` 或创建自定义线程来并行搜索不同的目录。 6. **异常处理** 在进行文件操作时,务必包含适当的异常处理代码,以处理可能的文件访问权限...

Global site tag (gtag.js) - Google Analytics