文件内容检索工具

Java相关技术 - 文件内容检索工具

拿到一个几百M甚至上G的project让你去学习

有时候你会想知道某个关键词是在哪个文件里

比如:spring MVC配置的@RequestMapping,你从页面源知道了Action是 index/login.sftl

然后你想知道,这个@RequestMapping到底是配置在哪个Java类里,你怎么找到这个类呢

又比如,你想知道你当前看到的页面的源文件到底在项目的哪个路径下,你又要什么寻找

别告诉我,你会把项目里的文件一个个打开,直到找到你要的文件

如果每次都这么寻找你要的文件,那...

所以,下面的工具,应运而生了

直接上界面图 (博客界面宽度不够,图片被自动缩放了,可右键图片另存为桌面看,效果会好N多)

看看执行结果图

整个工具就一个类。如果想方便的使用,可以做成自解压文件(.exe),如下图

怎么制作自解压文件?

1.在桌面建一个文件夹: FileChecker

2.在FileChecker文件夹里再建一个文件夹:ace  (ace是FileChecker.java所在的package)

3.将FileChecker.java放进上面的文件夹ace里

4.cmd下编译上面的java文件

  比如我的:

    a. cd C:\Users\Administrator\Desktop\FileChecker\ace

    b. javac -sourcepath . -encoding utf-8 FileChecker.java  (成功后,ace里会生成多个.class文件)

    c. cd..  (返回上一级目录)

    d. java -classpath . ace.FileChecker  (执行class文件,看看效果)

    看到界面后,就可以往下走了

5. 制作自解压文件

  a. 写一个批处理文件,用来执行上面的class文件,很简单

    (1)在FileChecker目录下新建一个txt文件,然后改名为 start.bat

    (2)编辑方式打开start.bat

    (3)在里面写上 java -classpath . ace.FileChecker

    (4)保存

    (5)双击运行start.bat (看到界面就OK了)

    做到这一步,后面的也可以不用做了。可以把FileChecker整个文件夹移动到任何地方,然后在桌面创建start.bat的快捷方式,通过快捷方式运行即可

  b. 自解压文件的后续步骤

    这个相当简单,百度一下,分分钟搞定

代码:

package ace;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
import javax.swing.filechooser.FileSystemView;

/**
 * 文件内容检索工具
 *
 * @author liaolongjun 2015年5月30日 下午2:39:07
 */
final class FileChecker {

	private FileChecker() {
		init();
		initFm();
		initBtns();
		initTextFileds();
		initFileChooser();
		initCheckBoxPanel();
		initSeachLimitPanel();
		initFileSelectPanel();
		initOutputArea();
		initListener();
		add(checkBoxPanel, java, html, xml, jsp, js, css, isbreak, all);
		add(seachLimitPanel, checkBoxPanel, tfSearchContent);
		add(fileSelectPanel, btnSelect, tfFilePath, btnOK, btnClear, isAutoClear);
		add(fm, seachLimitPanel, fileSelectPanel, scrollPane);
		fm.setVisible(true);
		fm.validate();
	}

	private void init() {
		try {
			// 设置为当前操作系统的皮肤
			String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
			UIManager.setLookAndFeel(lookAndFeel);
		} catch (Exception e) {
			outputException(e);
		}
		// 读取历史记录
		URL url = FileChecker.class.getResource("history.properties");// 如果没有,则在当前class目录下创建
		historyFile = url == null ? new File(FileChecker.class.getResource("").getPath() + "/history.properties") : new File(url.getPath());
		props = new Properties();
		try {
			props.load(new FileInputStream(historyFile));
			filePath = props.getProperty(HISTORY_SEARCH_PATH);
			searchContent = props.getProperty(HISTORY_SEARCH_CONTENT);
		} catch (Exception e) {
			outputException(e);
		}
	}

	private void initFm() {
		fm = new JFrame("FILE CONTENT CHECKER . liaolongjun . ^(o o)^") {
			private static final long serialVersionUID = 1L;

			protected void processWindowEvent(WindowEvent e) {
				if (e.getID() == WindowEvent.WINDOW_CLOSING)
					saveHistory(); // 关闭窗口前,先保存上一次的查询记录
				super.processWindowEvent(e);
			}
		};
		fm.setLayout(null);
		fm.setSize(1000, 700);
		fm.setResizable(false);
		fm.setLocationRelativeTo(null);
		fm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		Random ran = new Random();
		// 每次打开时, 背景色都是随机的
		fm.getContentPane().setBackground(new Color(ran.nextInt(255), ran.nextInt(255), ran.nextInt(255)));
	}

