使用多线程查找指定目录下的所有文件
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
分享到:
相关推荐
本文将详细讲解如何利用C#编程语言,结合多线程技术实现全盘遍历查找文件,并使用递归算法提高查找效率。 首先,让我们了解“全盘遍历查找文件”的基本概念。这指的是遍历计算机硬盘上的所有目录和子目录,查找符合...
在多线程查找文件的场景下,我们可能希望在多个线程上并行搜索指定目录下的文件。这可以显著减少搜索时间,特别是对于大型文件系统。我们可以使用Directory类和File类提供的方法,如Directory.GetFiles(),来遍历...
本项目“Delphi多线程查找文件工具”是一个采用Delphi编程语言实现的实用工具,适用于Delphi XE6及更高版本。这个工具的设计目的是利用多线程技术在Windows操作系统中快速地搜索指定磁盘中的文件,并记录下搜索过程...
标题 "查找指定目录的所有文件(PB9)" 涉及的是在编程环境下,特别是PowerBuilder 9(PB9)中实现文件系统操作的功能。PowerBuilder是Sybase公司开发的一种可视化的、面向对象的编程工具,主要用于构建桌面应用程序。...
总之,"使用线程动态遍历查找文件变化"是一种实用的技术,它结合了基本的文件操作和多线程编程,用于实时监测文件系统的变化。这在开发需要实时响应文件变动的应用,如版本控制系统、日志分析工具,或是自动化测试...
例如,`Directory.GetFiles()`方法可以递归查找指定目录下的所有文件,而`Directory.GetDirectories()`则用于获取子目录。配合多线程,可以将搜索任务分配到不同的线程上,加快搜索速度。 3. **ListView 控件**:...
而多线程读取则可以分块处理文件,避免一次性加载所有数据,提高程序响应速度。 在易语言中,我们可以创建多个线程,每个线程负责读取文件的一部分。具体步骤可能包括以下几点: 1. **初始化线程**:使用“创建...
6. **.cpp文件**:这些是C++源代码文件,比如`多线程查找文件.cpp`可能包含了主程序逻辑,`RapidFinder.cpp`可能包含了快速查找算法的实现,`SetAttr.cpp`可能涉及设置文件属性,`Rename.cpp`则可能是关于文件重命名...
本文将深入探讨“多线程查找文件工程增强版”的核心知识点,帮助你理解和掌握如何利用多线程优化文件搜索效率。 首先,我们要理解什么是多线程。在计算机科学中,线程是操作系统分配处理器时间的基本单位,一个进程...
每个线程负责一个独立的搜索任务,例如在一个磁盘分区或者特定目录下查找指定文件,这样能显著减少整体的等待时间。 二、VC++与多线程 Visual C++(简称VC++)是微软开发的一款强大的C++集成开发环境,支持创建...
对于**文件搜索**功能,通常我们需要遍历指定目录及其子目录,查找符合特定条件的文件。在多线程环境中,我们可以将每个目录的搜索任务分配给一个单独的线程,这样可以同时搜索多个目录,显著提高搜索速度。 线程间...
1. **查找文件**:此工具能够快速定位到用户指定目录下的文件,这可能是通过遍历文件系统目录结构,使用深度优先或广度优先搜索算法来实现的。用户可以自定义搜索条件,例如特定的文件名或文件扩展名。 2. **修改...
这个"VC 多线程查找文件程序示例"旨在展示如何利用多线程技术来加速文件查找过程。在单线程环境中,查找操作会依次检查每个文件,而在多线程环境下,可以同时处理多个文件,从而显著提高效率。 多线程的基本概念是...
为了提高效率,可以考虑使用递归方式遍历子目录,或者使用多线程并行处理不同子目录。同时,如果目录结构非常大,还可以添加缓存机制来避免重复读取已检查过的文件。 5. **错误处理**: 在实际应用中,应添加适当...
本程序用多线程对某个文件进行搜索,如果是文件就查找这个文件是否包含某个关键字,包含就输出文件名,如果不是文件,而是文件夹则再继续处理,如果是压缩文件又另外处理
例如,在文件搜索器中,这个函数可能包含了遍历文件夹、查找指定文件类型的逻辑。 3. **多线程退出函数** 当线程完成任务或需要终止时,需要有一个机制来安全地退出。在MFC中,可以使用`AfxEndThread`函数来结束...
在本教程中,我们将探讨如何利用QT5库来获取指定目录下的特定类型文件,以实现一个基本的文件搜索功能。QT5是一个强大的跨平台应用程序开发框架,它提供了丰富的API用于文件和目录操作。 首先,我们要导入QT5中的`...
总的来说,这个例子提供了一个学习如何在VC++中使用多线程查找文件的良好起点。通过分析源代码,你可以深入理解线程的创建、同步以及如何利用Windows API进行文件搜索。这将有助于提升你的C++和多线程编程能力,特别...
使用`Directory.GetFiles`方法可以实现指定目录下文件的搜索,通过传入通配符(如"*.*")可以匹配所有文件类型。 多线程搜索文件的基本思路是将文件夹结构分解为多个任务,每个任务在一个单独的线程上运行。可以...
当处理大量文件时,应考虑使用异步或多线程来提高性能。可以使用 `TTask` 或创建自定义线程来并行搜索不同的目录。 6. **异常处理** 在进行文件操作时,务必包含适当的异常处理代码,以处理可能的文件访问权限...