awt简易的文件搜索器

代维的同事排查问题,可能会遇到从成百上千个压缩日志文件(gz格式)中搜索XXX字符串等,

在linux环境,应该可以用管道命令find ./ -name ‘*.gz‘ |xargx grep ‘xxx‘搞定,不过本人更喜欢在window环境下,自己想办法搞定。

于是就自己动手写了这个简易的搜索器(其实对awt和swing都不太熟悉,慢慢研究来的)。

先上个截图,大致的样子就是这样:

搜索某个字符的操作是这样的:

闲话不说了,说说关键代码:

1.需要一个frame,作为顶级窗口显示,所有的东西,都是包括在这个frame中

	public void launchFindFrame(){

		frame = new Frame("检索字符串");
		frame.setSize(520, 360);
		frame.setLocation(screenSize.width/3, screenSize.height/3);
		frame.addWindowListener(new WindowAdapter(){
			@Override
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		frame.setLayout(new BorderLayout());
		initMenu();
		initLayout();
		initBar();
		frame.setVisible(true);
	}

2.需要定义一些button、menu、label等等

        Toolkit tk = Toolkit.getDefaultToolkit();
	Dimension screenSize = tk.getScreenSize();//获取物理屏幕的大小,以便计算弹出frame可以居中

	Frame frame = null;

	MenuBar mb = new MenuBar();//菜单栏
	Menu m1 = new Menu("File");
	Menu m2 = new Menu("Help");
	MenuItem mi1 = new MenuItem("选择");//菜单下拉项
	MenuItem mi2 = new MenuItem("退出");
	MenuItem mi3 = new MenuItem("关于帮助");

	//文本提示区、按钮
	Label lbl1 = new Label("搜索路径:");
	Label lbl2 = new Label("搜索内容:");
	Label lblPath = new Label("空");
	TextField tf = new TextField(20);
	Button btn = new Button("搜索");
	Button expBtn = new Button("导出搜索结果");
	TextArea ta = new TextArea();
	Panel innerp = new Panel(new FlowLayout(FlowLayout.LEFT));

	//用于大框架布局的3个panel
	Panel p1 = new Panel(new BorderLayout());
	Panel p2 = new Panel(new FlowLayout(FlowLayout.LEFT));
	Panel p3 = new Panel(new BorderLayout());
	//进度条相关显示
	JProgressBar progressbar = new JProgressBar();
	Label barLbl = new Label("玩命搜索中",Label.CENTER);
	Button breakBtn = new Button("停止搜索");

	Thread findFileExecThread = null;//搜索文件算法类的线程引用
	FindFileExecutor ffe = null;     //搜索文件算法类

3.给各个按钮加上事件监听

                //菜单按钮,选择文件事件监听
		mi1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser fc = new JFileChooser();
				fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);//既可以是文件也可以是文件夹
				int intRetVal = fc.showOpenDialog(frame);
				if (intRetVal == JFileChooser.APPROVE_OPTION) {
					lblPath.setSize(screenSize.width, lblPath.getHeight());
					lblPath.setText(fc.getSelectedFile().getPath());
				}
			}
		});
		mi3.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "有任何问题请联系[email protected]", "友情提醒",JOptionPane.PLAIN_MESSAGE);
			}
		});
                //搜索按钮的事情监听
		btn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				if(lblPath.getText() == null || "".equals(lblPath.getText()) || "空".equals(lblPath.getText())){
					JOptionPane.showMessageDialog(null, "搜索路径不能为空!", "提示",JOptionPane.WARNING_MESSAGE);
				} else if(tf.getText() == null || "".equals(tf.getText())){
					JOptionPane.showMessageDialog(null, "搜索内容不能为空!", "提示",JOptionPane.WARNING_MESSAGE);
				} else {
					initFindAction();
	 				final Dialog d = new Dialog(frame);
					d.setResizable(false);
					d.setModal(true);
					d.setTitle("进度提示");
					d.setBackground(Color.LIGHT_GRAY);
					d.setLayout(new BorderLayout());
					Panel np = new Panel();
					//终止搜索按钮的事情监听,用flag标识让搜索文件的逻辑自动退出,而不是强制interrupt线程,当然你也强制interrupt不了
					breakBtn.addActionListener(new ActionListener(){
						public void actionPerformed(ActionEvent e) {
							if(findFileExecThread != null && findFileExecThread.isAlive()){
								ffe.setFlag(true);
							}
							d.setVisible(false);
							d.dispose();
						}
					});
					np.add(breakBtn);
					d.add(np,BorderLayout.NORTH);
					d.add(barLbl,BorderLayout.CENTER);
					d.add(progressbar,BorderLayout.SOUTH);
					d.addWindowListener(new WindowAdapter(){
						@Override
						public void windowClosing(WindowEvent e) {
							d.setVisible(false);
							d.dispose();
						}
					});
					d.setBounds(frame.getX()+100, frame.getY()+100,280,120);//设定使其出现位置

					//执行搜索算法
					ffe = new FindFileExecutor(lblPath.getText(),tf.getText(),progressbar,ta);
					findFileExecThread = new Thread(ffe);
					findFileExecThread.start();

					d.setVisible(true);
				}
			}
		});
                //导出搜索结果按钮事件
		expBtn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				if(ta.getText() != null && !"".equals(ta.getText())){
					SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd_HHmmss");
		            String name = dateformat.format(new Date()) + ".txt";
					JFileChooser chooser = new JFileChooser();
		            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
		            chooser.setDialogType(JFileChooser.SAVE_DIALOG);
		            chooser.setDialogTitle("导出搜索结果");
		            chooser.setSelectedFile(new File(name));
		            //过滤只显示和保存txt文件
		            chooser.addChoosableFileFilter(new FileFilter(){
		                public boolean accept(File f) {
		                    if (f.getName().endsWith("txt") || f.isDirectory()) {
		                         return true;
		                    }else{
		                        return false;
		                    }
		                }
		                public String getDescription() {
		                    return "文本文件(*.txt)";
		                }
		            });
		            int intRetVal = chooser.showSaveDialog(frame);
					if (intRetVal == JFileChooser.APPROVE_OPTION) {
						if(new File(chooser.getSelectedFile().getPath()).exists()){
							int confirmRetVal = JOptionPane.showConfirmDialog(null, "文件已经存在,是否要覆盖该文件?", "确认",JOptionPane.WARNING_MESSAGE);
							if(JOptionPane.YES_NO_OPTION != confirmRetVal){
								return;
							}
						}
						//导出
						BufferedWriter bw = null;
						try {
							bw = new BufferedWriter(new FileWriter(new File(chooser.getSelectedFile().getPath())));
							String[] textAreaLines = ta.getText().trim().split("\r\n");
							for(String line : textAreaLines){
								bw.write(line);
								bw.newLine();
							}
						} catch (IOException e1) {
							e1.printStackTrace();
						} finally {
							if(bw != null){
								try {
									bw.close();
								} catch (IOException e2) {
									e2.printStackTrace();
								}
							}
						}
						int openRetVal = JOptionPane.showConfirmDialog(null, "导出数据成功,要打开该文件吗?", "确认",JOptionPane.WARNING_MESSAGE);
						if(openRetVal == JOptionPane.YES_NO_OPTION){
							Desktop d = Desktop.getDesktop();//since jdk1.6 调用系统默认的打开文件功能
							try {
								d.open(new File(chooser.getSelectedFile().getPath()));
							} catch (IOException e1) {
								e1.printStackTrace();
							}
						}
					}
				} else {
					JOptionPane.showMessageDialog(null, "无搜索结果!", "提示",JOptionPane.WARNING_MESSAGE);
				}
			}
		});

