Java 中按文件名称分类,按文件大小分类,按照文件类型分类,按照最后修改时间分类的工具类

简介: 在此博客中用到了文件操作的工具类,可以连接Java中实现复制文件到文件,复制文件到文件夹,复制文件夹到文件,删除文件,删除文件夹,移动文件,移动文件夹的工具类package cn.edu.hactcm.cfcms.utils;import java.io.File;import java.util.HashSet;import java.util.Set;import javax.sw

在此博客中用到了文件操作的工具类,可以连接

Java中实现复制文件到文件,复制文件到文件夹,复制文件夹到文件,删除文件,删除文件夹,移动文件,移动文件夹的工具类

package cn.edu.hactcm.cfcms.utils;

import java.io.File;
import java.util.HashSet;
import java.util.Set;

import javax.swing.JOptionPane;
/**
 * 文件分类中用到的所有工具类
 * CFMS    :Computer files management system 
 * version :1.0 2013-3-3 上午02:28:40
 */
public class ClassifyFolderUtils {

 /**
  * 在from 这个文件夹里创建 innerFolderName 这个文件夹,如果前者内部的文
  * 件中包含关键字innerFolderName,那么把文件拷贝到innerFolderName文件夹里面去
  *
  * @param innerFolderName
  * @param from
  */
 public static void NameClassify(String innerFolderName,String from){
  File fromFile = new File(from);
  
  //如果选中的文件夹是一个文件夹,那么将不做任何操作
  if (from.isEmpty()) {
   return;
  } else {
   //获得文件里面的所有文件
   File[] listFiles = fromFile.listFiles();
   
   //如果选中的文件不是空文件,在这个文件里面创建要分类的文件
   String newPath = from + File.separator + innerFolderName;
   File newFile = new File(newPath);
   
   for (int i = 0; i < listFiles.length; i++) {
    if (listFiles[i].isDirectory()) {
     //判断这个文件夹中是否有这个关键字,如果有的话就拷贝目录了到制定目录内了。
     if (listFiles[i].getName().indexOf(innerFolderName) != -1) {
      //获得这个文件夹的名称,在指定的文件内创建这个目录
      if (!newFile.exists()) {
       newFile.mkdir();
      }
      
      FileOperationUtils.copyFolder2Folder(listFiles[i].getPath(), newPath);
     } else {//如果没有就跳出这个循环
      continue;
     }
    } else {
     //判断这个文件是否含有名称关键字
     if (listFiles[i].getName().indexOf(innerFolderName) != -1) {
      String destFilePath = newPath + File.separator + listFiles[i].getName();
      if (!newFile.exists()) {
       newFile.mkdir();
       
      }
      FileOperationUtils.copyFileToFile(listFiles[i].getPath() , destFilePath);
     } else {
      continue;
     }
    }
   }
  }
  JOptionPane.showMessageDialog(null, "操作成功,请查看指定目录!","提示消息",JOptionPane.WARNING_MESSAGE);
 }
 
 public static void TypeClassify(String path){
  File destFile = new File(path);
  //判断是否是文件夹,文件夹是否为空
  if (destFile.isFile()) {
   JOptionPane.showMessageDialog(null, "对不起,不能对文件进行按类型分类,请填写文件夹路径");
   return ;
  }
  
  if (!destFile.exists()) {
   JOptionPane.showMessageDialog(null, "对不起,所指定文件夹不存在");
   return ;
  }
  
  typeOperation(path, destFile);
  
  //提示消息
  JOptionPane.showMessageDialog(null, "操作成功,请查看指定目录!","提示消息",JOptionPane.WARNING_MESSAGE);
 }

 /**
  * @param path
  * @param destFile
  */
 private static void typeOperation(String path, File destFile) {
  File[] listFiles = destFile.listFiles();
  if (listFiles.length == 0) {
   return ;
  }
  
  //条件都成立了的话,就在这个路径下面创建一个文件
  String newPath = path + File.separator + "这里存放的是按照类型分类之后的文件所在位置";
  File newFile = new File(newPath);
  if (!newFile.exists()) {
   newFile.mkdirs();
  }
  
  Set<String> typesSet = new HashSet<String>();
  for (File file2 : listFiles) {
   if (file2.isDirectory()) {
    //进行递归
    typeOperation(path, file2);
   } else {
    String filePath = file2.getPath();
    //截取后缀名
    String suffix = filePath.substring(filePath.lastIndexOf(".") + 1,filePath.length());
    //文件类型文件夹所在的位置
    String newTypePath = newPath + File.separator + suffix;
    //使用set集合存储后缀名,让这些重复的后缀名只存在一次,如果没有才存入这个结合中
    if (!typesSet.contains(suffix)) {
     typesSet.add(suffix);
     //在新创建的文件夹里面创建这个后缀名命名的文件夹。
     new File(newTypePath).mkdir();
    }
    
    FileOperationUtils.copyFile2Folder(file2.getPath(), newTypePath);
   }
  }
 }
 
