Java文件查找小程序

功能:

在选择的目录中查找对应的文件名,类似于windows的查找功能。

程序:

package com.test.frame;

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FilenameFilter;
import java.util.regex.Pattern;

import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;

public class FileSearch extends JFrame {
    private static final long serialVersionUID = -497231270990815830L;
    /**
     * 常用的后缀名数组
     */
    private static final String[] SUFFIX = new String[] { ".txt", ".doc",
            ".gif", ".jpg", ".bp3", ".ppt", ".zip" };
    private static final String[] NULL_DATA = new String[] {};
    private JTextField txt_Dir;
    private JTextField txt_Search;
    private JComboBox cbox_End;
    private JButton btn_Dir;
    private JButton btn_Search;
    private JList jList;

    public FileSearch() {
        setTitle("\u5728\u6307\u5B9A\u8303\u56F4\u5185\u641C\u7D22\u6587\u4EF6");

        JPanel panel = new JPanel();
        getContentPane().add(panel, BorderLayout.CENTER);
        GridBagLayout gbl_panel = new GridBagLayout();
        gbl_panel.columnWidths = new int[] { 0, 0, 0, 0, 0, 0 };
        gbl_panel.rowHeights = new int[] { 0, 0, 0, 0 };
        gbl_panel.columnWeights = new double[] { 0.0, 0.5, 0.0, 0.5, 0.0,
                Double.MIN_VALUE };
        gbl_panel.rowWeights = new double[] { 0.0, 0.0, 1.0, Double.MIN_VALUE };
        panel.setLayout(gbl_panel);

        JLabel lbl_Dir = new JLabel("\u6587\u4EF6\u5730\u5740\uFF1A");
        GridBagConstraints gbc_lbl_Dir = new GridBagConstraints();
        gbc_lbl_Dir.anchor = GridBagConstraints.EAST;
        gbc_lbl_Dir.insets = new Insets(10, 10, 5, 5);
        gbc_lbl_Dir.gridx = 0;
        gbc_lbl_Dir.gridy = 0;
        panel.add(lbl_Dir, gbc_lbl_Dir);

        txt_Dir = new JTextField();
        GridBagConstraints gbc_txt_Dir = new GridBagConstraints();
        gbc_txt_Dir.insets = new Insets(10, 0, 5, 5);
        gbc_txt_Dir.fill = GridBagConstraints.HORIZONTAL;
        gbc_txt_Dir.gridx = 1;
        gbc_txt_Dir.gridy = 0;
        gbc_txt_Dir.gridwidth = 3;
        panel.add(txt_Dir, gbc_txt_Dir);
        txt_Dir.setColumns(10);

        btn_Dir = new JButton("\u9009\u62E9\u5730\u5740");
        GridBagConstraints gbc_btn_Dir = new GridBagConstraints();
        gbc_btn_Dir.insets = new Insets(10, 0, 5, 5);
        gbc_btn_Dir.gridx = 4;
        gbc_btn_Dir.gridy = 0;
        panel.add(btn_Dir, gbc_btn_Dir);

        JLabel lbl_Search = new JLabel("\u6587\u4EF6\u540D\uFF1A");
        GridBagConstraints gbc_lbl_Search = new GridBagConstraints();
        gbc_lbl_Search.anchor = GridBagConstraints.EAST;
        gbc_lbl_Search.insets = new Insets(5, 10, 5, 5);
        gbc_lbl_Search.gridx = 0;
        gbc_lbl_Search.gridy = 1;
        panel.add(lbl_Search, gbc_lbl_Search);

        txt_Search = new JTextField();
        GridBagConstraints gbc_txt_Search = new GridBagConstraints();
        gbc_txt_Search.insets = new Insets(5, 0, 5, 5);
        gbc_txt_Search.fill = GridBagConstraints.HORIZONTAL;
        gbc_txt_Search.gridx = 1;
        gbc_txt_Search.gridy = 1;
        panel.add(txt_Search, gbc_txt_Search);
        txt_Search.setColumns(10);

        JLabel lbl_End = new JLabel("\u540E\u7F00\uFF1A");
        GridBagConstraints gbc_lbl_End = new GridBagConstraints();
        gbc_lbl_End.anchor = GridBagConstraints.EAST;
        gbc_lbl_End.insets = new Insets(5, 5, 5, 5);
        gbc_lbl_End.gridx = 2;
        gbc_lbl_End.gridy = 1;
        panel.add(lbl_End, gbc_lbl_End);

        cbox_End = new JComboBox();
        GridBagConstraints gbc_cbox_End = new GridBagConstraints();
        gbc_cbox_End.insets = new Insets(5, 0, 5, 5);
        gbc_cbox_End.fill = GridBagConstraints.HORIZONTAL;
        gbc_cbox_End.gridx = 3;
        gbc_cbox_End.gridy = 1;
        panel.add(cbox_End, gbc_cbox_End);
        cbox_End.setModel(new DefaultComboBoxModel(SUFFIX));

        btn_Search = new JButton("\u641C\u7D22");
        GridBagConstraints gbc_btn_Search = new GridBagConstraints();
        gbc_btn_Search.fill = GridBagConstraints.HORIZONTAL;
        gbc_btn_Search.anchor = GridBagConstraints.EAST;
        gbc_btn_Search.insets = new Insets(5, 0, 5, 5);
        gbc_btn_Search.gridx = 4;
        gbc_btn_Search.gridy = 1;
        panel.add(btn_Search, gbc_btn_Search);

        JScrollPane scrollPane = new JScrollPane();
        GridBagConstraints gbc_scrollPane = new GridBagConstraints();
        gbc_scrollPane.insets = new Insets(10, 10, 10, 10);
        gbc_scrollPane.fill = GridBagConstraints.BOTH;
        gbc_scrollPane.gridwidth = 5;
        gbc_scrollPane.gridx = 0;
        gbc_scrollPane.gridy = 2;
        panel.add(scrollPane, gbc_scrollPane);

        jList = new JList(new DefaultListModel());
        jList.setBorder(new TitledBorder(null, "\u641C\u7D22\u7ED3\u679C",
                TitledBorder.LEADING, TitledBorder.TOP, null, null));
        scrollPane.setViewportView(jList);
        btn_Dir.addActionListener(btnHandler);
        btn_Search.addActionListener(btnHandler);
    }