4.进度条的初始化

	//初始化进度条的事件监听
	public void initBar(){
		progressbar.setOrientation(JProgressBar.HORIZONTAL);
		progressbar.setMinimum(0);
		progressbar.setMaximum(100);
		progressbar.setValue(0);
		progressbar.setStringPainted(true);
		progressbar.addChangeListener(new ChangeListener(){
			/**
			 * 每次progressbar.setValue()时,如果value值改变,则触发此监听方法
			 */
			public void stateChanged(ChangeEvent e) {
				int value = progressbar.getValue();
				if (e.getSource() == progressbar) {
					barLbl.setText("已完成搜索:" + ffe.getCurrentIndex() + "个文件,共发现"+ffe.getMatchCount()+"处匹配记录");
					barLbl.setForeground(Color.blue);
				}
				if(value == progressbar.getMaximum()){
					barLbl.setText("终于撸完了,从"+ffe.getTotalOfFiles()+"个文件中撸到"+ffe.getMatchCount()+"个匹配记录!");
					breakBtn.setLabel("关闭");
				}
			}
		});
		progressbar.setPreferredSize(new Dimension(300, 20));
		progressbar.setBorderPainted(true);
		progressbar.setBackground(Color.pink);
	}

5.搜索文件算法(这个省略,地球人都知道)