 /**
  * 按大小分类
  * @param sizeNameValue :按名称分类的文件名称
  * @param folderPath    : 对那个文件夹进行按照大小分类
  * @param min           : 文件最小值
  * @param max           : 文件最大值
  * @param unit1         : 最小值的单位
  * @param unit2         : 最大值的单位
  */
 public static void SizeClassify(String sizeNameValue, String folderPath,
   String min, String max, String unit1, String unit2) {
  boolean b = DataValidate.validate(min, max);
  if (!b) {
   return;
  } else {
   Integer minValue = Integer.parseInt(min);
   Long minSize = FileInfoUtils.judgeUnit(unit1)*minValue;
   Integer maxValue = Integer.parseInt(max);
   Long maxSize = FileInfoUtils.judgeUnit(unit2)*maxValue;
   
   String newPath = folderPath + File.separator + sizeNameValue;
   File newFile = new File(newPath);
   if (!newFile.exists()) {
    newFile.mkdir();
   }
   
   //开始按照大小分类
   File fromFile = new File(folderPath);
   File[] listFiles = fromFile.listFiles();
   //判断这个文件夹里面是否有文件,如果有文件才可以,否者直接返回
   if (listFiles.length > 0) {
    for (File file : listFiles) {
     long fileSize = FileInfoUtils.getFileSize(file.getPath());
     if (fileSize > minSize && fileSize < maxSize) {
      FileOperationUtils.copyFileInAllType(file.getPath(), newPath);
     }
    }
   } else {
    JOptionPane.showMessageDialog(null, "对不起,你选中的文件夹为空!","提示信息",JOptionPane.WARNING_MESSAGE);
    return ;
   }
  }
  //提示消息
  JOptionPane.showMessageDialog(null, "操作成功,请查看指定目录!","提示消息",JOptionPane.WARNING_MESSAGE);
 }
 
 /**
  * 按照时间分类
  * @param sizeNameValue  :时间分类的名称
  * @param folderPath     : 这是一个文件夹路径,指定要对那个文件进行操作
  * @param datetime1      : 这是时间点一
  * @param datetime2      : 这是时间点二
  */
 public static void TimeClassify(String timeNameValue, String folderPath,
   String datetime1, String datetime2) {
  //获得两个时间的时间毫秒值
  long time1 = new DateFormatUtils().getMillisecondsByTimeString(datetime1);
  long time2 = new DateFormatUtils().getMillisecondsByTimeString(datetime2);
  long timeMax = (time1 > time2) ? time1 : time2;
  long timeMin = (time1 > time2) ? time2 : time1;
  if (time1 == time2) {
   JOptionPane.showMessageDialog(null, "对不起,两个时间的值不能相同!","提示消息",JOptionPane.WARNING_MESSAGE);
   return;
  }
  
  // 判断这个文件夹里面是否有文件,如果没有文件,那么就返回
  File file = new File(folderPath);
  File[] listFiles = file.listFiles();
  if (listFiles.length == 0) {
   return;
  }
  // 如果有文件,创建文件夹,然后执行其他的工作
  String newPath = folderPath + File.separator + timeNameValue;
  File newFile = new File(newPath);
  if (!newFile.exists()) {
   newFile.mkdir();
  }
  
  for (File file2 : listFiles) {
   long lastModifiedTime = file2.lastModified();
   if (lastModifiedTime <= timeMax && lastModifiedTime >= timeMin) {
    FileOperationUtils.copyFileInAllType(file2.getPath(), newPath);
   }
  }
  //提示消息
  JOptionPane.showMessageDialog(null, "操作成功,请查看指定目录!","提示消息",JOptionPane.WARNING_MESSAGE);
 }
}

目录
相关文章
|
27天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
66 9
|
7天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
63 34
|
18天前
|
JSON Java 程序员
Java|如何用一个统一结构接收成员名称不固定的数据
本文介绍了一种 Java 中如何用一个统一结构接收成员名称不固定的数据的方法。
23 3
|
24天前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
39 3
|
28天前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
2天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
24 6
|
17天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
15天前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
17天前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
10天前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####