编写文件搜索器——痛并快乐着

文件搜索器的大部分代码是我在火车上编写出来的,正值中秋,从长沙到桂林坐火车需要十个小时,虽然车上有点拥挤,不过java这种魔法真的可以让人忘乎所以,写代码的激情仍然没有被火车嘈杂拥挤的环境浇灭,而且在火车上遇到一个前辈,相谈甚欢,实在觉得自己当时选择软件工程这个专业是多么正确的选择。

文件搜索器是一个相对简单的程序,不过如果把他做得精美也是需要下功夫的。实现文件搜索不难,但如果要实现时间和空间上的最优,对于初学者来说却不能说是一件容易的事了,做成文件搜索器之后,加上增,删,改的功能就可以算是一个功能比较完善的文件管理器了,不过在PC上使用文件管理器的情况还是比较少的,在如果把它移植在安卓上,就很圆满了。

好了,说了这么多废话,现在进入正题——编写文件搜索器。

编写任何程序都可以从编写界面开始,就算不美观,也可以让我们的思路变得清晰。

下面是界面代码:

文件:

Frame.java
package demo;
 
import java.awt.BorderLayout;
import java.awt.Dimension;
 
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class Frame extends JFrame{
 
   /** 
    * 
    */
   private static final long serialVersionUID = 1L;
   public void initGUI(){
      this.setTitle("TRY and Catch登录界面");
      this.setSize(new Dimension(800,450));
      this.setDefaultCloseOperation(3);
      this.setLocationRelativeTo(null);//设置窗体显示在屏幕的中央
      this.setResizable(false);//设置禁止调整窗体的大小
      this.setUndecorated(false);
      JPanel northJPanel = new JPanel();
      JPanel centerJPanel = new JPanel();
      JTextArea jTextArea = new JTextArea(30,20);
      //jTextArea.setPreferredSize(new Dimension(600, 350));
      centerJPanel.add(jTextArea);
      JScrollPane jScrollPane = new JScrollPane(jTextArea);
      centerJPanel.add(jScrollPane);
      jScrollPane.setPreferredSize(new Dimension(700,350));
      northJPanel = this.northpanel(jScrollPane,jTextArea);
      this.add(northJPanel,BorderLayout.NORTH);
      this.add(centerJPanel,BorderLayout.CENTER);
      this.setVisible(true);
   }
   public JPanel northpanel(JScrollPane jScrollPane,JTextArea jTextArea){
      JPanel northJPanel = new JPanel();
      JLabel jLabelkeyword = new JLabel("关键字:");
      JTextField jTextFieldkeyword = new JTextField();
      jTextFieldkeyword.setPreferredSize(new Dimension(190,25));
      JLabel jLabeladdress = new JLabel("搜索范围:");
        JComboBox jComboBoxaddress = new JComboBox();
        jComboBoxaddress.setPreferredSize(new Dimension(190, 25));
        jComboBoxaddress.addItem("E:\\");
        jComboBoxaddress.addItem("C:\\");
        jComboBoxaddress.addItem("F:\\");
        jComboBoxaddress.addItem("D:\\");
        JButton jButtonbrowse = new JButton("浏览");
        JButton jButton = new JButton("搜索");
        northJPanel.add(jLabelkeyword);
        northJPanel.add(jTextFieldkeyword);
        northJPanel.add(jLabeladdress);
        northJPanel.add(jComboBoxaddress);
        northJPanel.add(jButtonbrowse);
        northJPanel.add(jButton);
        System.out.println("print:"+jComboBoxaddress.getSelectedItem());
        Search search = new Search(jTextArea,jTextFieldkeyword,jComboBoxaddress);
        BrowseListener browseListener = new BrowseListener(jTextFieldkeyword,jTextArea,jComboBoxaddress);
      jButton.addActionListener(search);
      jButtonbrowse.addActionListener(browseListener);
        return northJPanel;
   }
}

效果图:

 

 

apk 文本搜索 Android_文件搜索


 

我们可以看到,在这个界面里,我们有两个按钮,我们可以分别给他们加上监听器,也可以分别加上监听器,根据个人习惯来定,这里我使用前者。

浏览按钮的监视器:

文件:

BrowseListener.java
package demo;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JComboBox;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class BrowseListener implements ActionListener{
   private JTextField jTextField;
   private JTextArea jTextArea;
   private String path;
   
   public BrowseListener(JTextField jTextField,JTextArea jTextArea,JComboBox jComboBoxaddress){
      this.jTextField = jTextField;
      this.jTextArea = jTextArea;
      this.path = (String) jComboBoxaddress.getItemAt(0); 
   }
   @Override
   public void actionPerformed(ActionEvent e) {
      // TODO Auto-generated method stub
      LoadFile loadFile = new LoadFile();
      path=loadFile.Load();
      System.out.println("BrowseListener---->path:"+path);
      SearchThread searchThread = new SearchThread(jTextArea, jTextField, path);
      searchThread.start();
   }
    public String getPath(){
      return path;
    } 
}

