文件读取和操作类

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线程池 多线程搜索文件包含关键字所在的文件路径的更多相关文章

  1. java线程池 多线程 搜索包含关键字的文件路径

    package org.jimmy.searchfile20180807.main; public class ThreadMain implements Runnable{ private int ...

  2. Java线程和多线程(十二)——线程池基础

    Java 线程池管理多个工作线程,其中包含了一个队列,包含着所有等待被执行的任务.开发者可以通过使用ThreadPoolExecutor来在Java中创建线程池. 线程池是Java中多线程的一个重要概 ...

  3. Java线程状态、线程start方法源码、多线程、Java线程池、如何停止一个线程

    下面将依次介绍: 1. 线程状态.Java线程状态和线程池状态 2. start方法源码 3. 什么是线程池? 4. 线程池的工作原理和使用线程池的好处 5. ThreadPoolExecutor中的 ...

  4. Java多线程和并发(十二),Java线程池

    目录 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 6.线程 ...

  5. 【Java 多线程】Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

    Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建 ...

  6. Java线程池的原理及几类线程池的介绍

    刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...

  7. java线程池原理

    在什么情况下使用线程池?     1.单个任务处理的时间比较短     2.将需处理的任务的数量大     使用线程池的好处:     1.减少在创建和销毁线程上所花的时间以及系统资源的开销     ...

  8. Java线程池实现

    电脑的CPU资源是有限的,任务的处理速度与线程数量之间并不是正相关.当线程数量过多,CPU要频繁的在不同线程切换,反而会引起处理性能的下降.线程池中最大的线程数,是考虑多种因素来事先设定的,比如硬件的 ...

  9. 含源码解析,深入Java 线程池原理

    从池化技术到底层实现,一篇文章带你贯通线程池技术. 1.池化技术简介 在系统开发过程中,我们经常会用到池化技术来减少系统消耗,提升系统性能. 在编程领域,比较典型的池化技术有: 线程池.连接池.内存池 ...

随机推荐

  1. [Usaco2015 DEC] Counting Haybales

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4392 [算法] 线段树 时间复杂度 : O(MlogN) [代码] #include ...

  2. ['1' for i in range(4)]

    ' for i in range(4)]) 结果: [']

  3. 转载:NOR Flash擦写和原理分析

    1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存 ...

  4. DoDataExchange的作用

    void CDlgSelectCS::DoDataExchange(CDataExchange* pDX) {     CDialog::DoDataExchange(pDX);     DDX_Te ...

  5. ExtJS 4 MVC 创建 Viewport

    http://ext4all.com/post/extjs-4-mvc-with-viewport 效果图: 结构图: 没有用到Model层,直接在view里面写上 默认的 json的数据 中间Pan ...

  6. 【NOIP2006】作业调度方案 {语文难题}

    Description: 我们现在要利用 m 台机器加工 n 个工件,每个工件都有 m 道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间.  每个工件的每个工序称为一个 ...

  7. css设置页面全屏背景

    .background { background: url(xxx.png); background-size: 100% 100%; height: 100%; position: fixed; w ...

  8. 文件cp功能

    #include<stdio.h> #include<unistd.h> #include<fcntl.h> #include<string.h> in ...

  9. pytest的参数化

    参数化有两种方式: 1. @pytest.mark.parametrize 2.利用conftest.py里的 pytest_generate_tests 1中的例子如下: @pytest.mark. ...

  10. ROS学习笔记十一:创建URDF 文件并在RVIZ中查看模型

    Unified Robot Description Format,简称为URDF(标准化机器人描述格式),是一种用于描述机器人及其部分结构.关节.自由度等的XML格式文件. 一.创建第一个URDF文件 ...