    private ActionListener btnHandler = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == btn_Dir) {
                String strDir = txt_Dir.getText();
                // 弹出文件选择器,只能选择目录
                JFileChooser fileChooser = new JFileChooser(strDir);
                fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                int mode = fileChooser.showOpenDialog(null);
                if (mode == JFileChooser.APPROVE_OPTION) {
                    File file = fileChooser.getSelectedFile();
                    if (file != null) {
                        txt_Dir.setText(file.getPath());
                    }
                }
            } else if (e.getSource() == btn_Search) {
                // 执行查找工作
                doSearch();
            }
        }
    };

    /**
     * 执行查找,并更新列表
     */
    protected void doSearch() {
        // TODO Auto-generated method stub
        String strDir = txt_Dir.getText();
        if (strDir == null || strDir.equals("")) {
            JOptionPane.showMessageDialog(null, "文件地址为空,请选择文件地址!");
            return;
        }
        File fileDir = new File(strDir);
        if (!fileDir.exists()) {
            JOptionPane.showMessageDialog(null, "文件地址无效,请重新选择文件地址!");
            return;
        }
        String searchName = txt_Search.getText();
        if (searchName == null || searchName.equals("")) {
            JOptionPane.showMessageDialog(null, "文件名为空,请输入文件名!");
            return;
        }
        String suffix = cbox_End.getSelectedItem().toString();
        String[] resultNames = getRightFileNames(fileDir, searchName, suffix);
        if (resultNames != null) {
            jList.setListData(resultNames);
        } else {
            jList.setListData(NULL_DATA);
        }
    }

    /**
     * 根据传入的文件名和后缀在指定的目录下搜索符合条件的文件名
     * 
     * @param fileDir
     * @param searchName
     * @param suffix2
     * @return
     */
    private String[] getRightFileNames(File fileDir, String searchName,
            final String suffix2) {
        // TODO Auto-generated method stub
        String[] fileNames = fileDir.list(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                return name.endsWith(suffix2);
            }

        });
        if (fileNames == null || fileNames.length == 0) {
            JOptionPane.showMessageDialog(null, "文件地址中不存在该类型文件!");
            return null;
        }
        if (searchName.equals("*")) {
            // 处理只有一个*号的文件,直接返回即可
            return fileNames;
        } else if (searchName.equals("?")) {
            // 处理只有一个?号的文件,返回文件名长度为1的文件
            return lengthOne(fileDir, suffix2);
        } else if (searchName.contains("*") || searchName.contains("?")) {
            // 需要根据正则来进行匹配
            searchName = searchName.replaceAll("\\*", "\\.+");
            searchName = searchName.replaceAll("\\?", "\\.");
            return regexNameResult(fileDir, suffix2, searchName);
        } else {
            return fullNameResult(fileDir, suffix2, searchName);
        }
    }

    /**
     * 正则匹配
     * 
     * @param fileDir
     * @param suffix2
     * @param searchName
     * @return
     */
    private String[] regexNameResult(File fileDir, final String suffix2,
            final String searchName) {
        // TODO Auto-generated method stub
        final Pattern pattern = Pattern.compile(searchName + suffix2);
        String[] fileNames = fileDir.list(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                return name.endsWith(suffix2)
                        && pattern.matcher(name).matches();
            }

        });
        return fileNames;
    }

    /**
     * 全匹配
     * 
     * @param fileDir
     * @param suffix2
     * @param searchName
     * @return
     */
    private String[] fullNameResult(File fileDir, final String suffix2,
            final String searchName) {
        // TODO Auto-generated method stub
        String[] fileNames = fileDir.list(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                return name.endsWith(suffix2)
                        && name.equals(searchName + suffix2);
            }

        });
        return fileNames;
    }

    /**
     * 返回文件名长度为1的值
     * 
     * @param fileDir
     * @param suffix2
     * @return
     */
    private String[] lengthOne(File fileDir, final String suffix2) {
        // TODO Auto-generated method stub

        String[] fileNames = fileDir.list(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                return name.endsWith(suffix2)
                        && name.length() == 1 + suffix2.length();
            }

        });
        return fileNames;
    }

    public static void main(String[] args) {
        final FileSearch fileSearch = new FileSearch();
        fileSearch.setSize(500, 500);
        fileSearch.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fileSearch.setLocationRelativeTo(null);
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                fileSearch.setVisible(true);
            }
        });
    }

}

