使用多线程查找指定目录下的所有文件
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
分享到:
相关推荐
本程序用多线程对某个文件进行搜索,如果是文件就查找这个文件是否包含某个关键字,包含就输出文件名,如果不是文件,而是文件夹则再继续处理,如果是压缩文件又另外处理
查找文件 修改版本 备份 FTP备份 多线程查找修改的文件,生成更新版本。可以查询指定目录、扩展名,可以排除目录和扩展名 运行环境:.net framework 4.0及以上。
以前下载的时候多半要下载到很多看不了,解压出错的东西,这次我将自己手里的资料整理了一下,给大家一个质量的保证! 3.请大家下载后点击评论,这样即看到书,有不丢失您的分数! 4.电脑里存储了大量文章和源...
原作者的话【自己写的多线程文件搜索,支持全盘搜索、路径搜索、支持扩展,默认搜索指定文件名的所有类型文件,可自行按需要修改。做这个东东是因为最近项目里用到了,网上这方面的代码不多,特别是多线程的,所以...
VC实现 功能: 在指定目录下的所有文件中,搜索 查找提定的多个字符串 可以创建指定个数的线程,最多30个,并支持设置各个线程的优先级
1.此工具会查找目标文件夹下所有jar包,并解压到源文件目录 2.没有解压到其他目录是因为减少复制的时间 3.解压完成后程序会删除原来的jar包 4.删除jar包的原因是程序可以手动终止,重启会继续解压剩下的jar(类似...
1. 首先设定一个要遍历的文件夹,可以设置要遍历文件的后缀名或者不设置,可以选择是否遍历子目录或者只是根目录,进行所有文件的遍历并输出找到的文件的文件名,文件完整路径,修改时间,文件大小到超级列表框。...
vc++平台下的多线程快速查找指定目录下的文件。快速,无遗漏!
c#扫描指定文件夹下的word文件,查找文件中是否包含某一字符串,使用NPOI实现,可以递归扫描子文件夹,这是一个例子的源代码,没有用多线程,建议自己加上线程处理。使用.Net framework 4.5
点量Http/FTP下载组件(DLL)支持多线程、断点续传、显示详细下载过程、自动查找镜像网址、支持代理传输等完善的功能。 点量Http、FTP下载内核源码使用高效的c++代码编写,提供标准的动态链接库(DLL),可供C/C++...
2 通过webservice将本地版本号与服务器版本号进行比对,如果服务器发布的版本号大于客户端版本号,则从服务器查找要更新的文件。 3 启动主线程,根据线程个数划分每个线程的下载范围。 4启动下载子线程开始下载,...
myfind命令从指定的目录下开始,递归地查找指定文件。其命令格式如下: myfind PATH -option 参数 [-print] [-exec 命令 {} \;] PATH:查找的起始目录。 -option 参数:用来控制搜索方式,具体如下(以下只给我常用...
所以,爬虫需要有多线程(可控数量)同时下载网页。 好了,认识、分析完问题,就是解决问题了: 多线程在C#中并不难实现。它有一个命名空间:System.Threading,提供了多线程的支持。 要开启一个新线程,需要...
压缩包是纯粹的源代码,主要实现功能:1,遍历指定目录查找文件和文件夹,并从文件内容中查找;2,无边框移动窗体;3,多线程应用;4,像VB代码一样有色区别代码中的注释内容和非注释内容。 注:因为用到了多线程,...
实例178 使用多线程实现文件快速搜索 实例179 检查文件是否存在 实例180 提取指定文件夹目录到INI文件 5.3 与文件目录相关的命令操作 实例181 删除文件目录 实例182 重命名文件目录 5.4 文件、文件夹的复制和移动 ...
1.无限设置多个关键词和长尾词,软件会自动使用搜索智能引擎搜索,获取结果的域名进行网站空间文件扫描。 2.智能引擎搜索支持多种主流搜索引擎,目前支持百度,GOOGLE,有道,搜狗,雅虎,搜搜。 3.可导入自己本地域名...
例如,这个命令将从当前目录中所有的 RAR 压缩文件中解压的 *.asm 文件: rar e '*.rar' '*.asm' 命令可以是下列中的任何一个: a 添加文件到压缩文件中。 例子: 1) 从当前目录添加所有的 *.hlp 文件到 ...