最近在做一个项目,需要实现这几项功能,上网查了很多资料,自己研究了好几天终于实现了,现在与大家分享一下。

一、JAVA实现文件夹的搜索

在百度搜索N个技术文章,从哪些大牛们共享的资料中终于写出了我想要的代码。成功实现了对文件夹的搜索。
其原理是新定义个FileListener类使其实现ActionListener和Runnable接口。将其绑定在JButton上。在向FileListener的对象传入要搜索的文件夹名称时,会先列出系统所有盘符,并开启多个线程依次搜索各个盘符,其实现原理是先列出各个盘符的列表,用递归方式列出所有文件夹中的文件,当定位到文件绝对路径中含有该关键字时,会调用analysisPath解析路径,得到文件夹绝对路径。判断无误后停止所有线程,结束搜索。下面请看代码:
import java.awt.event.ActionEvent;
import java.io.File;public class FileListener implements java.awt.event.ActionListener, Runnable {private static String content;//确保一变化线程中即可调用private String root = "C:\\";private static File[] listFile;//确保一变化线程中即可调用private String fileName;     //所需搜索问关键字private static String item = "";//通过item来判定执行run中的哪一个方法private Thread t;//统一设定线private static int count = 0;//统计出现的文件个数private FileListener fl;//控制线程的启动private static String s = "";//标识是否停止寻找private int threadNum = 0;private File[] rootlist;private int success = 0; //标识是否成功得到文件夹绝对路径public FileListener() {}public FileListener(String fileName, String root) {  this.root = root;this.fileName = fileName;File file1 = new File("");rootlist = file1.listRoots();  //获取所有盘符}public void actionPerformed(ActionEvent e) {//     System.out.println("响应事件");content = fileName;  //所需搜索的关键字if (e.getActionCommand().equals("Search")) {// 指定盘if (root == null || root.equals("")) {System.out.println("该路径不存在!");File file = new File("");listFile = file.listRoots();} else {if (content == null || content.length() == 0) {File file = new File(root);listFile = file.listFiles();//启动线程item = "search";s = "";fl = new FileListener(fileName, root);t = new Thread(fl);t.start();} else {//   String[] list;int number = rootlist.length;//list = new String[number];//list[i] = rootlist[i].getAbsolutePath();System.out.println("-------------------->" + rootlist[threadNum].getAbsolutePath());File file = new File(rootlist[threadNum].getAbsolutePath());listFile = file.listFiles();//启动线程item = "searchCount";s = "";//每次线程启动前都要将s清空fl = new FileListener(fileName, rootlist[threadNum].getAbsolutePath());
//t = new Thread(fl);t.start();}}}}private int search(File[] file) {//每次使用之前都将count清0,否则会叠加int count = 0;if (file == null || file.length == 0) {return 0;}for (int i = 0; i < file.length; i++) {File filenew = file[i];if (filenew.isDirectory()) {File[] tempFile = filenew.listFiles();count += search(tempFile);this.count = count;}if (s.equals("stop")) {break;} else {if (filenew.isFile()) {count++;s = "stop";}}}return count;}private int searchContent(File[] file) {int count = 0;if (file == null || file.length == 0) {return 0;}for (int i = 0; i < file.length; i++) {File filenew = file[i];// 包含字符if (filenew.isDirectory()) {File[] tempFile = filenew.listFiles();count += searchContent(tempFile);this.count = count;}if (filenew.isFile()) {String path = filenew.getAbsolutePath();//找到与内容相符的路径if (s.equals("stop")) {break;} else {if (path.indexOf(content) != -1) {count++;s = "stop";//   LeftPanel.ReturnPath = analysisPath(filenew.getAbsolutePath());     //此处为将搜索时检索的路径显示在JLabel上,用户体验更好。if (analysisPath(filenew.getAbsolutePath())) {  break;}}}}}return count;}//重写run方法@Overridepublic void run() {
//      searchContent(listFile);System.out.println("searchContent函数结束");if (success == 0) {if (threadNum++ < rootlist.length) {System.out.println("-------------------->" + rootlist[threadNum].getAbsolutePath());File file = new File(rootlist[threadNum].getAbsolutePath());listFile = file.listFiles();//启动线程item = "searchCount";s = "";//每次线程启动前都要将s清空fl = new FileListener(fileName, rootlist[threadNum].getAbsolutePath());
//t = new Thread(fl);t.start();}}}/*** 解析搜索到的文件路径 得出目录文件绝对路径** @param absolutePath* @return*/private String analysisPath(String absolutePath) {//此处传入的absolutePath时定位到的路径中含有关键字的文件,,也就是目标文件夹中的文件。File f = new File(absolutePath);try {while (!f.getName().equals(fileName)) {  //此处是为了得到目标文件夹的绝对路径f = f.getParentFile();   //得到父文件路径}} catch (Exception e) {System.out.println("未能成功检索到文件夹")s = "";return null;}System.out.println("成功检索到文件夹");success = 1;   //成功检索到文件夹 ,修改该变量值  使进程停止
//fun(f.getAbsolutePath();)  //此处为您所需要处理该路径的方法,也可以把该值付给调用方的类成员变量得到该值
        return f.getAbsolutePath();
    }}

