文档章节

使用fork/join,生产者-消费者模式和lucene搜索文件

天之妖星
 天之妖星
发布于 2017/05/08 14:24
字数 780
阅读 4
收藏 0

本人邮箱: kco1989@qq.com
欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco

> github: https://github.com/kco1989/kco


概述

改程序是通过对系统的文件用lucene来建立索引,然后再通过制定的关键词和后缀进行搜索.


程序说明

程序概述

该程序使用fork/join模式进行对目标文件的搜索,并且以生产者->消费者的模式对收集的目标文件进行索引的建立,该程序相对比较简单一点,可以供初学者对fork/join生产者->消费者有简单的认识和应用.

使用说明

  • 首先运行com.kco.Test#testIndex 先对指定的文件夹建立索引
  • 再运行com.kco.Test#testSearch 输入指定的关键字进行查询

程序结构

  • src

    • main
    • java
      • com.kco
      • Constant.java 常量类
      • IndexFileRunnable.java 对文件建索引的Runnabel
      • SearchFileAction.java 查询需要建索引的文件Action
      • SearchFileUtils.java 查询文件的工具类
    • test
    • java
      • com.kco
      • Test.java 测试程序
  • Constant.java 仅仅存放了程序用到的一些常量类

  • SearchFileUtils.java 这个用来建立索引和查询的工具栏
    • 构造方法 public SearchFileUtils(Analyzer analyzer, String indexPath, File searchBaseFile,String suffix) throws IOException
    • Analyzer analyzer 用于指定分词器
    • String indexPath 索引的存放路径
    • File searchBaseFile 需要建立索引的目标文件夹
    • String suffix 需要建立索引的文件后缀名,如果该值为”*”,则对该目录的所有文件都进行索引
    • 建立索引方法 public void indexFile() throws Exception{}
      这里使用的java7的ForkJoinPool,实现的步骤为:
      1. 判断目标文件夹这个目录时候存在,不存在的直接返回.若存在,这继续.
      2. 遍历目标文件下的所有文件,依次判断
        2.1. 判断目标时候为隐藏文件,若是,这跳过
        2.2. 判断目标时候为文件,若否,则继续.如是,判断时候满足以下条件,满足这目标文件放到队列中
        2.2.1. 判断suffix时候为”*”
        2.2.2. 如果suffix不是”*”,着判断目标文件时候和suffix一致
        2.3. 判断目标时候为文件夹,若是,则判断当前的线程池的个数术后超过50个,若是,这继续第1步,否则建立新的线程继续处理
      3. 启动线程IndexFileRunnable,一致去查询队列时候有值,若有,则获取目标文件,并对目标文件建立索引
      4. 等到ForkJoinPool线程池时候执行完成,则调用IndexFileRunnable#setStop停止建立索引的线程
    • 查询方法public void search(String search,String suffix) throws IOException {},这个就相对简单一点了,
    • search 需要查询的文件名
    • suffix 查询文件名的后缀

程序github路径

searchFile download

最后声明: 因本人程序水平有限,程序中难免有bug,欢迎大家可以对程序bug或者又不懂的,可以与我进行讨论,kco1989@qq.com


打赏

如果觉得我的文章写的还过得去的话,有钱就捧个钱场,没钱给我捧个人场(帮我点赞或推荐一下)
微信打赏
支付宝打赏

© 著作权归作者所有

天之妖星
粉丝 1
博文 30
码字总数 58258
作品 0
深圳
高级程序员
私信 提问
多线程(四)之并发容器

一、并发容器 ConcurrentHashMap 为什么使用ConcurrentHashMap 在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,HashMap在并发执行put操作时,出发rehash时,可...

天空小小
2018/01/11
0
0
python--Selectors模块/队列

python--Selectors模块/队列 Selectors模块/队列 一 Selectors模块 IO多路复用实现机制 Win: select Linux:select(效率低) poll epoll(最好)默认选择epoll select缺点: 1 每次调用sel...

mickelfeng
2018/01/14
0
0
Android线程管理(三)——Thread类的内部原理、休眠及唤醒

上文对ActivityThread的工作流程进行了分析,本文将对Thread类的内部原理以及休眠唤醒进行说明。 三、Thread类的内部原理、休眠及唤醒 3.1 Thread类的内部原理 线程是CPU资源调度的基本单位,...

yhthu
2017/05/22
0
0
聊聊并发系列_Index

聊聊并发系列 聊聊并发(一)深入分析Volatile的实现原理 聊聊并发(二)Java SE1.6中的Synchronized 聊聊并发(三)Java线程池的分析和使用 聊聊并发(四)深入分析ConcurrentHashMap 聊聊并...

陶邦仁
2016/01/04
450
0
多线程程序设计学习(6)Producer-Consumer模式

Producer-Consumer【生产消费者模式】 一:Producer-Consumer pattern的参与者 --->产品(蛋糕) --->通道(传递蛋糕的桌子) --->生产者线程(制造蛋糕的线程) --->消费者线程(吃掉蛋糕的线...

无信不立
2015/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安卓Q | 文件存储沙箱化FAQ,你想知道的这里都有!

文件存储沙箱化作为Android Q最为重要的变更之一,对应用文件存储、访问、分享等操作都带来重大的影响,被众多开发者关注和讨论。本文邀请华为技术专家对开发者提到的重点问题进行了解答,以...

安卓绿色联盟
2分钟前
0
0
可以提高程序员效率的工具!

前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 本文记录一下我在平时喜欢用的一些小工具,以便以后重装系统/换电脑的时候能快速安装...

Java3y
24分钟前
0
0
将博客搬至CSDN

https://blog.csdn.net/qq_38157006

Marhal
30分钟前
1
0
unicode Java中求字符串长度length()和codePointCount()的区别

在计算字符串长度时,Java的两种方法length()和codePointCount()一度让我困惑,运行书上例子得到的长度值是相等的,那为什么要设定两个方法呢? 对于普通字符串,这两种方法得到的值是一样的...

泉天下
30分钟前
2
0
uin-app 一、学习理由

选择uni-app 理由 别人的理由 1. 5+ 有HTML5+和Native.js技术,HTML5+包含常用的跨平台的几百个API,能满足常规开发需求,而Native.js把40w原生api映 射成js对象,这样js可以直接调原生。HTM...

轻轻的往前走
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部