利用JDK8的新特性计算某个目录下的文件中包含字符串的次数

需求:计算某个字符串在某个文件夹中出现的次数。**这篇文章利用了JDK1.8的新特性Stream流和Lambda表达式并结合了线程池的使用。**
package com.zkn.fullstacktraining.seventh;

import javafx.util.Pair;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
 * Created by zkn on 2017/2/5.
 */
public class SearchStringByThreadPool {

    public static void main(String[] args) {

        try {
            //创建5个固定线程的线程池
            ExecutorService executorService = Executors.newFixedThreadPool(5);
            List<Future<Pair<String, Integer>>> listFile =
                    //这里是取所传入目录的最多四层,如果不知道这个API的话需要递归去做。
                    Files.walk(Paths.get("D:\\CUST\\workspace\\JavaCore\\FullStackTraining\\src\\main\\java\\com\\zkn"), 4)
                            .filter(file -> !Files.isDirectory(file) && file.toString().endsWith("java"))//文件文件夹和不是java的文件
                            .map(file -> (Callable<Pair<String, Integer>>) () -> {//创建N多个Callable实现类
                                Pair<String, Integer> pair = null;//这里的键值对用pair比用Map更好一些
                                try {
                                    Optional optional = Files.lines(file).map(str -> {
                                        int count = 0;
                                        int index = str.indexOf("main");
                                        if (index >= 0) {
                                            //这里需要循环计算,因为可能在某一行中会出现多次
                                            do {
                                                count++;
                                            } while ((index = str.indexOf("main", index + 1)) > 0);
                                        }
                                        return count;
                                    }).reduce(Integer::sum);//合并最终的计算结果
                                    int count = optional.isPresent() ? (int) optional.get() :0;
                                    pair = new Pair<>(file.toString(),count);
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                                return pair == null ? new Pair<>("", 0) : pair;
                            })
                            .map(file -> executorService.submit(file))//提交给线程池进行处理
                            .collect(Collectors.toList());
            listFile.stream().map(file -> {
                Pair<String, Integer> pair = null;
                try {
                    pair = file.get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
                return pair == null ? new Pair<>("", 0) : pair;
            })
                    .filter(file -> file.getValue() > 0)//过滤掉不包含字符串的文件
                    .sorted((s1, s2) -> Integer.compare(s2.getValue(), s1.getValue()))//从大到小排序
                    .forEach(file -> System.out.println(String.format("%d次出现在%s文件中", file.getValue(), file.getKey())));
            //关闭线程池
            executorService.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void test() {
        String str = "mainmainmainmainmain";
    }
}
时间: 2024-10-28 02:34:02

利用JDK8的新特性计算某个目录下的文件中包含字符串的次数的相关文章

centos中查找并替换某个目录下所有文件中的某个字符串

因为某种原因项目中的某个方法丢失,而很多文件引用了该方法,需要将其全部替换为一个新的方法,引用的次数很多,手动改太麻烦.所以需要一次性替换. 例如要将目录 dir 下面所有文件中的 old 都修改成 new: sed -i "s/old/new/g" `grep 'old' -rl dir` 1.查找目录下包含某个字符串的文件 例:查找 dir 目录下所有包含 str 的文件. grep -lr 'str' dir  2.vim替换单个文件中所有字符串方法 例:替换当前文件中所有 ol

Android如何遍历特定目录下所有文件

第一个案例为大家分享了Android遍历特定目录下所有文件,包含子目录的,并删除最新创建的. private boolean deleteLastFromFloder(String path) { boolean success = false; try { ArrayList<File> images = new ArrayList<File>(); getFiles(images, path); File latestSavedImage = images.get(0); if

php计算指定目录下文件占用空间的方法

 这篇文章主要介绍了php计算指定目录下文件占用空间的方法,实例分析了php操作目录及文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php计算指定目录下文件占用空间的方法.分享给大家供大家参考.具体分析如下: php中可以通过 RecursiveDirectoryIterator 扩展 DirectoryIterator的getChildren() 方法提供访问子目录中的每一个元素的方法,下面的代码通过遍历访问目录下的所有文件,获取他们暂用的空间. ? 1 2 3

php计算指定目录下文件占用空间的方法_php技巧

本文实例讲述了php计算指定目录下文件占用空间的方法.分享给大家供大家参考.具体分析如下: php中可以通过 RecursiveDirectoryIterator 扩展 DirectoryIterator的getChildren() 方法提供访问子目录中的每一个元素的方法,下面的代码通过遍历访问目录下的所有文件,获取他们暂用的空间. <?php $dir = new RecursiveDirectoryIterator('C:\wamp'); $totalSize = 0; foreach (n

android开发-android 创建一个新项目时src目录下没有任何东西

问题描述 android 创建一个新项目时src目录下没有任何东西 用eclipse最新版本开发一个android程序,结果创建时src目录下没有任何东西(包),可以创建包,然后建class,但不能建一个Android Activity,以前还没有这个现象,但是我在Android Sdk Manager下载了很多Sdk版本后就这样了,很无奈,安卓开发菜鸟,求助各位大牛!

多目录下多文件 makefile编写

前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写:         在做项目时,一般文件都会分几个目录来存放:基本的是  include/  bin/ src/ obj/ lib/ tools/,这几个文件:我先说下我的文件存放目录,用ls -R可以查看到所有文件:./include/common.h    ./src/main.c    ./src/printStatus.c  就三个文件,其中*.c 文件都依赖于 *.h文件:      

单目录下多文件 makefile编写

 makefile很久就接触过了,但是一直没怎么深入的去学习和总结:在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有:知识在于沉淀,这句说的非常好,所以现在把自己理解的东西,记录下来,以便后面查阅:         这篇blog要分享的是在单目录下多文件的makefile编写,首先说明当前目录下有多少文件:fun.h   fun.c  main.c  makefile:其中*.c 文件都要依赖 *.h文件:         首先常规编译:         预处理期

虚拟机安装MS-DOS不可恢复性错误vcpu-0 在安装目录vmware.log文件中

问题描述 虚拟机安装MS-DOS不可恢复性错误vcpu-0 在安装目录vmware.log文件中 虚拟机安装MS-DOS boot设置从硬盘启动后出现,不可恢复性错误vcpu-0 在安装目录vmware.log文件中 解决方案 安装dos这种很旧很旧的系统,推荐用dosbox.不用vmware 解决方案二: 和vmware不同,vmware是虚拟机,你的cpu太新,那么运行dos就有问题了. dosbox是模拟器,它模拟一个386出来运行dos,没有兼容性问题(所以dosbox甚至可以让手机ar

Asp.net 4.0,首次请求目录下的文件时响应很慢

原文:Asp.net 4.0,首次请求目录下的文件时响应很慢 1. 问题起因2. 尝试过的处理思路3. 解决方法   1. 问题起因     一个从VS2003(.Net Framework 1.1)升级到.net framework 4.0的项目,每次编译或者部署到服务器上后,首次请求任何一个目录下的默认页面时,都要耗时3~5秒:而以前使用.net framework 1.1的时候,没有这个问题. 我在页面上开启Trace="true"来跟踪,发现页面的处理时间并不久(IIS重启,首