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;
  }
}

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

相关文章

  • 详解Java编程中JavaMail API的使用

    详解Java编程中JavaMail API的使用

    这篇文章主要介绍了详解Java编程中JavaMail API的使用,通过JavaMail可以实现丰富的邮件类相关功能,需要的朋友可以参考下
    2015-11-11
  • 修改Maven settings.xml 后配置未生效的解决

    修改Maven settings.xml 后配置未生效的解决

    这篇文章主要介绍了修改Maven settings.xml 后配置未生效的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • 关于Java中避免空指针的方法

    关于Java中避免空指针的方法

    这篇文章主要介绍了关于Java中避免空指针的方法,空指针异常就是我们在对空对象进行的任何操作都会报空指针异常,所谓的指针,就是java中的对象的引用,比如String s;这个就是指针,需要的朋友可以参考下
    2023-07-07
  • 浅谈@RequestBody和@RequestParam可以同时使用

    浅谈@RequestBody和@RequestParam可以同时使用

    这篇文章主要介绍了@RequestBody和@RequestParam可以同时使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • String s = new String(''a '') 到底产生几个对象

    String s = new String(''a '') 到底产生几个对象

    这篇文章主要介绍了String s = new String(" a ") 到底产生几个对象,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Monaco Editor实现sql和java代码提示实现示例

    Monaco Editor实现sql和java代码提示实现示例

    这篇文章主要为大家介绍了Monaco Editor代码提示sql和java实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java8中的forEach使用及说明

    Java8中的forEach使用及说明

    这篇文章主要介绍了Java8中的forEach使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 一文让你彻底明白Java中的值传递和引用传递

    一文让你彻底明白Java中的值传递和引用传递

    这篇文章主要给大家介绍了关于Java中值传递和引用传递的相关资料,值传递是指在调用函数时将实际参数复制一份传递到函数中,引用传递是指在调用函数时将实际参数的引用直接传递到函数中,需要的朋友可以参考下
    2023-10-10
  • 使用Java实现简单的区块链程序的方法

    使用Java实现简单的区块链程序的方法

    这篇文章主要介绍了使用Java实现简单的区块链程序的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    防止SpringMVC拦截器拦截js等静态资源文件的解决方法

    本篇文章主要介绍了防止SpringMVC拦截器拦截js等静态资源文件的解决方法,具有一定的参考价值,有兴趣的同学可以了解一下
    2017-09-09

最新评论