Java实现大量文件中读取关键字

package searchWorld;

// 实现从大量文件中超过一百次的关键字

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.LongAdder;

public class BlockingQueueTest {
    // blockqueue len = 10
    private static final int FILE_QUEUE_SIZE = 10;
    private static final int SEARCH_THREADS = 1000;
    private static final File DUMMY = new File("");
    private static BlockingQueue<File> queue = new ArrayBlockingQueue<>(FILE_QUEUE_SIZE);
    private static ConcurrentHashMap<String,LongAdder> hashMap = new ConcurrentHashMap<>();
    public static void main(String[] args) {
        // input a dir

        try(Scanner in = new Scanner(System.in)) {
            System.out.println("请输入一个目录");
            String directory = in.nextLine();
            Runnable enumerator = () -> {
                try {
                    enumrate(new File(directory));

                    // add a last file DUMMY as bool
                    queue.put(DUMMY);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            new Thread(enumerator).start();
            for (int i = 1; i <=SEARCH_THREADS ; i++) {
                Runnable search = ()->{
                  boolean done = false;
                  while (!done){
                      try {
                          File file = queue.take();
                          if(file == DUMMY){
                              queue.put(file);
                              done = true;
                          }else search(file);
                          done = true;
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
                };
                new Thread(search).start();
            }

            while (Thread.activeCount() == 1){
                getMoreHundredWord();
            }
        }


    }

    // put all file to a blockqueue
    public static void enumrate(File directory) throws InterruptedException{
        File[] files = directory.listFiles();
        for (File file: files
             ) {
            if(file.isDirectory()) enumrate(file);
            else {queue.put(file);}
        }
    }

    // search keywords
    public static void search(File file) throws IOException{
        try(Scanner in = new Scanner(file,"UTF-8")) {
            while (in.hasNextLine()){
                String line = in.nextLine();
                // regular get word
                line =line.replaceAll("[^a-zA-Z\\s+]", "");
                String[] words =line.split("[\\s+,\\.\n]");
                System.out.println(words);
                for(String word:words) {
                    // automic update
                    hashMap.putIfAbsent(word, new LongAdder());
                    hashMap.get(word).increment();
                }
            }
        }

    }

    // get > 100 words
    public static void getMoreHundredWord(){
        hashMap.forEach(1,
                (k, v) -> {
                if (v.longValue() > new Long(100).longValue())
                System.out.println(k + " -> " + v);
        });

    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端儿

Tree

Little Valentine liked playing with binary trees very much. Her favorite game wa...

17220
来自专栏高性能服务器开发

(三)dict哈希结构3

/* This function performs just a step of rehashing, and only if there are * no...

29080
来自专栏ml

位运算的方法,大结

Title:       位操作基础篇之位操作全面总结 Author:     MoreWindows E-mail:      morewindows@126...

64880
来自专栏扎心了老铁

java优雅的使用elasticsearch api

本文给出一种优雅的拼装elasticsearch查询的方式,可能会使得使用elasticsearch的方式变得优雅起来,使得代码结构很清晰易读。 建立elast...

1.2K70
来自专栏PPV课数据科学社区

【学习】七天搞定SAS(二):基本操作(判断、运算、基本函数)

SAS生成新变量 SAS支持基本的加减乘除,值得一提的是它的**代表指数,而不是^。 * Modify homegarden data set with ass...

49640
来自专栏函数式编程语言及工具

FunDA(1)- Query Result Row:强类型Query结果行

    FunDA的特点之一是以数据流方式提供逐行数据操作支持。这项功能解决了FRM如Slick数据操作以SQL批次模式为主所产生的问题。为了实现安全高效的数据...

20890
来自专栏码匠的流水账

聊聊storm的WindowedBolt

storm-2.0.0/storm-client/src/jvm/org/apache/storm/topology/IWindowedBolt.java

9520
来自专栏码匠的流水账

聊聊storm的WindowedBolt

storm-2.0.0/storm-client/src/jvm/org/apache/storm/topology/IWindowedBolt.java

25640
来自专栏swag code

HeapSort-堆排序-完全二叉树

堆可以看成是一棵完全二叉树,根节点永远是最大的值。每个根的子节点有两个,左子节点是2*i+1,右子节点是2*i+2。每个子节点的父节点是(i-1)/2。子节点...

23540
来自专栏mathor

2018年全国多校算法寒假训练营练习比赛(第一场)六子冲

 棋盘上攻击方的2个棋子(2子必须相连并主动移动其中的1个)与被攻方的1个棋子皆处在一条直线上并相邻时,被攻方的这个棋子就被消灭  每次移动后判断一下,移动后...

9430

扫码关注云+社区

领取腾讯云代金券