package org.jimmy.searchfile20180807.main;

public class ThreadMain implements Runnable{

    private int taskNum;
private String searchDirPath;
private String keyWords; public ThreadMain(int taskNum, String searchDirPath, String keyWords){
this.taskNum = taskNum;
this.searchDirPath = searchDirPath;
this.keyWords = keyWords;
} @Override
public void run() {
System.out.println("正在执行task " + taskNum);
System.out.println("当前关键字:" + keyWords);
SearchMain searchMain = new SearchMain(searchDirPath, keyWords);
searchMain.search();
System.out.println("task " + taskNum + "执行完毕");
} }
package org.jimmy.searchfile20180807.main;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; public class SearchMain { private String searchDirPath;
private String keyWords; public SearchMain(String searchDirPath, String keyWords){
this.searchDirPath = searchDirPath;
this.keyWords = keyWords;
} //计算文件数量
public static int count = 0; public static FileOutputStream fos = null; /**
* Author: Yuxin.Yang(Jimmy)
* Time: 2018年8月7日 上午9:02:45
* Detail: 查询包含关键字的文件的路径
*/
public void search(){
File file = new File(searchDirPath);
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, "utf-8"));
}
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();
}
} }
package org.jimmy.searchfile20180807.ui;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities; import org.jimmy.searchfile20180807.main.SearchMain;
import org.jimmy.searchfile20180807.main.ThreadMain; public class SearchUi { public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SearchUi searchUi = new SearchUi();
searchUi.init();
}
}); } public void init(){
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("搜索文件路径");
Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
frame.setBounds(0, 0, (int) dimension.getWidth(), (int) dimension.getHeight());
frame.setLayout(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); int scrollPaneWidth = (int) dimension.getWidth() - 15;
int scrollPaneHeight = (int) dimension.getHeight() - 35;
JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBounds(0, 0, (int) dimension.getWidth(), (int) dimension.getHeight());
//添加滚动条
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setBounds(0, 0, scrollPaneWidth, scrollPaneHeight);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
frame.add(scrollPane); //初始坐标
int x = 0;
int y = 0; //加上输入要搜索的文件夹路径的提示文本
int height = 30;
JLabel searchDirPathLabel = new JLabel("请输入要搜索的文件夹的路径:");
searchDirPathLabel.setBounds(x, y, scrollPaneWidth, height);
searchDirPathLabel.setHorizontalAlignment(JLabel.CENTER);
panel.add(searchDirPathLabel); //加上输入要搜索的文件夹路径的文本框
y += height + 20;
height = 100;
final JTextArea searchDirPathText = new JTextArea();
searchDirPathText.setBounds(x, y, scrollPaneWidth, height);
panel.add(searchDirPathText); //加上输入路径的文本框的提示文本
y += height + 20;
height = 30;
JLabel searchedFilePathLabel = new JLabel("请输入生成的搜索结果文件的路径:");
searchedFilePathLabel.setBounds(x, y, scrollPaneWidth, height);
searchedFilePathLabel.setHorizontalAlignment(JLabel.CENTER);
panel.add(searchedFilePathLabel); //加上输入路径的文本框
y += height + 20;
height = 100;
final JTextArea searchedFilePathText = new JTextArea();
searchedFilePathText.setBounds(x, y, scrollPaneWidth, height);
panel.add(searchedFilePathText); //加上输入关键字的文本框的提示文本
y += height + 20;
height = 30;
JLabel keyWordsLabel = new JLabel("请输入需要搜索的关键字(如果有多个,用英文半角逗号隔开):");
keyWordsLabel.setBounds(x, y, scrollPaneWidth, height);
keyWordsLabel.setHorizontalAlignment(JLabel.CENTER);
panel.add(keyWordsLabel); //加上输入关键字的文本框
y += height + 20;
height = 100;
final JTextArea keyWordsText = new JTextArea();
keyWordsText.setBounds(x, y, scrollPaneWidth, height);
panel.add(keyWordsText); //加上搜索按钮
y += height + 20;
height = 30;
int searchBtnWidth = 100;
JButton searchBtn = new JButton("搜索");
searchBtn.setBounds((scrollPaneWidth - searchBtnWidth) / 2, y, searchBtnWidth, height);
searchBtn.setHorizontalAlignment(JButton.CENTER);
searchBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String searchDirPath = searchDirPathText.getText().replaceAll(" ", "");
String searchedFilePath = searchedFilePathText.getText().replaceAll(" ", "");
File searchedFile = new File(searchedFilePath);
FileOutputStream fos = null;
try{
fos = new FileOutputStream(searchedFile);
if(!searchedFile.exists()){
searchedFile.createNewFile();
}
SearchMain.fos = fos;
}catch(Exception ex){
ex.printStackTrace();
}
String keyWordsStr = keyWordsText.getText();
String[] keyWordsArr = null;
if(keyWordsStr.indexOf(",") > 0){
keyWordsArr = keyWordsStr.split(",");
}else{
keyWordsArr = new String[]{ keyWordsStr };
}
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];
ThreadMain threadMain = new ThreadMain(i, searchDirPath, keyWords);
executor.execute(threadMain);
}
if(executor.isTerminated() && SearchMain.fos != null){
try {
SearchMain.fos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
});
panel.add(searchBtn); //需要手动设置宽度高度(鼠标操作)
//frame.pack();
frame.setVisible(true);
} }

