文件搜索器的实现(二)
来源:互联网 发布:js 弹出对话框 编辑:程序博客网 时间:2024/06/16 12:21
上一篇中,关于文件搜索器的实现过程中,用到的是递归的算法,即每一次搜索的过程中,就要遍历整个指定的路径,毫无疑问,这样搜索的效率会很低。那么,能不能第一次遍历的时候把遍历到的所有文件都保存在一起,然后进行查找的时候几乎是可以直接获取的方式,这样实现的效率会大大的提高,机会可以做到要把输入的关键字一输入进去,就可以搜索到想要的结果。
而这里我们所说的保存在一起,就是保存在一个map中,然后存储在一个文件中。
这里有四个类:主方法类mainFrame,搜索工具类SearchTool,以及FileProcessThread和ImageDialog,最后一个主要是能够使搜索到的后缀为gif和jpg的文件能够打开。
注意,这里实现的文件搜索器不仅能够搜索到所需要文件的具体路径,还可以根据具体的路径打开文件。
package com.sg.FileSearch2;import java.awt.Color;import java.awt.Font;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.io.File;import java.io.IOException;import java.util.Map;import java.util.regex.Pattern;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPopupMenu;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.text.BadLocationException;public class mainFrame extends JFrame{ boolean flag=true; private JTextField jtf; String str; private int Cflag=1;Map<String, File> allFile; public static void main(String[]args){ mainFrame mf=new mainFrame(); mf.ShowUI();}private void ShowUI() {this.setTitle("检索一下");this.setSize(695,880);this.setLocationRelativeTo(null); this.setResizable(false); setLayout(null); jtf=new JTextField(); //jtf.setForeground(Color.lightGray);//jtf.setFont(new Font("宋体",0,22));//jtf.stText("\t\t请输入检索关键字,回车发起检索"); JTextArea jta=new JTextArea();JScrollPane js=new JScrollPane(jta); JLabel jl=new JLabel("相关检索结果:"); JLabel j2=new JLabel("选定目录:");jtf.setBounds(5,10, 680, 40);jl.setBounds(5, 52, 680, 30);j2.setBounds(5, 70, 680, 30);jta.setBounds(5, 96, 680,720);js.setBounds(5, 96, 680,720);JPopupMenu pp1=new JPopupMenu();JPopupMenu pp2=new JPopupMenu();JMenuItem jm11=new JMenuItem("浏览");JMenuItem jm12=new JMenuItem("打开");JMenuItem jm21=new JMenuItem("浏览");JMenuItem jm22=new JMenuItem("打开文件夹");JMenuItem jm23=new JMenuItem("自定义打开(gif,jpg)");JMenuBar jmb = new JMenuBar();JMenu jmu1=new JMenu("盘符");JMenu jmu2=new JMenu("关于");JMenuItem jm31=new JMenuItem("C盘");JMenuItem jm32=new JMenuItem("D盘");JMenuItem jm41=new JMenuItem("版本");pp1.add(jm11);pp1.add(jm12);jta.add(pp1);pp2.add(jm21);pp2.add(jm22);pp2.add(jm23);jta.add(pp2);jmu1.add(jm31);jmu1.add(jm32); jmu2.add(jm41); //jtf.setFont(f);TextColor(Color.RED); //jtf.setText("请输入文件的关键字");this.add(jtf);this.add(jl);this.add(j2);this.add(js);jmb.add(jmu1);jmb.add(jmu2);setJMenuBar(jmb);this.setVisible(true);ActionListener openDir2 = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String command = e.getActionCommand(); if("C盘".equals(command)) { Cflag=1; System.out.println("点击了C盘");} else if("D盘".equals(command)) { Cflag=2; System.out.println("点击了d盘");} else if("版本".equals(command)) JOptionPane.showMessageDialog(jm41, "该检索器为版本一"); if(Cflag==1){System.out.println("准备启动C盘");if(allFile!=null) allFile.clear();SearchTool.loadOrCreateIndex("cindex","C:/");}else {System.out.println("准备启动d盘");if(allFile!=null) allFile.clear();SearchTool.loadOrCreateIndex("cindex2","D:/");}}};jm31.addActionListener(openDir2);jm32.addActionListener(openDir2);jm41.addActionListener(openDir2);SearchTool.loadOrCreateIndex("cindex2","D:/");//添加键盘监听jtf.addKeyListener(new KeyListener(){ @Overridepublic void keyReleased(KeyEvent e){ if(e.getKeyCode()==10) { int count=0; String text = jtf.getText(); if(text.trim().equals("")) { jta.setText(""); return; } jta.setText("");Pattern p = Pattern.compile(text); allFile = SearchTool.allFile; for (String fileName : allFile.keySet()) {if(p.matcher(fileName).find()){ count++; jta.append(allFile.get(fileName).getAbsolutePath());jta.append("\r\n");}} jl.setText("检索到"+count+"结果如下:"); } } @Overridepublic void keyTyped(KeyEvent e) { } @Overridepublic void keyPressed(KeyEvent e) { // if(flag)// { // jtf.setText("");// flag=false;// } } });jta.addMouseListener(new MouseAdapter(){ @Overridepublic void mouseClicked(MouseEvent e) { jta.setSelectedTextColor(Color.red);try {Rectangle rec = jta.modelToView(jta.getCaretPosition());//获取行数int line=rec.y / rec.height + 1;int selectionStart = jta.getLineStartOffset(line-1);int selectionEnd = jta.getLineEndOffset(line-1);System.out.println(rec.y / rec.height + 1);System.out.println(selectionStart+"---->"+selectionEnd); str=jta.getText(selectionStart,selectionEnd-selectionStart); System.out.print(str); // String str1="D:/学习资料/大二下学期/汇编/小资料/debug调试方法.txt1111111111111111111111111"; j2.setText("选定目录:"+str); // System.out.println(str1); str = str.replaceAll("\r\n", "");// str = str.replaceAll("\n", ""); //str=str.replace(" ", ""); System.out.println(str); System.out.println(str.toLowerCase().endsWith(".txt")); if (str.toLowerCase().endsWith(".txt") ||str.endsWith(".gif") || str.endsWith(".jpg")|| str.endsWith(".xml") ||str.endsWith(".png")){ System.out.println("1111111111111111"); pp2.show(jta, e.getX(), e.getY()); } else {System.out.println("2222222222222222");pp1.show(jta, e.getX(), e.getY());}} catch (BadLocationException e1) { e1.printStackTrace();} } }); ActionListener openDir = new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String command = e.getActionCommand();try {if ("打开文件夹".equals(command)) {Runtime.getRuntime().exec("cmd /c start " + new File(str).getParent());} else if ("浏览".equals(command)) { Runtime.getRuntime().exec(new String[]{"cmd.exe","/C",str});} else{ System.out.println("12358745412544444444444444");if (str.endsWith(".gif") ||str.endsWith(".jpg")) {ImageDialog id = new ImageDialog(str);id.showUI();}}} catch (IOException e1) {e1.printStackTrace();}}};jm11.addActionListener(openDir);jm12.addActionListener(openDir);jm21.addActionListener(openDir);jm22.addActionListener(openDir);jm23.addActionListener(openDir); } }
public class SearchTool {static Map<String,File> allFile = new HashMap<String, File>();static List<Thread> ts = new ArrayList<Thread>();private static void createIndex(String filePath) {// 创建C: fileFile root = new File(filePath);// 列举下面所有文件File[] listFiles = root.listFiles();// 循环for (File file : listFiles) {// 如果是文件if (file.isFile()) {allFile.put(file.getName(), file);} else {// 如果是文件夹,创建线程处理FileProcessThread tpt = new FileProcessThread(file);ts.add(tpt);tpt.start();}}}public static void loadOrCreateIndex(String indexPath,String filePath) {File indexFile = new File(indexPath);if (indexFile.exists()) {loadIndex(indexPath);} else {createIndex(filePath);saveIndex(indexPath);}}private static void saveIndex(String path) {// TODO Auto-generated method stubnew Thread() {public void run() {ii: while (true) {for (Thread t : SearchTool.ts) {System.out.println(t.getState());if (t.getState() != Thread.State.TERMINATED) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}continue ii;}}break;}try {File f = new File(path);if (!f.exists()) {f.createNewFile();}FileOutputStream fos = new FileOutputStream(f);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(SearchTool.allFile);oos.flush();oos.close();fos.close();} catch (IOException e) {e.printStackTrace();}};}.start();}private static void loadIndex(String path) {// TODO Auto-generated method stubtry {FileInputStream fis = new FileInputStream(path);ObjectInputStream ois = new ObjectInputStream(fis);SearchTool.allFile.putAll((Map<String, File>) ois.readObject());System.out.println(SearchTool.allFile.size());ois.close();fis.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
package com.sg.FileSearch2;import java.io.File;public class FileProcessThread extends Thread {File file;public FileProcessThread(File file) {// TODO Auto-generated constructor stubthis.file = file;getFile(file);}public void getFile(File f){File[] listFiles = f.listFiles();if(listFiles!=null&& listFiles.length>0 )for (File ff : listFiles) {if(f.isFile()){System.out.println(f.getAbsolutePath());SearchTool.allFile.put(f.getName(), f);}elsegetFile(ff);}<pre name="code" class="html">package com.sg.FileSearch2;import java.awt.Graphics;import java.awt.Image;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.ImageIcon;import javax.swing.JDialog;public class ImageDialog extends JDialog implements Runnable {private String path;private Image image;int width;int height;public ImageDialog(String path) {System.out.println("1234567899987654321");setModal(true);this.path = path;ImageIcon imageIcon = new ImageIcon(path); width = imageIcon.getIconWidth();height = imageIcon.getIconHeight();System.out.println(height + "," + width);setSize(width, height);image = imageIcon.getImage();setLocationRelativeTo(null);setUndecorated(true);addListener();new Thread(this).start();}private void addListener() {this.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {ImageDialog.this.dispose();}});}@Overridepublic void paint(Graphics g) {super.paint(g);g.drawImage(image, 0, 0, width, height,null);}public void showUI() {setVisible(true);}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {repaint();try {Thread.currentThread().sleep(40);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} }
}}
0 0
- 文件搜索器的实现(二)
- 文件搜索器的实现(一)
- 简单文件搜索器的实现
- 实现自己的音乐搜索软件(二)
- Windows Practice_文件搜索器(二)_多线程调试
- linux(二)文件搜索命令
- 简易的文件搜索器(通过关键字搜索)
- 一个搜索文件的APP(2)-搜索功能的实现
- 智能音乐搜索功能实现(二)
- shell实现文件的搜索详解
- 二分搜索(折半搜索)的实现
- java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除
- JAVA实现文件搜索
- 实现磁盘搜索文件
- 简单的文件搜索器
- 那些年,我玩过的Linux命令(二)—— 文件搜索相关
- Linux_文件搜索命令二
- php实现按文件名搜索文件的远程文件查找器
- “‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件”解决过程
- getElementsByClassName兼容性处理
- JAVA之Swing设计
- JHTP小结_第十章_面向对象编程-多态(Polymorphism)
- 4.docker学习笔记:创建自己的registry
- 文件搜索器的实现(二)
- 在linux中添加ftp用户,并设置相应的权限
- WINCE互斥的实现
- scrollTop兼容性处理
- 设计模式——抽象工厂
- 深入理解React中的上下文this
- hdu5411 CRB and Puzzle(矩阵)
- eclispe基础配置
- iOS Core Graphics封装虚线