批量重命名文件的小工具

Renamer是一个帮助您整理硬盘文件的小工具。这次的软件使用JAVA语言开发。

Renamer的主要功能:
              1.按照指定的规则重命名文件,如IMG1,IMG2,IMG3;
              2.添加或删除文件的前缀后缀,如[tta.cn]pack → pack;
              3.批量修改文件扩展名,并提供一种智能修改文件扩展名的模式,通过读取文件头信息获取文件本来的扩展名,比如一个图片下下来是JPG的扩展名,但是通过读取文件头信息发现是一个gif文件,使用Renamer批量识别文件真实的扩展名,以帮助您的浏览编辑工具更好的识别文件。
              目前Renamer支持约30种文件扩展名格式,即使无法识别,也会保留文件原本的文件扩展名。

展示:

源代码:

import Renamer.GetTypeByHead;
import Renamer.RenamerUtil;import java.io.*;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;public class Main extends RenamerUtil {static Scanner input = new Scanner(System.in);/*** 扫描到的文件列表*/static List<File> fileList;/*** 修改后的文件列表*/static List<File> newFileList = new LinkedList<>();public static void main(String[] args) {//获取扫描的文件夹路径System.out.println("欢迎使用\"批量重命名\"小工具 By.偃笙");System.out.println("输入0退出程序");System.out.print("请输入文件夹路径:");String dir = input.next();if("0".equals(dir)){System.exit(0);}//获取文件夹列表fileList = getFileList(dir);if (fileList.isEmpty()) {System.out.println("未搜索到文件");input.nextLine();main(args);return;}//遍历文件夹列表int index = 1;System.out.println("当前文件夹列表如下:");for (File element : fileList) {System.out.println(index + " & " + element.getName());index++;}choiceMode();}public static void choiceMode() {System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.println(">请选择一种文件重命名模式");System.out.println(">1.按指定的规则修改 如:IMG1.jpg IMG2.jpg IMG3.jpg");System.out.println(">2.添加/删除前缀后缀 如:[tt科技]工具包.zip → 工具包.zip");System.out.println(">3.修改文件扩展名 如 1.jpg → 1.png");System.out.println(">0.返回");System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.print("请输入模式ID:");//获取模式IDint mode = 0;try {mode = input.nextInt();if (mode < 0 || mode > 3) {throw new Exception();}} catch (Exception e) {input = new Scanner(System.in);System.out.println("请输入正确的数字!");System.out.println("输入任意内容继续. . .");input.next();choiceMode();return;}//判断输入的模式IDswitch (mode) {case 0:main(null);break;case 1:mode1();break;case 2:mode2();break;case 3:mode3();break;}main(null);}public static void mode1() {System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.println(">模式1:按指定的规则修改");System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.println("星号*为标识符,替代文件的顺序ID");System.out.println("例:IMG* → IMG1.jpg IMG2.jpg");System.out.println("输入\"0\"返回");System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.print("请输入规则(请勿输入后缀名):");//获取规则String rule = input.next();if ("0".equals(rule)) {choiceMode();return;}//判断标识符位置int identify = rule.indexOf("*");if (identify == -1) {System.out.println("找不到标识符");System.out.println("输入任意内容继续. . .");input.next();mode1();return;}System.out.print("请输入文件顺序ID(输入1则从1开始):");int index = input.nextInt();//获取修改后的文件名列表for (int i = 0; i < fileList.size(); i++) {String newName = getFileNameRule(rule, identify, index) + getFileTail(fileList.get(i).getName());index++;newFileList.add(new File(fileList.get(i).getParent() + "\\" + newName));}//遍历修改后的文件名列表System.out.println("预览如下:");for (int i = 0; i < newFileList.size(); i++) {System.out.println(newFileList.get(i).getName());}//询问是否修改System.out.print("输入Y确认修改:");String yes = input.next();if ("Y".equals(yes)) {for (int i = 0; i < fileList.size(); i++) {fileList.get(i).renameTo(newFileList.get(i));}System.out.println("修改完成!");} else {System.out.println("您取消了修改");}//还原文件列表newFileList.clear();fileList.clear();System.out.println("输入任意内容继续. . .");input.next();}public static void mode2() {System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.println(">模式2:添加/删除前缀后缀");System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.println(">删除前缀时,标识是前缀的最后一个字");System.out.println(">例如去掉[pic.cc]pack的前缀则输入]");System.out.println(">删除后缀时,标识是后缀的第一个字");System.out.println(">例如去掉pack[pic.cc]的后缀则输入[");System.out.println(">1.添加前缀");System.out.println(">2.添加后缀");System.out.println(">3.删除前缀");System.out.println(">4.删除后缀");System.out.println(">0.返回");System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.print("请输入序号:");int choice = 0;//获取序号try {choice = input.nextInt();if (choice < 0 || choice > 4) {throw new Exception();}} catch (Exception e) {input = new Scanner(System.in);System.out.println("请输入正确的数字!");System.out.println("输入任意内容继续. . .");input.next();mode2();return;}String prefix = "", suffix = "",identity = "";switch (choice) {case 0:choiceMode();return;case 1://添加前缀System.out.print("请输入要添加的前缀:");prefix = input.next();for (File f:fileList){newFileList.add(addPrefix(f,prefix));}break;case 2://添加后缀System.out.print("请输入要添加的后缀:");suffix = input.next();for (File f:fileList){newFileList.add(addSuffix(f,suffix));}break;case 3://删除前缀System.out.print("请输入前缀的标识:");identity = input.next();for (File f:fileList){newFileList.add(removePrefix(f,identity));}break;case 4://删除后缀System.out.print("请输入后缀的标识:");identity = input.next();for (File f:fileList){newFileList.add(removeSuffix(f,identity));}break;}//遍历修改后的文件名列表System.out.println("预览如下:");for (int i = 0; i < newFileList.size(); i++) {System.out.println(newFileList.get(i).getName());}//询问是否修改System.out.print("输入Y确认修改:");String yes = input.next();if ("Y".equals(yes)) {for (int i = 0; i < fileList.size(); i++) {fileList.get(i).renameTo(newFileList.get(i));}System.out.println("修改完成!");} else {System.out.println("您取消了修改");}//还原文件列表newFileList.clear();fileList.clear();System.out.println("输入任意内容继续. . .");input.next();}public static void mode3() {System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.println(">模式3:修改文件扩展名");System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");System.out.println("输入任意文件扩展名进行修改");System.out.println("文件扩展名例:JPG PNG ZIP ");System.out.println("输入\"*\"智能修改文件扩展名");System.out.println("输入\"0\"返回");System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");//获取需要改的扩展名System.out.print("请输入文件扩展名:");String tail = input.next();//判断输入的扩展名if ("0".equals(tail)) {choiceMode();return;}if ("*".equals(tail)) {//获取修改后的文件名列表for (File f : fileList) {newFileList.add(getFileRealityTail(f));}} else {//获取修改后的文件名列表for (File f : fileList) {if (f.isDirectory()) {newFileList.add(f);} else {newFileList.add(new File(getFileName(f) + "." + tail));}}}//遍历修改后的文件名列表System.out.println("预览如下:");for (int i = 0; i < newFileList.size(); i++) {System.out.println(newFileList.get(i).getName());}//询问是否修改System.out.print("输入Y确认修改:");String yes = input.next();if ("Y".equals(yes)) {for (int i = 0; i < fileList.size(); i++) {fileList.get(i).renameTo(newFileList.get(i));}System.out.println("修改完成!");} else {System.out.println("您取消了修改");}//还原文件列表newFileList.clear();fileList.clear();System.out.println("输入任意内容继续. . .");input.next();}
}
package Renamer;import org.junit.Test;import java.io.File;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;public class RenamerUtil {/*** 获取文件夹的文件列表** @param dir 欲扫描的文件夹* @return java.RenamerUtil.List<java.io.File>* @author bloodarea* @date 2020/7/7 22:56*/public static List<File> getFileList(String dir) {if (!new File(dir).exists()) {return null;}//获取文件夹列表List<File> result = new LinkedList<>();for (File element : new File(dir).listFiles()) {result.add(element);}//按文件中所有数字之和大小排序,大的在后面Collections.sort(result, new Comparator<File>() {@Overridepublic int compare(File o1, File o2) {try {if (Long.parseLong(getFileNum(o1.getPath())) > Long.parseLong(getFileNum(o2.getPath()))) {return 1;} else {return -1;}}catch (NumberFormatException e){ }//按文件名中每个字符的Unicode值排序return o1.getName().compareTo(o2.getName());}});//按文件的类型排序,文件夹在前,文件在后Collections.sort(result, new Comparator<File>() {@Overridepublic int compare(File o1, File o2) {if (o1.isDirectory() && o2.isFile()) {return -1;} else {return 1;}}});return result;}/*** 获取去掉扩展名的文件名** @param name 欲获取的文件路径* @return java.lang.String* @author bloodarea* @date 2020/7/9 8:12*/public static String getFileName(File name) {if (name.isDirectory()) {return name.getPath();} else {return name.getPath().substring(0, name.getPath().lastIndexOf("."));}
}/*** 按规则获取当前文件名** @param rule     规则* @param identify 文件顺序ID的位置* @param index    文件顺序ID值* @return java.lang.String* @author bloodarea* @date 2020/7/7 22:57*/
public static String getFileNameRule(String rule, int identify, int index) {StringBuilder sb = new StringBuilder();sb.append(rule.substring(0, identify));sb.append(index);sb.append(rule.substring(identify + 1, rule.length()));return sb.toString();
}/*** 获取文件的后缀名** @param name 欲获取的文件名* @return java.lang.String* @author bloodarea* @date 2020/7/8 10:27*/
public static String getFileTail(String name) {int index = name.lastIndexOf(".");if (index == -1) {return "";} else {return "." + name.substring(index + 1, name.length());}}/*** 获取字符串中所有的数字** @param name 欲获取的文件名* @return java.lang.String* @author bloodarea* @date 2020/7/8 13:18*/
public static String getFileNum(String name) {StringBuilder sb = new StringBuilder();for (int i = 0; i < name.length(); i++) {if (name.charAt(i) >= '0' && name.charAt(i) <= '9') {sb.append(name.charAt(i));}}return sb.toString();
}/*** 获取文件的真实扩展名,返回带真实文件扩展名的完整路径,如果无法获取真实扩展名,则返回原路径** @param name* @return java.io.File* @author bloodarea* @date 2020/7/9 8:33*/
public static File getFileRealityTail(File name) {String reality = GetTypeByHead.getFileType(name.getPath());if (name.isDirectory() || reality == null) {return name;} else {return new File(getFileName(name) + "." + reality);}
}/*** 为文件或文件夹添加前缀** @param name   文件路径* @param prefix 前缀名* @return java.io.File* @author bloodarea* @date 2020/7/10 9:41*/
public static File addPrefix(File name, String prefix) {return new File(name.getParent() + "\\" + prefix + name.getName());
}/*** 为文件或文件夹添加后缀** @param name   文件路径* @param suffix 后缀名* @return java.io.File* @author bloodarea* @date 2020/7/10 9:41*/
public static File addSuffix(File name, String suffix) {if (name.isFile()) {return new File(getFileName(name) + suffix + getFileTail(name.getPath()));} else {return new File(name.getPath() + suffix);}
}/**
* 根据标识去掉前缀,标识为前缀的最后一个字
*
* @author bloodarea
* @date 2020/7/10 9:53
** @param name 文件路径* @param identity 标识
* @return java.io.File
*/
public static File removePrefix(File name, String identity) {String fileName = name.getName();StringBuilder sb = new StringBuilder();sb.append(name.getParent() + "\\");sb.append(fileName.substring(fileName.indexOf(identity) + 1, fileName.length()));return new File(sb.toString());
}
/**
* 根据标识去掉后缀,标识为后缀的第一个字
*
* @author bloodarea
* @date 2020/7/10 9:58
** @param name 文件路径* @param identity 标识
* @return java.io.File
*/
public static File removeSuffix(File name,String identity) {String fileName = name.getName();StringBuilder sb = new StringBuilder();sb.append(name.getParent() + "\\");sb.append(fileName.substring( 0, fileName.lastIndexOf(identity)));sb.append(getFileTail(name.getPath()));return new File(sb.toString());}
}

以下代码来自yunshouhu博主
链接:https://blog.csdn.net/earbao/article/details/21231795

package Renamer;import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;/*** 获取和判断文件头信息** @author Sud**/
public class GetTypeByHead {/*** 缓存文件头信息-文件头信息*/public static final HashMap<String, String> mFileTypes = new HashMap<>();static {// imagesmFileTypes.put("FFD8FF", "jpg");mFileTypes.put("89504E47", "png");mFileTypes.put("47494638", "gif");mFileTypes.put("49492A00", "tif");mFileTypes.put("424D", "bmp");// else filesmFileTypes.put("41433130", "dwg"); // CADmFileTypes.put("38425053", "psd");mFileTypes.put("7B5C727466", "rtf"); // 日记本mFileTypes.put("3C3F786D6C", "xml");mFileTypes.put("68746D6C3E", "html");mFileTypes.put("44656C69766572792D646174653A", "eml"); // 邮件mFileTypes.put("D0CF11E0", "doc");mFileTypes.put("5374616E64617264204A", "mdb");mFileTypes.put("252150532D41646F6265", "ps");mFileTypes.put("255044462D312E", "pdf");mFileTypes.put("504B0304", "docx");mFileTypes.put("52617221", "rar");mFileTypes.put("57415645", "wav");mFileTypes.put("41564920", "avi");mFileTypes.put("2E524D46", "rm");mFileTypes.put("000001BA", "mpg");mFileTypes.put("000001B3", "mpg");mFileTypes.put("6D6F6F76", "mov");mFileTypes.put("3026B2758E66CF11", "asf");mFileTypes.put("4D546864", "mid");mFileTypes.put("1F8B08", "gz");mFileTypes.put("4D5A9000", "exe/dll");mFileTypes.put("75736167", "txt");}/*** 根据文件路径获取文件头信息,并返回文件类型(扩展名)* @param filePath 文件路径* @return 文件类型(扩展名)*/public static String getFileType(String filePath) {return mFileTypes.get(getFileHeader(filePath));}/*** 根据文件路径获取文件头信息** @param filePath 文件路径* @return 文件头信息*/public static String getFileHeader(String filePath) {FileInputStream fis = null;BufferedInputStream bis = null;String value = null;try {fis = new FileInputStream(filePath);bis = new BufferedInputStream(fis);byte[] b = new byte[4];/** int read() 从此输入流中读取一个数据字节。 int read(byte[] b) 从此输入流中将最多 b.length* 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len)* 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。*/bis.read(b, 0, b.length);value = bytesToHexString(b);} catch (Exception e) {} finally {if (null != bis) {try {bis.close();} catch (IOException e) {}}}return value;}/*** 将要读取文件头信息的文件的byte数组转换成string类型表示** @param src 要读取文件头信息的文件的byte数组* @return 文件头信息*/private static String bytesToHexString(byte[] src) {StringBuilder builder = new StringBuilder();if (src == null || src.length <= 0) {return null;}String hv;for (int i = 0; i < src.length; i++) {// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();if (hv.length() < 2) {builder.append(0);}builder.append(hv);}return builder.toString();}
}

下载地址:

链接: https://pan.baidu.com/s/1I65M2m19KAtm8gUrf82UTA 提取码: bt6c

批量重命名文件 - Renamer JAVA File相关推荐

  1. java文件批量重命名文件,文件批量工具(File Attribute Changer)

    文件批量工具(File Attribute Changer)是一款对文件属性批量修改,以及对文件批量重命名的工具,所 谓的文件属性是指隐藏属性,在查看磁盘文件的名称时,系统一般不会显示具有隐藏属性的文 ...

  2. 如何通过Java批量重命名文件名称

    日常生活中,我们需要大量重命名文件名称时,如果手动一个个修改,太过浪费时间,我们可以通过写一个Java类,简单执行来实现批量重命名文件名称,我们先指定需要需要重命名文件的路径,将所有文件读取出来,循环 ...

  3. 使用java批量重命名文件

    指定一个文件夹,用于批量重命名文件,或者定位到现有的文件夹中都可以. File file = new File();String[] list = file.list();String coonet ...

  4. 五种方法实现Linux批量重命名文件

    Linux批量重命名文件会涉及到改变一个字母.改变一些相连字母.改变某些位置的字母.在最前面加上某些字母.或者改变字母的大小写.完成这里五个方法基本上就会解决了Linux批量重命名的工作. 1.我想把 ...

  5. 几分钟教你批量重命名文件,批量更改数据的方法

    批量更改数据的方法有很多,今天为您介绍的是使用Renamer这款专门为批量重命名文件而设计的一款工具,使用Renamer可以批量重命名文件,还可以批量更改文件的数据,操作简单,可快速地同时更改多个文件 ...

  6. 按数字递增批量重命名文件的批处理

    本文链接:http://oicu.cc.blog.163.com/blog/static/12303947120091163372228/ 原文链接:http://www.newsmth.net/bb ...

  7. C# 批量重命名文件

    前言 有些时候,我们下载了一些听书的MP3文件,或者是一些美剧.网剧,下载下来之后发现这些文件具有一定的规律,比如下图.但是有些时候我们需要修改这些文件的文件名,一个一个文件重命名是非常反人类的,我们 ...

  8. ubuntu批量重命名文件

    使用rename命令批量重命名文件 先看这个例子,将所有.nc文件中的x1替换成x2 rename -n 's/x1/x2/' *.nc # confirm the files you need to ...

  9. R语言——批量重命名文件

    R语言--批量重命名文件 前言 源代码 样例 小结 前言 针对指定文件夹里的文件,并依据参考表批量重命名文件. 提示:以下是本篇文章正文内容,下面案例仅供学习参考 源代码 # 批量重命名文件 # 批量 ...

最新文章

  1. JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念...
  2. linux 强制刷新文件,vim 如何刷新或重载reload 已打开的文件
  3. JDK中没有jre文件夹和tools.jar文件
  4. Java并发——线程中断学习
  5. java控制台输出等腰三角形,并且是倒序正序输出【原创】
  6. notepad++ 配置C/C++环境
  7. Error while waiting for device: The emulator process for AVD Pixel_API_30 has terminated.
  8. 微信机器人 DIY 从 0 到 1
  9. netty(7)--UDP实战
  10. 基于JAVA学生用品交换平台计算机毕业设计源码+系统+数据库+lw文档+部署
  11. 服务器删除安装的系统教程,服务器安装系统教程
  12. 中外历史纲要(上)第一单元梳理(部分)
  13. rap 接口管理 java_GitHub - ClassJava/rap2-delos: 阿里妈妈前端团队出品的开源接口管理工具RAP第二代...
  14. DevOps入门系列--前瞻性--前瞻性思维
  15. 指针的指针、字符串和指针、数组指针(详)
  16. torchserve 错误:RuntimeError: Expected tensor for argument #1 ‘input’ to have the same device as tenso
  17. 夏天快到了,热不热?下雪啦
  18. MFC编程点滴系列4-有多少MFC可以重来
  19. 非线性系统【五】|线性时变系统和线性化,逆定理
  20. 在CentOS7中安装思维脑图软件XMind

热门文章

  1. 卡巴斯基官方论坛送一年免费升级
  2. 【高阶数据结构】手撕红黑树(超详细版本)
  3. 判断平年还是闰年,一个月有多少天,一年的第几天
  4. SPI驱动SD卡多块写介绍
  5. druid password 加密原生使用
  6. 公司要倒闭的6大征兆——集齐任意5个,兑换一次破产清算
  7. 自学开发技术,从入门到入行
  8. STM32串口通信中的USART_RecieveData函数分析
  9. 快消品出海--以目标指导经营
  10. 【自动控制原理仿真实验】 控制系统仿真实验(实验二)