编写文件搜索器——痛并快乐着
文件搜索器的大部分代码是我在火车上编写出来的,正值中秋,从长沙到桂林坐火车需要十个小时,虽然车上有点拥挤,不过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;
}
}
效果图:
我们可以看到,在这个界面里,我们有两个按钮,我们可以分别给他们加上监听器,也可以分别加上监听器,根据个人习惯来定,这里我使用前者。
浏览按钮的监视器:
文件: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()))
大功告成,整个程序就完善很多了
编写这个程序对于初学者来说应该也不是难事,就算写不出来也很容易看得懂,下一步各位可以继续去自己的文件搜索器,比如,在搜索过程中可以随时暂停,实现增删改操作,完善查的操作,实现暂停的方法和暂停线程的方法是一样的,这里就不做过多解释了,谢谢大家的学习,我们后会有期。
相关推荐
本源码包"ASP.NET源码——[电子商务]快乐商城全站源码.zip"包含了一个完整的电子商务网站项目,名为"电子商务]快乐商城全站源码_happyshop",这是一个典型的ASP.NET MVC(Model-View-Controller)架构的应用。...
Listary是一款高效文件搜索与应用启动工具,其官方网站为[Listary – File Search & App Launcher](Listary – File Search & App Launcher)。与Windows自带的搜索功能相比,Listary的搜索速度极快,几乎可以瞬间...
在这里,“asp”标签表明了该工具是使用ASP语言编写的,这意味着它将在支持ASP的Web服务器上运行,如IIS。 【压缩包子文件的文件名称列表】:由于给出的列表只有一个数字"132684291493340380",它不太可能是实际的...
在本章节中,我们将深入探讨“实战突击:vc项目开发案例整合 第二章——快乐五子棋”的核心知识点。快乐五子棋是一个基于Microsoft Visual C++(简称VC++)开发的桌面游戏,它实现了基本的五子棋规则,提供了一个...
标题“2012春节祝福网页”提示我们这是一个与传统中国农历新年——春节相关的网络页面,主要用于传递节日的祝福。2012年的春节是中国农历的壬辰龙年,象征着龙的精神和力量。这样的网页可能包含动画、音乐、贺词、...
标题"基于Java的实例源码-程序代码编辑器 jEdit.zip"表明我们关注的是一个使用Java编程语言开发的源代码实例,具体来说是一个代码编辑器——jEdit。jEdit是一个功能丰富的、跨平台的文本编辑器,专为程序员设计,...
3. JavaScript:编写游戏逻辑,包括事件处理、计时器、碰撞检测、得分系统等。 4. 使用Canvas或SVG进行图形绘制:HTML5提供了Canvas元素用于动态画布,或者使用SVG进行矢量图形的绘制,创建游戏场景和角色。 5. ...
9. **Android游戏开发**:课程中的"Android游戏开发实践——快乐数独"部分可能涵盖了游戏逻辑设计、图形渲染、物理引擎以及游戏状态管理等内容。这需要开发者具备一定的图形编程和算法基础。 10. **地图与位置服务*...
3. **内置对象**:ASP有五个内置对象——Request、Response、Session、Application和Server,它们分别用于处理客户端请求、发送响应、管理会话状态、共享应用程序范围内的数据以及执行服务器端方法。 4. **数据访问*...
【压缩包子文件的文件名称】"CMS程序]EnjooSite CMS&BLOG 快乐建站 v2009_enjoosite2009" 提供了具体的产品名称——EnjooSite CMS&BLOG,以及版本号v2009。这表明这是一个名为“快乐建站”的产品,由Enjoo开发,专注...
- **文件管理**:文件搜索、复制、移动等。 - **磁盘管理**:磁盘分区、格式化等。 - **输入法管理**:安装、删除、切换输入法。 - **系统工具使用**:如系统配置、程序管理等。 #### 5.3 文字处理 - **Word基本...