java实现文件重命名

 更新时间:2020年03月11日 12:46:03   作者:zjf1165  
这篇文章主要为大家详细介绍了java实现文件重命名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

背景

我们经常在网上下载一些视频教程,然而这些视频命名规则各不相同,即使对于相同类型的文件名来说,当文件数量很大且文件名全部是中文时,文件排序是非规则的,因此本篇博客主要讲解一种改变文件夹名称使得文件按照规律进行排序。

思路

根据文件名对文件进行排序,然后重命名文件即可。

代码

规则:如 将文件名中带有 “第八讲 ”替换成“8”:

构建排序规则

/***
 * @param filePath 文件夹位置
 * @param startWorld 开始替换的字
 * @param endWorld 结束替换的字
*/
  private void ReName(String filePath, String startWorld, String endWorld) {
    File file = new File(filePath);
    if (!file.exists() || !file.isDirectory()) {
      System.out.println("文件不存在");
      return;
    }
    String[] list = file.list();
    //以 第xxx讲-文件全名 的键值对存储文件
    HashMap<String, String> paths = new HashMap<String, String>();
    for (String str : list) {
      int start = str.indexOf(startWorld) + 1;
      int end = str.indexOf(endWorld);
      if (start != 0 && end != -1) {
        paths.put(str.substring(start, end), str);
      } else {
        System.out.println("文件 " + str + " 不满足替换条件");
      }
    }
    //对文件名进行排序
    orderPath(filePath, endWorld, paths);
  }

排序

private void orderPath(String filePath, String endWorld,
      HashMap<String, String> paths) {
    if (paths.isEmpty()) {
      return;
    }
    TreeMap<Integer, String> map = new TreeMap<Integer, String>();
    for (String str : paths.keySet()) {
      map.put(parseInt(str), paths.get(str));
    }
    //重命名该文件
    ReNameFile(filePath, endWorld, map);
  }

重命名

private void ReNameFile(String filePath, String endWorld,
      TreeMap<Integer, String> map) {
    for (int i : map.keySet()) {
      String path = map.get(i);
      File f = new File(filePath + File.separator + path);
      File dest = new File(filePath + File.separator + i
          + path.substring(path.indexOf(endWorld) + 1));
      if (f.exists() && !dest.exists()) {
        f.renameTo(dest);
      }
      f = null;
      dest = null;
    }
  }

将中文描述的数字转换为数字,如将 一百二十转换为120

private int parseInt(String str) {
    if (str.length() == 1) {
      if (str.equals("十")) {
        return 10;
      }
      return getInt(str.charAt(0));
    } else {
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (c != '百' && c != '十') {
          sb.append(getInt(c));
        }
      }
      int res = Integer.parseInt(sb.toString());
      if (str.charAt(str.length() - 1) == '百') {
        res *= 100;
      } else if (str.charAt(str.length() - 1) == '十') {
        res *= 10;
      }
      if (str.charAt(0) == '十') {
        res += 10;
      }
      return res;
    }
  }

完整代码

import java.io.File;
import java.util.HashMap;
import java.util.TreeMap;

/**
 * 将一个文件夹中所有满足条件的文件名替换
 * <p>
 * 条件:将从开始字到结束字的字符串替换成对应的数字
 * <p>
 * 如:第八讲 替换成 8
 */
public class Main {

  public static void main(String[] args) {
    Main m = new Main();
    // 文件夹位置
    String filePath = "D:\\新建文件夹\\OOAD与UML教学视频";
    // 从哪个字(startWorld)开始替换到哪个字(endWorld)结束
    String startWorld = "第";
    String endWorld = "讲";
    m.ReName(filePath, startWorld, endWorld);
  }

  /***
   * @param filePath 文件夹位置
   * @param startWorld 开始替换的字
   * @param endWorld 结束替换的字
   */
  private void ReName(String filePath, String startWorld, String endWorld) {
    File file = new File(filePath);
    if (!file.exists() || !file.isDirectory()) {
      System.out.println("文件不存在");
      return;
    }
    String[] list = file.list();
    //以 第xxx讲-文件全名 的键值对存储文件
    HashMap<String, String> paths = new HashMap<String, String>();
    for (String str : list) {
      int start = str.indexOf(startWorld) + 1;
      int end = str.indexOf(endWorld);
      if (start != 0 && end != -1) {
        paths.put(str.substring(start, end), str);
      } else {
        System.out.println("文件 " + str + " 不满足替换条件");
      }
    }
    //对文件名进行排序
    orderPath(filePath, endWorld, paths);
  }