运行界面:

这里写图片描述

使用说明:

  点击选择地址按钮,选择查找的目录文件夹;
  
  输入要查找的文件名后点击搜索按钮,支持和?匹配,代表多个字符,?代表1个字符;
  
  搜索结果在下方的列表中列出,没有结果显示为空。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前天正好要一个本地文件, 就用java实现了, 全盘的本地文件搜索功能. 代码不依赖其它第三方jar, 连日志都用system.out了. 初学者可以了解下. 主程序: LocalFileSearcher.java LocalFileSearcher searcher = new LocalFileSearcher(); searcher.doSearch("迅雷"); log如下: Start search keyword: 迅雷 Start search all drivers! success: E:\迅雷下载 success: F:\迅雷下载 success: C:\Users\Administrator\Desktop\迅雷.lnk success: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\迅雷软件 success: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷 success: C:\Users\All Users\Microsoft\Windows\Start Menu\Programs\迅雷软件 success: C:\Users\Administrator\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\迅雷.lnk success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Libraries\迅雷下载.library-ms success: C:\ProgramData\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷\迅雷影音.lnk success: C:\Users\All Users\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷 success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\迅雷软件 success: C:\Users\All Users\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷\迅雷影音.lnk success: C:\Users\Administrator\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\StartMenu\迅雷.lnk success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷 success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷\卸载迅雷.lnk success: C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\迅雷软件\迅雷\迅雷.lnk Search costs : 3861(ms) File searched : 154848 Folder searched: 31463 Success match : 16 后续再更新完善
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值