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

时间:2023-03-09 15:17:04
java线程池 多线程 搜索包含关键字的文件路径
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);
} }

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

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

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

原因:

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