这是本人以前学习java时做的一个文件搜索的东东,一方面对File进行一些了解,另一方面对递归一些了解。。。先上图
一,首先对文件进行一些介绍(可以跳过,直接看后面的代码)
File f=new File("路径");
常用方法
f.creatNewFile();//创造一个新的空文件
f.delete()//删除掉
f.getName();//得到名字
f.getAbsoultPath();//得到完全路径
f.isDirector();//判断是不是目录
f.idFile();//判断是不是文件
f.length();//返回长度
f.list();/返回一个字符串数组,返回此此目录下目录和文件
f.listFiles();//返回一个字符串数组,返回此此目录下的文件
f.listRoots();/列出可用的文件系统根
f.toSring();/返回此路径名的字符串
f.mkdir();/创建一级目录
f.mkdirs();//创建多级目录;
文件写入读写的两个基础大类
输入流 FileInputStream 包含的方法
FileInputStream fi=new FileInputStream(File file);//获取文件file上的输入流
in.available();//返回file中可读取的字节byte数
in.read();//读取文件,以byte为单位
in.close();//关闭输入
然后可以用各种流包装,
如:BufferedInputStream
可以 BufferedInputStream(in);
将其封装 这样可以加快读取数据
或者 DataInputStream。可以读取其他非byte数据类型
FileOutputStream和上面差不多
一,首先还是从界面说起
一个主界面JFrame 几个JRidobutton 下面一个是JScrollPane的显示结果的框
- public void UI(){
- //设置界面
- this.setTitle("FileSearch");
- this.setSize(400,400);
- this.setLocation(400,100);
- this.setLayout(new FlowLayout(FlowLayout.LEFT));
- this.setDefaultCloseOperation(3);
- //文件输入框
- jt=new JTextField(10);
- jt.setPreferredSize(new Dimension(126,30));
- this.add(jt);
- //搜索按钮
- jb=new JButton("search");
- jb.addActionListener(this);
- this.add(jb);
- //标签1
- JLabel j2=new JLabel("文件格式");
- this.add(j2);
- //第二个文本框
- jt1=new JTextField(5);
- jt1.setPreferredSize(new Dimension(22,30));
- jt1.setFont(new Font("黑体",Font.BOLD,14));
- this.add(jt1);
- //标签2
- JLabel j1=new JLabel("请选择搜索范围");
- this.add(j1);
- //添加按钮
- this.creatButton();
- //添加滑动框
- this.creatText();
- //设置窗口大小不能改变
- this.setResizable(false);
- //设置窗体可见
- this.setVisible(true);
creatButton();是创造按钮函数。
- //创建按钮的方法
- public void creatButton(){
- bu=new ButtonGroup();
- //有多少磁盘就创建多少按钮
- File[] f=File.listRoots();
- for(int i=0;i<f.length;i++){
- JRadioButton j=new JRadioButton();
- j.addActionListener(this);
- JLabel jl=new JLabel(f[i].getPath());
- j.setActionCommand(f[i].getPath());
- bu.add(j);
- this.add(jl);
- this.add(j);
- }
File[] f=File.listRoots();是获取你的电脑所有的磁盘
creatText()是
- public void creatText(){
- //创造JTextArea
- jte=new JTextArea(15,30);
- jte.setLineWrap(true);
- //创造JScrollPane
- JScrollPane jd=new JScrollPane(jte);
- jte.setLayout(new GridLayout(1,1));
- this.add(jd);
- }
创造下面那个显示搜索结果的东东
/**********************************************************************************************************************************/
下面就是,添加监听,与事件触发后的方法的介绍。
- }
- //监听事件的方法
- public void actionPerformed(ActionEvent e) {
- //列出磁盘
- f1=File.listRoots();
- //如果按下search按钮调用的方法
- if(e.getActionCommand().equals("search")){
- //全盘搜索
- //判断是否输入内容
- if(jt.getText().equals("")){
- JOptionPane.showMessageDialog(this,"请输入搜索内容");
- }//判断是否选择搜索范围
- else if(bu.getSelection()==null){
- JOptionPane.showMessageDialog(this,"请选择搜索范围");
- }
- else if(bu.getSelection().getActionCommand().equals("ALL")){
- System.out.println("全盘搜索");
- for(int j=0;j<f1.length;j++){
- String st=f1[j].getPath();
- System.out.print(st);
- SearchThread ss=new SearchThread(this,st);
- ss.start();
- }
- }//搜索指定的盘
- else {
- SearchThread ss=new SearchThread(this,bu.getSelection().getActionCommand());
- ss.start();
- }}
- }
其中的搜索用线程处理,但是又得防止线程过多,会崩溃
- public class SearchThread extends Thread{
- public Jm j;
- public String s;
- public SearchThread(Jm j,String s){
- this.j=j;
- this.s=s;
- }
- public void run(){
- //System.out.println("-------->>>"+s);
- j.searchFile(s);
- //System.out.println("已经搜索完"+s);
- }
- }
searchFile()
- public void searchFile(String path){
- File f=new File(path);
- File[] fi=f.listFiles();
- if(fi!=null){
- for(int i=0;i<fi.length;i++){
- //如果是文件
- if(fi[i].isFile()){
- String s=fi[i].getName();
- if(s.contains(jt.getText())){
- //获取文件格式名前的文件名
- int ii=s.lastIndexOf(".");
- String str=s.substring(ii+1);
- //如果没有输出文件格式或者搜索到的文件格式符合输入的格式
- if(jt1.getText().equals("")||jt1.getText().equals(str)){
- jte.append(fi[i].getAbsolutePath()+"\r\n");
- }
- }//如果是目录,就递归
- }else if(fi[i].isDirectory()){
- String s=fi[i].getName();
- if(s.contains(jt.getText())){
- jte.append(fi[i].getAbsolutePath()+"\r\n");
- }
- //开启线程去处理每个文件
- if(fi.length>25){
- SearchThread se=new SearchThread(this,fi[i].getAbsolutePath());
- se.start();}
- else{
- searchFile(fi[i].getAbsolutePath());
- }
- }
- }
- }
- }
- 上面是递归
。。。主要思想很简单,就是遍历一个文件夹,如果其中有文件夹,在执行同样的方法,如果是文件,就比较你的文件名是否跟包含搜索的输入的字符,是的话就打印出来。
有任何疑问可以问我或者留言 50586022,源代码已经上传。。