搜索按钮监视器:

文件:

Search.java
package demo;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JComboBox;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
publicclass Search implements ActionListener{
 
   private JTextField jTextField;
   private JTextArea jTextArea;
   private String path;
   public Search(JTextArea jTextArea,JTextField jTextField,JComboBox jComboBoxaddress) {
     // TODO Auto-generated constructor stub
   this.jTextArea = jTextArea;
   this.jTextField = jTextField;
   this.path = (String) jComboBoxaddress.getItemAt(0);
   }
   @Override
   publicvoid actionPerformed(ActionEvent e) {
     // TODO Auto-generated method stub
   SearchThread searchThread = new SearchThread(jTextArea,jTextField,path);
   searchThread.start();
   }
 
}

要实现自定义目录,就需要用到一个叫做文件选择器的类

这里,我们新建一个类,来实例化文件选择器,达到实现文件选择的目的:

文件:

loadFile.java
package demo;
 
import java.io.File;
import javax.swing.JFileChooser;
public class LoadFile {
 
   public LoadFile(){
      
   }
   public String Load(){
      String string="";
      try{
        JFileChooser jFileChooser = new JFileChooser("F:\\覃翔宇\\软件工程");//
        jFileChooser.setFileSelectionMode(2);
        jFileChooser.setDialogTitle("读取文件");//
        int result = jFileChooser.showOpenDialog(jFileChooser);
        if(result==jFileChooser.showOpenDialog(jFileChooser)){
           File file = jFileChooser.getSelectedFile();
           string = file.getPath();
        }
         }catch (Exception e) {
   // TODO: handle exception
        }
      return string; 
   }
}

最后就是编写文件搜索的关键代码了:首先我们要知道文件搜索需要什么样的参数,第一个是搜索路径(或者称为搜索范围),第二个是关键字,第三个是我们将搜索结果打印在哪里,搜索路径,和关键字我们都可以传参传入,一般都不会忘记,一定要记得将面板中的JTextarea传入,才能将搜索结果显示在主界面的文本框中,在这里我们还没有使用关键字搜索,只实现了将目录下所有文件显示出来的操作,如果要实现文件搜索只需要加上一个if判断语句就大功告成了,下面是源代码:

package demo;
import java.io.File;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
publicclass SearchThread extends Thread{
 
   private JTextArea jTextArea;
   private JTextField jTextField;
   private String path;
   public SearchThread(JTextArea jTextArea,JTextField jTextField,String path) {
     // TODO Auto-generated constructor stub
     this.jTextArea = jTextArea;
     this.jTextField = jTextField;
     this.path = path;
   }
 
   publicvoid run(){
     this.listRood(path);
   }
   
   publicvoid listRood(String path){
     File file2 = new File(path);
     System.out.println("SearchThread---->path:"+path);
     File[] listFiles = file2.listFiles();
   //File []list = new File();
     for(File file : listFiles){
         this.countFile(file);
     }
   }
   privateint countFile(File file){
     int count = 0;
     File [] array = file.listFiles();
     if(array == null||array.length == 0){
        return count;
     }
     //循环判断
     for(File f:array){
        if(f.isFile()){
           jTextArea.append("--->"+f.getAbsolutePath()+"\n");
          
           System.out.println("--->"+f.getAbsolutePath()+"\n");
          count++;
        }
        if(f.isDirectory()){
          count += countFile(f);
        }
     }
      jTextArea.append("***************************************************"+"\n");
     return count;
   }
   //IO操作
}

如果想要实现文件的迷糊搜索功能,需要在这个类中添加一个模糊搜索的方法,当file中包含了特定字符串的时候就将其输出:

publicboolean checkString(String name){
     String compareString="";
     int beginIndex=0;
     while (beginIndex<name.length()) {
        System.out.println("name长度:"+name.length());
        System.out.println("关键字长度:"+keyword.length());
        System.out.println("搜索位置:"+beginIndex);
        if(name.length()-beginIndex>=keyword.length()){
        compareString = name.substring(beginIndex, beginIndex+keyword.length());
        }
        System.out.println("compareString的结果是:"+compareString+beginIndex);
        System.out.println("需要搜索的关键字是"+keyword);
        if(keyword.equals(compareString)){
          returntrue;
        }
        beginIndex = beginIndex+keyword.length()-1;
     }
     returnfalse;
     
   }

再在输出文件地址之前用一个if进行判断:

if(this.checkString(f.getName()))

大功告成,整个程序就完善很多了

编写这个程序对于初学者来说应该也不是难事,就算写不出来也很容易看得懂,下一步各位可以继续去自己的文件搜索器,比如,在搜索过程中可以随时暂停,实现增删改操作,完善查的操作,实现暂停的方法和暂停线程的方法是一样的,这里就不做过多解释了,谢谢大家的学习,我们后会有期。