二、JAVA实现文件夹的复制、删除

在实现了文件夹搜索后,文件夹/文件的复制,删除相对简单些。下面我们来看代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import static qqbackup.BackUpProgress.currentNum;
//import static qqbackup.BackUpProgress.currentSize;class CopyFile {/*** 复制文件到目录 <功能详细描述>** @param srcPath 文件绝对路径* @param destDirPath 目标文件夹绝对路径* @throws Exception* @see [类、类#方法、类#成员]*/public static void copyFile(String srcPath, String destDirPath) throws Exception {File srcfile = new File(srcPath);File destDir = new File(destDirPath);InputStream is = null;OutputStream os = null;int ret = 0;// 源文件存在if (srcfile.exists() && destDir.exists() && destDir.isDirectory()) {try {is = new FileInputStream(srcfile);String destFile = destDirPath + File.separator + srcfile.getName();os = new FileOutputStream(new File(destFile));byte[] buffer = new byte[1024];while ((ret = is.read(buffer)) != -1) {os.write(buffer, 0, ret); // 此处不能用os.write(buffer),当读取最后的字节小于1024时,会多写;// ret是读取的字节数}os.flush();} catch (FileNotFoundException e) {e.printStackTrace();throw new Exception("");} catch (IOException e) {e.printStackTrace();throw new Exception("");} finally {try {if (os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}try {if (is != null) {is.close();}} catch (Exception e) {}}} else {throw new Exception("源文件不存在或目标路径不存在");}}/*** 列出文件夹下的所有文件,使用递归。 <功能详细描述>** @param dirPath 文件夹绝对路径* @see [类、类#方法、类#成员]*/public static void getFileList(String dirPath) {File rootDir = new File(dirPath);if (rootDir.exists()) {File[] files = rootDir.listFiles();for (File file : files) {if (file.isDirectory()) {System.out.println("目录" + file.getName());// 递归调用getFileList(file.getPath());} else {System.out.println("文件" + file.getName());}}}}/*** <一句话功能简述>复制文件夹 <功能详细描述>** @param srcDir 文件夹的绝对路径* @param destDir 目标绝对路径* @throws Exception* @see [类、类#方法、类#成员]*/public static void copyFolder(String srcDir, String destDir) throws Exception {File srcFile = new File(srcDir);// 在目标路径建立文件夹String name = srcFile.getName();File destDirFile = new File(destDir);if (!destDirFile.exists()) {destDirFile.mkdirs();   //如果路径不存在则创建文件夹}File destFile = new File(destDir + File.separator + name);  //目的文件夹内的元文件夹名称路径if (!destFile.exists()) {destFile.mkdir();             //如果路径不存在则创建文件夹}if (srcFile.exists() && destFile.isDirectory()) {File[] files = srcFile.listFiles();String src = srcDir;String dest = destFile.getAbsolutePath();for (File temp : files) {// 复制目录if (temp.isDirectory()) {String tempSrc = src + File.separator + temp.getName();String tempDest = dest + File.separator + temp.getName();File tempFile = new File(tempDest);if(!tempFile.exists()){tempFile.mkdir();}// 当子目录不为空时if (temp.listFiles().length != 0) {// 递归调用copyFolder(tempSrc, dest);}} else // 复制文件{String tempPath = src + File.separator + temp.getName();copyFile(tempPath, dest);}}}//  System.out.println("拷贝完成");}/*** 删除文件夹 <功能详细描述>* 要先删除子内容,再删除父内容** @param dirPath 要删除的文件夹* @see [类、类#方法、类#成员]*/public static void deleteFolder(String dirPath) {File folder = new File(dirPath);File[] files = folder.listFiles();for (File file : files) {if (file.isDirectory()) {String tempFilePath = dirPath + File.separator + file.getName();deleteFolder(tempFilePath);} else {file.delete();}}folder.delete();}}

希望这些代码能给大家带来些帮助,欢迎留言交流。
如有转载请标明出处   ,谢谢合作哦。

转载于:https://www.cnblogs.com/guoyaohua/p/8502934.html

