java线程池 多线程搜索文件包含关键字所在的文件路径
文件读取和操作类
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- public class Test3 {
- private String keyWords;
- public Test3(String keyWords){
- this.keyWords = keyWords;
- }
- //计算文件数量
- public static int count = 0;
- //搜索后查询到的文件路径汇总文件地址
- public static String searchedFilePath = "G:/Document/HongDaXingYe/SearchedDir/searchedFile.txt";
- public static File searchedFile = null;
- public static FileOutputStream fos = null;
- public void search(){
- String path = "G:/Document/HongDaXingYe/Project/oa/workflow/home/weaver/ecology/workflow/";
- File file = new File(path);
- File[] files = file.listFiles();
- getFiles(files);
- System.out.println("count:" + count);
- }
- //递归搜索文件并写入搜索到的路径到文件
- public void getFiles(File[] files){
- FileInputStream fis = null;
- try{
- for(File file : files){
- count++;
- if(file.isDirectory()){
- getFiles(file.listFiles());
- }else{
- StringBuffer sb = new StringBuffer();
- byte[] bytes = new byte[1024];
- fis = new FileInputStream(file);
- int len = 0;
- while((len = fis.read(bytes)) != -1){
- sb.append(new String(bytes, 0, len));
- }
- fis.close();
- if(sb.indexOf(keyWords) >= 0){
- System.out.println("包含关键字(" + keyWords + ")的文件路径:" + file.getAbsolutePath());
- fos.write(("包含关键字(" + keyWords + ")的文件路径:" + file.getAbsolutePath() + System.lineSeparator()).getBytes());
- fos.flush();
- }
- }
- }
- }catch(Exception e){
- e.printStackTrace();
- }
- }
- }
多线程处理类
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Scanner;
- import java.util.concurrent.LinkedBlockingQueue;
- import java.util.concurrent.ThreadPoolExecutor;
- import java.util.concurrent.TimeUnit;
- public class TestThread2 implements Runnable{
- private int taskNum;
- private String keyWords;
- public TestThread2(int taskNum, String keyWords){
- this.taskNum = taskNum;
- this.keyWords = keyWords;
- }
- public static void main(String[] args){
- String searchedFilePath = "G:/Document/HongDaXingYe/SearchedDir/searchedFile.txt";
- File searchedFile = new File(searchedFilePath);
- FileOutputStream fos = null;
- try{
- fos = new FileOutputStream(searchedFile);
- if(!searchedFile.exists()){
- searchedFile.createNewFile();
- }
- Test3.fos = fos;
- }catch(Exception e){
- e.printStackTrace();
- }
- Scanner input = new Scanner(System.in);
- System.out.println("请输入需要搜索的关键字(如果有多个,用英文半角逗号隔开):");
- String keyWordsStr = input.next();
- String[] keyWordsArr = null;
- if(keyWordsStr.indexOf(",") > 0){
- keyWordsArr = keyWordsStr.split(",");
- }else{
- keyWordsArr = new String[]{ keyWordsStr };
- }
- input.close();
- LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
- ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 100, 3600, TimeUnit.SECONDS, workQueue);
- for(int i = 0; i < keyWordsArr.length; i++){
- String keyWords = keyWordsArr[i];
- TestThread testThread = new TestThread(i, keyWords);
- executor.execute(testThread);
- }
- if(executor.isTerminated() && Test3.fos != null){
- try {
- Test3.fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void run() {
- System.out.println("正在执行task " + taskNum);
- System.out.println("当前关键字:" + keyWords);
- Test3 test3 = new Test3(keyWords);
- test3.search();
- System.out.println("task " + taskNum + "执行完毕");
- }
- }
java线程池 多线程搜索文件包含关键字所在的文件路径的更多相关文章
- java线程池 多线程 搜索包含关键字的文件路径
package org.jimmy.searchfile20180807.main; public class ThreadMain implements Runnable{ private int ...
- Java线程和多线程(十二)——线程池基础
Java 线程池管理多个工作线程,其中包含了一个队列,包含着所有等待被执行的任务.开发者可以通过使用ThreadPoolExecutor来在Java中创建线程池. 线程池是Java中多线程的一个重要概 ...
- Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程
下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...
- Java多线程和并发(十二),Java线程池
目录 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 6.线程 ...
- 【Java 多线程】Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类
Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建 ...
- Java线程池的原理及几类线程池的介绍
刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...
- java线程池原理
在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 ...
- Java线程池实现
电脑的CPU资源是有限的,任务的处理速度与线程数量之间并不是正相关.当线程数量过多,CPU要频繁的在不同线程切换,反而会引起处理性能的下降.线程池中最大的线程数,是考虑多种因素来事先设定的,比如硬件的 ...
- 含源码解析,深入Java 线程池原理
从池化技术到底层实现,一篇文章带你贯通线程池技术. 1.池化技术简介 在系统开发过程中,我们经常会用到池化技术来减少系统消耗,提升系统性能. 在编程领域,比较典型的池化技术有: 线程池.连接池.内存池 ...
随机推荐
- I.MX6 简单电路模拟USB设备的插入
/**************************************************************************** * I.MX6 简单电路模拟USB设备的插入 ...
- Java-Maven:Maven百科
ylbtech-Java-Maven:Maven百科 1.返回顶部 1. Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.Maven 除了以程序 ...
- UI:sqlite数据库
使用sqllite的时候一些笔记 数据库(管理类),在工程 general 导入 动态链接库 libsqllite3.0.dylib 在.h文件里引入导入 sqllite3.h 头文件 在.h里面声 ...
- PCB 铜皮(Surface)折线多边形扩大缩小实现(第一节)
继续铜皮多边形的相关的算法, 如何用代码实现多边形的扩大与缩小,这部份内容准备分为四节内容来讲解, 第一节,折线多边形的扩大缩小(不包含圆弧) 此篇讲第一节 第二节,带圆弧的多边形的扩大缩小 第三 ...
- 【POJ - 1458】Common Subsequence(动态规划)
Common Subsequence Descriptions: A subsequence of a given sequence is the given sequence with some e ...
- hasLayout原理【转】
项目中经常用到:*html .clearfix{ height:1%;} //IE6能识别*+html .clearfix{height:1%;} //IE7能识别1,有很多方式能触发hasLayo ...
- 洛谷 P1430 序列取数
如果按照http://www.cnblogs.com/hehe54321/p/loj-1031.html的$O(n^3)$做法去做的话是会T掉的,但是实际上那个做法有优化的空间. 所有操作可以分解为由 ...
- Zygote和System进程的启动过程、Android应用进程启动过程
1.基本过程 init脚本的启动Zygote Zygote进程的启动 System进程的启动 Android应用进程启动过程 2.init脚本的启动 +------------+ +-------+ ...
- Android Dialogs(3)警示Dialog教程[创建,单选,复选,自定义]等等
本节内容 1. Building an Alert Dialog 2. Adding buttons 3. Adding a list 4. Adding a persistent multiple- ...
- 关于flex布局对自己的影响
对于本图来说用了一个效果就能达到这种情况,对于我来说,今天是有进步的,具体操作就是盒子模型确实,在什么地方起来的flex就运用到该地方去,刚 开始就一直有问题,思考了半天,原来是我的控制代码出现了点错 ...