代码完成后,用j2ewiz.exe工具把jar包装成exe文件,双击运行。

最后成样:

末尾附上源代码、包装工具以及成品的链接:

http://download.csdn.net/detail/wangchsh2008/8733305

点击下载

本文仅限交流学习使用,写得很简陋,请见谅!

时间: 2024-10-08 02:30:49

awt简易的文件搜索器的相关文章

安卓第十七天笔记--简易版本音乐播放器

title:简易版本音乐播放器 简易版本音乐播放器 1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="

Atitit.文件搜索工具&#160;attilax&#160;总结

Atitit.文件搜索工具 attilax 总结 1. 指定目录按照体积大小精确搜索1 1.1. File Seeker 4.5 版本的可以,3.5版本的不行..1 2. 按照文件内容搜索1 2.1. File Seeker2 2.2. Notepad++2 2.3. FileLocator Pro 是一款专业的文件搜索软件,2 2.4. 百度硬盘搜索3 3. 在的3 1. 指定目录按照体积大小精确搜索 1.1. File Seeker 4.5 版本的可以,3.5版本的不行.. 2. 按照文件内

javap -- Java 类文件解析器

参考文档 http://blog.chinaunix.net/uid-692788-id-2681132.html http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/javap.html 功能说明:Java 类文件解析器. 语法:javap [ 命令选项 ] class. . . 补充说明: javap 命令用于解析类文件.其输出取决于所用的选项.若没有使用选项,javap 将输出传递给它的类的 public 域及方法.ja

文件管理器和文件对接器

文件管理器 NSFileManager 1 #pragma mark - 文件管理器 创建文件夹 2 3 // 创建对象 4 NSFileManager *manager = [NSFileManager defaultManager]; 5 6 // 创建路径 7 NSString *path = NSHomeDirectory(); 8 path = [path stringByAppendingPathComponent:@"test/myApp"]; 9 NSLog(@&quo

iOS之文件管理器和文件对接器

文件管理器: 1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 // Do any additional setup after loading the view, typically from a nib. 12 13

63.文件系统进行数据建模以及文件搜索

主要知识点: 对类似文件系统这种的有多层级关系的数据进行建模 对上述模型数据进行搜索 一.文件系统数据构造 1.新建index,并自定义analyzer 新建一个index,自定义一个名为paths的analyzer,这个analyzer所用的分词器是path_hierarchy.语法: PUT /fs { "settings": { "analysis": { "analyzer": { "paths": { "t

小蚂蚁学习Linux(4)——链接命令ln、文件搜索命令locate、whereis和which

链接命令ln    (取自link之意) ln  [源文件]    [目标文件]    功能:生成链接文件.    -s 创建软连接 ,不加是创建硬链接 硬链接的特征: 1. 拥有相同的i节点和存储block快,可以看做是同一个文件. 2. 可通过i节点识别 3. 不能跨分区 4. 不能针对目录使用 备注:硬链接只要不把所有文件名删除,删除其中一个不影响其他文件名的使用. 需要注意的是,不建议只用硬链接: 1. 硬链接太过隐蔽,只能通过查看inode节点id号识别 2. 自身的限制也比较多. 替

怎么移动dwg文件查看器中的图形位置

一张图纸中包括图形和文字,图形可以让读者更加容易理解,而文字则是起到了一个解释性的作用.在电脑中打开CAD图纸,需要用到dwg文件查看器,制作过CAD的朋友们都知道CAD文件的格式是dwg格式.图纸中的图形有的时候不在适合位置,就需要把他移动到一个合适的位置上,那么,如何移动呢,来看看具体的操作方法. 如果想要将CAD图形对象移动到指定位置,那么只需要使用迅捷CAD编辑器就可以对CAD图形对象进行移动操作,这是一款专业的CAD编辑软件,软件不仅可以用来浏览和查看DWG.DXF等CAD文件格式,还

文件搜索者--find命令详解

1. 文件查找: 在linux系统中由于文件的众多,往往需要在众多的文件当中查找某一个文件,如果时间一长,很难记得文件存放至何处,不过,这一点,你不比担心,因为开发人员为我们提供了强大的文件搜索工具,下面将介绍两款常用的文件查找工具locate,和find,这两款查找工具只能是从文件系统中查找不能在内存当中查找,因为内存是没有文件系统的. 2. locate命令: locate命令是基于数据库来查找文件的,命令查找速度快,一般查找跟新慢的,名字变化少的,如:配置文件,可以用locate查找,因为