java实现基于关键字的文件夹(文件)的搜索、文件夹(文件)的复制、删除相关推荐

  1. win7搜索文件 服务器,win7系统搜索不到文件的解决方法

    实际上,如果之前没有搜索过这个文件,没有加入索引的话,输入一个关键字确实搜索不到,不过两个字就可以搜索到,而如果在关键字中加入?或*也可以搜索,而且之前搜索过的文件,下次搜索一个字也可以搜到,不过这些 ...

  2. VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)

    右击项目->属性->字符集:使用多字节字符集. 这样可以使用char到CString的转化. char sRead[20] = ""; CString strtest ...

  3. Linux 下文件的查询与搜索

    Linux 下文件的查询与搜索 常用的文件查询和搜索命令: find 和 grep 命令 find find命令用于在目录结构中查找文件 命令格式 find [路径] [参数] [关键字] 路径是要查 ...

  4. java formfile_基于Struts文件上传(FormFile)详解

    Struts中FormFile用于文件进行上传 1.在jsp文件中进行定义 名字: 头像: 2.在Form表单中定义FormFile /* * Generated by MyEclipse Strut ...

  5. java语言怎样判断文件夹_JAVA语言之如何判断文件,判断文件夹是否存在的代码...

    本文主要向大家介绍了JAVA语言之如何判断文件,判断文件夹是否存在的代码,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 一.判断文件是否存在,不存在则创建File file = ne ...

  6. Java中基于TCP通过socket嵌套字连接方式传送文件

    这里写目录标题 Java中通过socket连接传送文件 前言 socket嵌套字 发送方 接收方 总结 Java中通过socket连接传送文件 前言 在项目的开发中经常遇到需要传送文件的情况,有时候是 ...

  7. eclipse 的Java Resource文件夹显示有错,可是文件夹下面的文件没有提示错误,这是怎么回事?怎么解决?

    eclipse 的Java Resource文件夹显示有错,可是文件夹下面的文件没有提示错误,这是怎么回事?怎么解决? 1.maven更新一下 2.或者把这个工程给删除了在创建一遍看看还有没有出 3. ...

  8. java解压两层zip文件_Java解压缩zip - 解压缩多个文件或文件夹实例

    java解压缩zip - 多个文件(包括文件夹),具体如下: 对多个文件和文件夹进行压缩,对复杂的文件目录进行解压. 压缩方法使用的是可变参数,可以压缩1到多个文件..可以写数组的方式或者一个个写到参 ...

  9. java复制文件的4种方式及拷贝文件到另一个目录下与删除单个文件和删除整个文件夹

    文章目录 1.使用FileStreams复制 2.使用FileChannel复制 3.使用Commons IO复制 4.使用Java7的Files类复制 5.下面看下java拷贝文件到另一个目录下的实 ...

  10. 如何搜索同一文件夹(含子文件夹)下的所有Excel关键字

    目录 问题场景描述: 方法前提: 方法介绍: 问题场景描述: 在test文件夹下有很多子文件夹,而每个文件夹下都有excel文件.现在有个任务就是要找出含有关键字"交易"的exce ...

最新文章

  1. projecteuler_problem10
  2. vue 结合 echarts
  3. TCP 和 UDP 在socket编程中的区别
  4. 原型设计工具【收集转帖】
  5. ERROR 1366 (HY000): Incorrect string value......(Mysql报错解决)
  6. BeanDefinitionRegistryPostProcessor​ 的处理源码流程
  7. c语言编程算法精选,c语言经典程序算法【DOC精选】.doc
  8. CentOS/Redhat:手动配置IP地址(命令和图形界面)
  9. 北航博士,研究所月入两万,是一种什么体验?
  10. Asterisk中实现回拔
  11. win32-x64-64\binding.node is not a valid Win32 application
  12. Flask 上传自定义头像_1 使用Flask Uploads
  13. 范围求和 II-c语言解决
  14. 用php获取设备信息
  15. Ubuntu安装虚拟机
  16. n3k配置vpc是否还需要配置hsrp_连结7000系列交换机使用HSRP配置示例
  17. AD通孔焊盘单独设置铺铜规则
  18. js实现螺旋纹理特效
  19. 杭电计算机研究生复试,杭电计算机考研经验
  20. 深海迷航显示无法连接服务器,深海迷航中管道怎么连接 | 手游网游页游攻略大全...

热门文章

  1. DNS 搭建(视图功能)
  2. AJAX 必用的情况(待选........)
  3. 动态显示没有数据时让GridView也能显示表头信息
  4. aarch64 arm上交叉编译mysql-2.7.35
  5. qemu前后端features协商过程分析(vhost_user后端)
  6. openCV之中值滤波均值滤波(及代码实现)
  7. RTL8211E应用(二)之信号输入、输出接口
  8. 常见消息部件(Common Message Components)
  9. 全国草地资源类型分布数据/植被类型分布数据/土地利用类型分布数据
  10. ACM中一些细节问题