java实现文件重命名
作者:zjf1165 发布时间:2023-08-26 09:27:46
标签: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;
}
}
来源:https://blog.csdn.net/zjf1165/article/details/52473624


猜你喜欢
- Java设计模式访问者模式模式概念访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的
- MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoD
- 一、背景知识:树(Tree)在之前的笔记中,我们介绍的链表、栈、队列、数组和字符串都是以线性结构来组织数据的。本篇笔记要介绍的树采用的是树状
- 这篇文章主要介绍了SpringBoot多模块项目框架搭建过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 引言♀ 小AD:明哥,我终于出了这口恶气了。♂ 明世隐:打爽了是吧。♀ 小AD:那必须的,打十盘我赢九盘,我随意。♂ 明世隐:那小朋友不是搞
- 先引用using System.Runtime.InteropServices; 的命名空间, 然后在合适的位置加上如下代码就OK。。注意:
- 本文以实例形式讲述了Android Touch事件分发过程,对于深入理解与掌握Android程序设计有很大的帮助作用。具体分析如下:首先,从
- WPF 窗体设置亚克力效果框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可
- RestTemplate加@Autowired注入不了1、在启动类加入如图箭头所示代码:然后在进行@Autowired发现不报错了。完美解决
- 解决Android调用系统分享图片给微信,出现分享失败,分享多文件必须为图片格式近期应公司需求,分享多图片到微信的功能,之前一直是用微信自己
- Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用。个人体验来说,Recycler
- 简介我们在开发web应用的时候,有时候为了适应浏览器大小的调整,需要动态对页面的组件进行位置的调整。这时候就会用到flow layout,也
- 本篇博客给大家分享一个效果比较好的侧滑菜单的Demo,实现点击左边菜单切换Fragment。效果如下: 主Activity代码:p
- 写应用程序的过程中,弹窗是个避免不了的功能,显示中,假设弹窗背景色和主窗口背景色相差不多,甚至是一样的时候,就会存在一个比较严重的人机交互和
- 前言:上篇总结了下WebApi的接口测试工具的使用,这篇接着来看看WebAPI的另一个常见问题:跨域问题。本篇主要从实例的角度分享下CORS
- 前言:最近对接了一个第三方的项目,该项目的数据传输格式是XML。由于工作多年只有之前在医疗行业的时候有接触过少量数据格式是XML的接口,之后
- 一、项目创建创建一个控制台应用程序,项目右键->管理 NuGet 程序包->Topshelft及Topshelf.Log4Net
- 本文实例讲述了JAVA获取任意http网页源代码。分享给大家供大家参考,具体如下:JAVA获取任意http网页源代码可实现如下功能:1. 获
- 这个CardStackViewpager的灵感来自Github上面的 FlippableStackView开源项目,而我想实现的效果方向上恰
- 本文实例讲述了Android自动朗读TTS用法。分享给大家供大家参考,具体如下:TextToSpeech简称 TTS,是自Android 1