文件读取和操作类

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4.  
  5. public class Test3 {
  6.  
  7. private String keyWords;
  8.  
  9. public Test3(String keyWords){
  10. this.keyWords = keyWords;
  11. }
  12.  
  13. //计算文件数量
  14. public static int count = 0;
  15.  
  16. //搜索后查询到的文件路径汇总文件地址
  17. public static String searchedFilePath = "G:/Document/HongDaXingYe/SearchedDir/searchedFile.txt";
  18.  
  19. public static File searchedFile = null;
  20.  
  21. public static FileOutputStream fos = null;
  22.  
  23. public void search(){
  24. String path = "G:/Document/HongDaXingYe/Project/oa/workflow/home/weaver/ecology/workflow/";
  25. File file = new File(path);
  26. File[] files = file.listFiles();
  27. getFiles(files);
  28. System.out.println("count:" + count);
  29. }
  30.  
  31. //递归搜索文件并写入搜索到的路径到文件
  32. public void getFiles(File[] files){
  33. FileInputStream fis = null;
  34. try{
  35. for(File file : files){
  36. count++;
  37. if(file.isDirectory()){
  38. getFiles(file.listFiles());
  39. }else{
  40. StringBuffer sb = new StringBuffer();
  41. byte[] bytes = new byte[1024];
  42. fis = new FileInputStream(file);
  43. int len = 0;
  44. while((len = fis.read(bytes)) != -1){
  45. sb.append(new String(bytes, 0, len));
  46. }
  47. fis.close();
  48. if(sb.indexOf(keyWords) >= 0){
  49. System.out.println("包含关键字(" + keyWords + ")的文件路径:" + file.getAbsolutePath());
  50. fos.write(("包含关键字(" + keyWords + ")的文件路径:" + file.getAbsolutePath() + System.lineSeparator()).getBytes());
  51. fos.flush();
  52. }
  53. }
  54. }
  55. }catch(Exception e){
  56. e.printStackTrace();
  57. }
  58. }
  59.  
  60. }

多线程处理类

  1. import java.io.File;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.util.Scanner;
  5. import java.util.concurrent.LinkedBlockingQueue;
  6. import java.util.concurrent.ThreadPoolExecutor;
  7. import java.util.concurrent.TimeUnit;
  8.  
  9. public class TestThread2 implements Runnable{
  10.  
  11. private int taskNum;
  12. private String keyWords;
  13.  
  14. public TestThread2(int taskNum, String keyWords){
  15. this.taskNum = taskNum;
  16. this.keyWords = keyWords;
  17. }
  18.  
  19. public static void main(String[] args){
  20. String searchedFilePath = "G:/Document/HongDaXingYe/SearchedDir/searchedFile.txt";
  21. File searchedFile = new File(searchedFilePath);
  22. FileOutputStream fos = null;
  23. try{
  24. fos = new FileOutputStream(searchedFile);
  25. if(!searchedFile.exists()){
  26. searchedFile.createNewFile();
  27. }
  28. Test3.fos = fos;
  29. }catch(Exception e){
  30. e.printStackTrace();
  31. }
  32. Scanner input = new Scanner(System.in);
  33. System.out.println("请输入需要搜索的关键字(如果有多个,用英文半角逗号隔开):");
  34. String keyWordsStr = input.next();
  35. String[] keyWordsArr = null;
  36. if(keyWordsStr.indexOf(",") > 0){
  37. keyWordsArr = keyWordsStr.split(",");
  38. }else{
  39. keyWordsArr = new String[]{ keyWordsStr };
  40. }
  41. input.close();
  42. LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
  43. ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 100, 3600, TimeUnit.SECONDS, workQueue);
  44. for(int i = 0; i < keyWordsArr.length; i++){
  45. String keyWords = keyWordsArr[i];
  46. TestThread testThread = new TestThread(i, keyWords);
  47. executor.execute(testThread);
  48. }
  49. if(executor.isTerminated() && Test3.fos != null){
  50. try {
  51. Test3.fos.close();
  52. } catch (IOException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. }
  57.  
  58. @Override
  59. public void run() {
  60. System.out.println("正在执行task " + taskNum);
  61. System.out.println("当前关键字:" + keyWords);
  62. Test3 test3 = new Test3(keyWords);
  63. test3.search();
  64. System.out.println("task " + taskNum + "执行完毕");
  65. }
  66.  
  67. }

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. I.MX6 简单电路模拟USB设备的插入

    /**************************************************************************** * I.MX6 简单电路模拟USB设备的插入 ...

  2. Java-Maven:Maven百科

    ylbtech-Java-Maven:Maven百科 1.返回顶部 1. Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具.Maven 除了以程序 ...

  3. UI:sqlite数据库

    使用sqllite的时候一些笔记 数据库(管理类),在工程 general 导入 动态链接库 libsqllite3.0.dylib  在.h文件里引入导入 sqllite3.h 头文件 在.h里面声 ...

  4. PCB 铜皮(Surface)折线多边形扩大缩小实现(第一节)

    继续铜皮多边形的相关的算法, 如何用代码实现多边形的扩大与缩小,这部份内容准备分为四节内容来讲解, 第一节,折线多边形的扩大缩小(不包含圆弧)   此篇讲第一节 第二节,带圆弧的多边形的扩大缩小 第三 ...

  5. 【POJ - 1458】Common Subsequence(动态规划)

    Common Subsequence Descriptions: A subsequence of a given sequence is the given sequence with some e ...

  6. hasLayout原理【转】

    项目中经常用到:*html .clearfix{ height:1%;}  //IE6能识别*+html .clearfix{height:1%;} //IE7能识别1,有很多方式能触发hasLayo ...

  7. 洛谷 P1430 序列取数

    如果按照http://www.cnblogs.com/hehe54321/p/loj-1031.html的$O(n^3)$做法去做的话是会T掉的,但是实际上那个做法有优化的空间. 所有操作可以分解为由 ...

  8. Zygote和System进程的启动过程、Android应用进程启动过程

    1.基本过程 init脚本的启动Zygote Zygote进程的启动 System进程的启动 Android应用进程启动过程 2.init脚本的启动 +------------+ +-------+ ...

  9. Android Dialogs(3)警示Dialog教程[创建,单选,复选,自定义]等等

    本节内容 1. Building an Alert Dialog 2. Adding buttons 3. Adding a list 4. Adding a persistent multiple- ...

  10. 关于flex布局对自己的影响

    对于本图来说用了一个效果就能达到这种情况,对于我来说,今天是有进步的,具体操作就是盒子模型确实,在什么地方起来的flex就运用到该地方去,刚 开始就一直有问题,思考了半天,原来是我的控制代码出现了点错 ...