这次改了一个很关键的参数.

之前这里没加编码格式,结果用中文搜索在MyEclipse中可以搜索出来,打成jar包或exe之后搜索不出来.

原因:

因为MyEclipse我设置了默认的编码格式是utf-8.

java线程池 多线程 搜索包含关键字的文件路径的更多相关文章

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

    文件读取和操作类 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; publi ...

  2. Ubuntu 查找文件夹中内容包含关键字的文件,路径为当前文件夹

    From CSDN http://blog.csdn.net/lizhenmingdirk/article/details/44834997 grep -rl "keyword" ...

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

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

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

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

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

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

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

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

  7. Java线程池的几种实现 及 常见问题讲解

    工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能 ...

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

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

  9. Java线程与多线程教程

    本文由 ImportNew - liken 翻译自 Journaldev.   Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...

随机推荐

  1. Linux 系统管理命令 - iotop - 动态显示磁盘 I/O 统计信息

    命令详解 重要星级: ★★★★☆ 功能说明: iotop 命令是一款实时监控磁盘 I/O 的工具, 但必须以 root 用户的身份运行.使用 iotop 命令可以很方便的查看每个进程使用磁盘 I/O ...

  2. java面试(上)

    http://blog.csdn.net/jackfrued/article/details/44921941 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是 ...

  3. bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin【线段树+最大费用最大流】

    --因为T点忘记还要+n所以选小了所以WA了一次 注意!题目中所给的时间是一边闭一边开的区间,所以读进来之后先l++(或者r--也行) 线段树优化建图,很神.(我记得还有个主席树优化建树的?)首先考虑 ...

  4. 【数据结构】27、红黑树,节点插入,修复平衡操作总结(针对jdk8中hashmap冲突过多链表转红黑树)

    二叉树节点插入 0.如果只有一个节点,那么就直接作为根,涂黑,如果父为黑,或者祖父为空,那么不做操作 1.叔叔节点不为空且为红 那么就修改父,叔叔,祖父节点颜色,最后把当前节点设置为祖父节点,在进行平 ...

  5. 设置mysql 定时备份任务

    1 修改配置文件  /etc/my.conf (为了命令 mysqldump能省略输入密码执行,mysql5.5 之后已经不建议控制台直接输入密码的方式) 增加如下配置 [client]host=lo ...

  6. Linux基本命令—mkfs/mount/umount/wget/yes/make/passwd

    mkfs:用来在特定的分区建立Linux文件系统,是make filesystem的缩写. 例子:mkfs .ext3 /dev/mmcblk0p1      //把该设备格式化成ext3文件系统 m ...

  7. java使用正则表达式对注册页面进行验证

    package regex; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Patt ...

  8. [转]F# Samples 101 - Visual Studio 2010

    http://code.msdn.microsoft.com/F-Samples-101-0576cb9f/sourcecode?fileId=18956&pathId=1045958806 ...

  9. 微信小程序button授权页面,用户拒绝后仍可再次授权

    微信小程序授权页面,进入小程序如果没授权跳转到授权页面,授权后跳转到首页,如果用户点拒绝下次进入小程序还是能跳转到授权页面,授权页面如下 app.js  中的 onLaunch或onShow中加如下代 ...

  10. Thinkphp删除缓存

    控制器代码   public function delcache(){ //当找到有Runtime的文件夹时,进入if if(is_dir(RUNTIME_PATH)){ delDir(RUNTIME ...