	private void initOutputArea() {
		outputArea = new JTextArea();
		outputArea.setAutoscrolls(true);
		// JTextArea 要放在 JScrollPane 里才有滚动效果(同JTable)
		scrollPane = new JScrollPane(outputArea);
		scrollPane.setBounds(7, 100, 980, 565);
	}

	private void initFileSelectPanel() {
		fileSelectPanel = new JPanel();
		fileSelectPanel.setBounds(7, 55, 980, 40);
		fileSelectPanel.setBackground(Color.white);
	}

	private void initSeachLimitPanel() {
		seachLimitPanel = new JPanel();
		seachLimitPanel.setBounds(7, 5, 980, 45);
		seachLimitPanel.setBackground(Color.white);
	}

	/**
	 * 文件类型过滤(.suffix)
	 */
	private void initCheckBoxPanel() {
		java = new JCheckBox("java", true);
		html = new JCheckBox("html", true);
		xml = new JCheckBox("xml");
		jsp = new JCheckBox("jsp", true);
		js = new JCheckBox("js");
		css = new JCheckBox("css");
		isbreak = new JCheckBox("isbreak", true); // 匹配到一个后是否跳出当前文件
		isAutoClear = new JCheckBox("AUTOCLEAR", true); // 自动清除
		all = new JCheckBox("all");// 全选
		checkBoxPanel = new JPanel();
		suffixs = new ArrayList<JCheckBox>();
		fillSuffixs(java, html, xml, jsp, js, css);
	}

	private void fillSuffixs(JCheckBox... cbs) {
		for (JCheckBox cb : cbs)
			suffixs.add(cb);
	}

	private void initTextFileds() {
		// 文件路径
		tfFilePath = new JTextField(filePath);
		tfFilePath.setPreferredSize(new Dimension(560, 30));
		// 搜索内容
		tfSearchContent = new JTextField(searchContent);
		tfSearchContent.setPreferredSize(new Dimension(540, 30));
	}

	private void initFileChooser() {
		// 文件选择器设置桌面默认路径
		fc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
		// 设置只能选择文件夹
		fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
	}

	private void initBtns() {
		btnSelect = new MyBtn("OPEN.....");
		btnOK = new MyBtn("OK");
		btnClear = new MyBtn("CLEAR");
	}