  private void orderPath(String filePath, String endWorld,
      HashMap<String, String> paths) {
    if (paths.isEmpty()) {
      return;
    }
    TreeMap<Integer, String> map = new TreeMap<Integer, String>();
    for (String str : paths.keySet()) {
      map.put(parseInt(str), paths.get(str));
    }
    //重命名该文件
    ReNameFile(filePath, endWorld, map);
  }

  private void ReNameFile(String filePath, String endWorld,
      TreeMap<Integer, String> map) {
    for (int i : map.keySet()) {
      String path = map.get(i);
      File f = new File(filePath + File.separator + path);
      File dest = new File(filePath + File.separator + i
          + path.substring(path.indexOf(endWorld) + 1));
      if (f.exists() && !dest.exists()) {
        f.renameTo(dest);
      }
      f = null;
      dest = null;
    }
  }

  private int parseInt(String str) {
    if (str.length() == 1) {
      if (str.equals("十")) {
        return 10;
      }
      return getInt(str.charAt(0));
    } else {
      StringBuffer sb = new StringBuffer();
      for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (c != '百' && c != '十') {
          sb.append(getInt(c));
        }
      }
      int res = Integer.parseInt(sb.toString());
      if (str.charAt(str.length() - 1) == '百') {
        res *= 100;
      } else if (str.charAt(str.length() - 1) == '十') {
        res *= 10;
      }
      if (str.charAt(0) == '十') {
        res += 10;
      }
      return res;
    }
  }

  private int getInt(char c) {
    int res = -1;
    switch (c) {
    case '一':
      res = 1;
      break;

    case '二':
      res = 2;
      break;
    case '三':
      res = 3;
      break;
    case '四':
      res = 4;
      break;
    case '五':
      res = 5;
      break;
    case '六':
      res = 6;
      break;
    case '七':
      res = 7;
      break;
    case '八':
      res = 8;
      break;
    case '九':
      res = 9;
      break;
    case '零':
      res = 0;
      break;
    }
    return res;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用LambdaQueryWrapper动态加过滤条件 动态Lambda

    使用LambdaQueryWrapper动态加过滤条件 动态Lambda

    这篇文章主要介绍了使用LambdaQueryWrapper动态加过滤条件 动态Lambda,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • idea导入项目爆红问题记录以及解决

    idea导入项目爆红问题记录以及解决

    这篇文章主要介绍了idea导入项目爆红问题记录以及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java生成彩色附logo二维码

    java生成彩色附logo二维码

    这篇文章主要为大家介绍了java生成带logo的多彩二维码,比一般二维码颜色鲜艳,美观,如何生成二维码,下面小编为大家分享实现代码,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Java使用PrepareStatement实现数据的插入与查询操作

    Java使用PrepareStatement实现数据的插入与查询操作

    这篇文章主要为大家详细介绍了Java如何使用PrepareStatement实现数据的插入与查询操作,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-09-09
  • Mybatis insert方法主键回填和自定义操作

    Mybatis insert方法主键回填和自定义操作

    这篇文章主要介绍了Mybatis insert方法主键回填和自定义操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • win10设置java环境变量的方法

    win10设置java环境变量的方法

    下面小编就为大家带来一篇win10设置java环境变量的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • java实现简单TCP聊天程序

    java实现简单TCP聊天程序

    这篇文章主要为大家详细介绍了java实现简单TCP聊天程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • springboot整合Shiro的步骤

    springboot整合Shiro的步骤

    这篇文章主要介绍了springboot整合Shiro的步骤,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2021-01-01
  • springboot通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期(示例详解)

    springboot通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期(示例详解)

    这篇文章主要介绍了springboot通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • java实现163邮箱发送邮件到qq邮箱成功案例

    java实现163邮箱发送邮件到qq邮箱成功案例

    这篇文章主要为大家分享了java实现163邮箱发送邮件到qq邮箱成功案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论