	private void initListener() {
		btnSelect.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (fc.showOpenDialog(fm) == JFileChooser.APPROVE_OPTION)
					tfFilePath.setText(fc.getSelectedFile().toString());
			}
		});
		btnOK.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 点确定后,重置查询限制条件
				resetLimitation();
				if (filePath == null || filePath.trim().length() == 0)
					JOptionPane.showMessageDialog(fm, "未指定路径");
				else if (searchContent == null || searchContent.trim().length() == 0)
					JOptionPane.showMessageDialog(fm, "未指定查询内容");
				else
					check(new File(filePath));
			}
		});
		btnClear.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				outputArea.setText("");
			}
		});
		all.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				setAllSelected(all.isSelected(), suffixs);
			}
		});
	}

	/**
	 * 重置查询的限制条件
	 */
	private void resetLimitation() {
		exts = getExts();
		isBreak = isbreak.isSelected();
		filePath = tfFilePath.getText();
		searchContent = tfSearchContent.getText();
	}

	/**
	 * 获取要限制查找范围的文件后缀名(文件扩展名)
	 */
	private List<String> getExts() {
		List<String> exts = new ArrayList<String>();
		for (JCheckBox cb : suffixs)
			if (cb.isSelected())
				exts.add(cb.getText());
		return exts.size() > 0 ? exts : null; // 如果没有文件限制,返回null
	}

	/**
	 * 是否全选
	 */
	private void setAllSelected(boolean boo, List<JCheckBox> cbs) {
		for (JCheckBox cb : cbs)
			cb.setSelected(boo);
		isbreak.setSelected(boo); // isbreak不在suffixs里, 所以在这里单独设置上
	}

	/**
	 * 添加组件
	 */
	private void add(Container parent, JComponent... components) {
		for (JComponent c : components)
			parent.add(c);
	}

	/**
	 * 保存查询痕迹
	 */
	private void saveHistory() {
		try {
			props.setProperty(HISTORY_SEARCH_PATH, filePath == null ? "" : filePath);
			props.setProperty(HISTORY_SEARCH_CONTENT, searchContent == null ? "" : searchContent);
			props.store(new FileOutputStream(historyFile), "--no comment--");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 打印异常信息
	 */
	private void outputException(Exception e) {
		outputArea.append(e + "\n");
		for (StackTraceElement s : e.getStackTrace())
			outputArea.append("	" + s + "\n");
	}

	/**
	 * 检索的文件数目
	 */
	private int numFiles;
	/**
	 * 满足查询条件的数目
	 */
	private int numResults;

	private void check(final File file) {
		if (isAutoClear.isSelected())
			btnClear.doClick();
		outputArea.append("文件检索中......\n\n");
		numFiles = 0;
		numResults = 0;
		new Timer().schedule(new TimerTask() {
			public void run() {
				try {
					if (exts == null)
						check1(file);
					else
						check2(file);
					outputArea.append("\n*\n* 执行结束,一共检索了 " + numFiles + " 个文件。   符合条件:" + numResults + "\n*\n");
					outputArea.append("\nHISTORY:" + historyFile + "\n\n");
				} catch (Exception e) {
					outputException(e);
				}
				JScrollBar jscrollBar = scrollPane.getVerticalScrollBar();
				jscrollBar.setValue(jscrollBar.getMaximum());
			}
		}, 50);
	}

	/**
	 * 没有文件类型限制
	 */
	private void check1(File file) throws IOException {
		File[] files = file.listFiles();
		for (File f : files)
			if (f.isFile())
				read(f);
			else
				check1(f);
	}

	/**
	 * 有文件类型限制
	 */
	private void check2(File file) throws IOException {
		File[] files = file.listFiles();
		for (File f : files)
			if (f.isFile()) {
				String ext = getExt(f);
				if (ext != null && exts.contains(ext))
					read(f);
			} else
				check2(f);
	}

	/**
	 * 获取文件后缀(文件扩展名)
	 */
	private String getExt(File file) {
		String fileName = file.getName();
		return fileName.lastIndexOf(".") == -1 ? null : fileName.substring(fileName.lastIndexOf(".") + 1);
	}

	private void read(File file) throws IOException {
		numFiles++;
		FileReader fr = new FileReader(file);
		BufferedReader br = new BufferedReader(fr);
		String str;
		int rowNum = 0; // 行号
		if (isBreak)
			while ((str = br.readLine()) != null) {
				rowNum++;
				if (str.indexOf(searchContent) != -1) {
					numResults++;
					outputArea.append(file.toString() + "\n" + "	行号: " + rowNum + "	" + str + "\n");
					break;
				}
			}
		else {
			StringBuilder sb = new StringBuilder(file.toString() + "\n");
			boolean flag = false;
			while ((str = br.readLine()) != null) {
				rowNum++;
				if (str.indexOf(searchContent) != -1) {
					flag = true;
					sb.append("	行号: " + rowNum + "	" + str + "\n");
				}
			}
			if (flag) {
				numResults++;
				outputArea.append(sb.toString());
			}
		}
		br.close();
	}

	/**
	 * 订制规格一致的按钮
	 */
	private class MyBtn extends JButton {
		private static final long serialVersionUID = 1L;

		public MyBtn(String btnName) {
			super(btnName);
			setPreferredSize(new Dimension(100, 30));
		}
	}

	/**
	 * 保存上一次查询痕迹的文件
	 */
	private File historyFile;
	private Properties props;
	private String filePath;
	private String searchContent;
	private final String HISTORY_SEARCH_PATH = "historySearchPath";
	private final String HISTORY_SEARCH_CONTENT = "historySearchContent";
	private List<JCheckBox> suffixs;
	private List<String> exts;
	private boolean isBreak;

	/**
	 * JFileChooser 文件选择组件
	 */
	private JFileChooser fc;
	/**
	 * 文件类型
	 */
	private JCheckBox java, html, xml, jsp, js, css, isbreak, all, isAutoClear;
	/**
	 * 内容输出区域
	 */
	private JTextArea outputArea;
	private JScrollPane scrollPane;
	private JFrame fm;
	private JButton btnSelect, btnOK, btnClear;
	private JTextField tfSearchContent, tfFilePath;
	private JPanel checkBoxPanel, seachLimitPanel, fileSelectPanel;

	public static void main(String[] args) {
		new FileChecker();
	}
}

补充一句:运行时,会在ace文件夹里生成一个history.properties文件,用于保存最后一次的检索痕迹。下次运行的时候,会自动显示你上次查询的痕迹(不是查询的结果)

打完,收工!

时间: 2024-09-29 00:18:03

文件内容检索工具的相关文章

UltraCompare文件内容比较工具

http://www.52pojie.cn/thread-541895-1-1.html 云盘里有<ignore_js_op> <ignore_js_op> UltraCompare是一款文件内容比较工具.著名的ultraedit公司出品的,可进行文本模式,文件夹模式以及二进制模式的比较,并且可以对比较的文件进行合并,同步等操作,支持撤消操作.拥有书签与收藏夹功能,可以设置过滤,是一款比较出色的文件比较程序.你可以用它来比较两个文本文件的不同,也可以比较以二进制的模式比较两个EXE

Finder(文件内容搜索工具)

搜索文件夹内容的小工具 Github 两种搜索模式的算法: BoyerMooreSearch.cs using System.Threading; using System.Collections.Generic; using System.Linq; namespace Finder.Algorithms { /// <summary> /// An implemention of Boyer-Moore algorithm. /// <para/>author : Ornith

三天不念口生,三天不写手生,Linux基本命令Find,grep妙用文件文件内容检索(查找)好帮手

Find,grep 可以轻松实现对指定文件和目录的查找,查看,删除,***内容的清理等等--虽然不及sed\awk\功能强大和复杂,但其方便易用结合其它命令还是可以为我们提供强大的实用功能 1. 查找文件创建如下结构文件和文件夹,使用find查找my5.txt find ./ -name my5.txt #查找文件 创建如下结构文件文件夹,使用FIND查找分别查找t文件夹和t.txt文件find ./ -type d -name t #查找文件夹(d类型为目录)find ./ -type f -

linux下grep文件内容搜索工具及基本正则表达式详解

grep命令: 根据模式(文本字符和基本正则表达式的元字符组合而成之匹配条件)搜索文本, 并将符合模式的文本行显示出来. 格式:grep [选项] 匹配条件 文本名称 选项:  -i:  忽略大小写 -v: 显示没有被模式匹配到的行 -o:只显示被模式匹配到的字符串 --color: 搜索出来文件高亮度显示 -A: 匹配指定行的下几行 -B: 匹配指定行的上几行 -C: 匹配指定行的上下几行 -E: 扩展正则表达式 相当于egrep 正则表达式:Regular Expression, 简称REG

linux下egrep文件内容搜索工具及扩展正则表达式详解

egrep命令: 根据模式(文本字符和扩展正则表达式的元字符组合而成之匹配条件)搜索文本, 并将符合模式的文本行显示出来. 格式:egrep [选项] 匹配条件 文本名称 egrep 等于 grep -E 选项:  -i:  忽略大小写 -v: 显示没有被模式匹配到的行 -o:只显示被模式匹配到的字符串 --color: 搜索出来文件高亮度显示 -A: 匹配指定行的下几行 -B: 匹配指定行的上几行 -C: 匹配指定行的上下几行 正则表达式:Regular Expression, 简称REGEX

Linux 查看文件内容的命令

观看档案内容 : cat, tac, more, less, head, tail, nl, 刚刚我们提到的都只是在于显示档案的外观,或者是移动与复制一个档案或目录而已,那么如果我们要视察一个档案的内容时,该如何是好呢?!这里有相当多有趣的指令可以来分享一下:最常使用的显示档案内容的指令可以说是 cat 与 more 及 less 了 !此外,如果我们要查看一个很大型的档案(好几百MB 时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个指令也可以达

Linux基本命令——统计和检索文件内容

在工作中,除了查看文件内容以外,有时还需要对文件内容进行统计和查找符合条件的内容,下面介绍统计和检索的两个命令工具. 1,wc 命令 2,grep 命令 一,wc 命令 wc命令用于统计文件中包含的行数.单词数.字节数等信息,使用文件名作为参数,可同时统计多个文件. 命令格式:wc 选项 文件路径 选项: -c : 统计文件内容中的字节数 -l: 统计文件内容的行数 -w: 统计文件内容的单词个数 使用命令:wc  /etc/inittab         //等同于加了-clw三个参数,统计e

文件与文档内容搜索工具软件

文件与文档内容搜索工具软件: 1.  Mythicsoft   https://mythicsoft.com/welcome 2.  Everything      - 电脑内文件搜索 3.文档大师又名"针式PKM"是一款功能强大.老牌的个人文档管理系统.   http://www.pinpkm.com/

用C#Winform写个简单的批量清空文件内容和删除文件的小工具

用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013创建一个项目并添加到Github的教程,请参考(http://www.admin10000.com/document/4004.html).简单来说,就是先用VS创建项目:然后在Github网站上创建一个Respo(本项目的代码托管项目),记下(https://*.git)那个地址:最后用"提交&q