Java批量修改文件名称(十四)

一.批量修改文件名称


在生活和工作中,常常会遇到批量修改文件名称的工作, 如两个不同的系统进行合并,如C1和C2, 以前都叫C1,现在要将其中的一个C1开头全部改成C2开头, 即 文件名称字符串替换性质的修改名称。 也有以前的文件名称都是乱写的,各个文件名称之间没有意义,统一改成以什么Xxx开头,后面加上数字1,2,3 类型的修改,或者是 副本_(数字)的形式。 数字也有用时间戳替换的,属于批量改变文件不重复性质的。


修改文件名称,主要是运行 java.io.File 类里面的 renameTo() 方法。 主要原理是,递归遍历目录下的所有的文件,将文件的名称进行替换。


老蝴蝶刚接触批量修改文件的时候,就是将C1 批量修改成C2的形式。


二. 将C1 命名成 C2 形式的批量修改。


传入的参数是 路径名 原先的名 要替换的新名。


采用 args[] 的形式进行接收,可以直接通过控制台 进行操作。


import java.io.File;
public class FileRename {
    public static void main(String[] args) {
        if(args.length!=3){
            System.out.println("请按照路径  修改前的名字  修改后的名字  的格式输入");
            return ;
        }
        File path=new File(args[0]);
        //要支持路径和文件两种方式。
        if(!path.exists()){
            System.out.println("输入文件路径有误");
            return ;
        }
        renameFile(path,args[1],args[2]);
        
        System.out.println("重命名文件成功");
    }
    public static void renameFile(File file,String old_name,String new_name){
        if(file.isFile()){
            //是文件。
            //取出文件的绝对路径。
            String filePath=file.getAbsolutePath();
            //取出文件的名称。
            String fileName=file.getName();
            //计算出索引的值。
            int index=filePath.indexOf(fileName);
            if(fileName.indexOf(old_name)>=0){
                int index2=fileName.indexOf(old_name); 
                //进行替换。 newName为替换后的新的名称。
                String newName=fileName.replace(old_name,new_name);
                String newPath=filePath.substring(0,index)+fileName.substring(0,index2)+newName+fileName.substring(index2+fileName.length());
                file.renameTo(new File(newPath));
            }
        }else if(file.isDirectory()){ //是目录的话
            //将目录名也进行修改。
            /*  String directName=file.getName(); //取出目录的名字。
            if(directName.indexOf(old_name)>=0){  //在过程中,如果修改目录名称的话,需要进行处理。
                
            }*/
            File fileNames[]=file.listFiles();
            if(fileNames!=null&&fileNames.length>0){
                for(File f:fileNames){
                    renameFile(f,old_name,new_name);
                }
            }
            
        }
    }
}


三. 统一命名成 前缀+数字的形式。


每个数字默认从1开始,各个目录下依次进行增加。


按照 路径 前缀 后缀 三个参数进行输入。 其中,后缀可以省略,如果是省略,则默认为"".


import java.io.File;
public class FileRename {
    public static void main(String[] args) {
        
        String suffix="";
        if(args.length!=3&&args.length!=2){
            System.out.println("请按照路径  文件前缀  文件后缀(可省略) 的格式输入");
            return ;
        }
        if(args.length==3){
            suffix=args[2];  //如果为2,默认就是空格。
        }
        
        File path=new File(args[0]);
        //要支持路径和文件两种方式。
        if(!path.exists()){
            System.out.println("输入文件路径有误");
            return ;
        }
        renameFile(path,args[1],1,suffix);
        
        System.out.println("重命名文件成功");
    }
    public static void renameFile(File file,String prefix,int num,String suffix){
        if(file.isFile()){
            //是文件。
            //取出文件的绝对路径。
            String filePath=file.getAbsolutePath();
            //取出文件的名称。
            String fileName=file.getName();
            //计算出索引的值。
            int index=filePath.indexOf(fileName);
            //获取文件的类型。
            String type=fileName.substring(fileName.lastIndexOf("."));
            String newPath=filePath.substring(0,index)+prefix+num+suffix+type;
            file.renameTo(new File(newPath));
            
        }else if(file.isDirectory()){ //是目录的话
            int startNum=0;  //是目录的话,就重置成0.
            File fileNames[]=file.listFiles();
            if(fileNames!=null&&fileNames.length>0){
                for(File f:fileNames){
                    startNum++;
                    renameFile(f,prefix,startNum,suffix);
                }
            }
            
        }
    }
}


修改的只是名称,暂时不支持修改文件的类型。 批量修改文件的类型,老蝴蝶在后面会说。


谢谢!!!

上一篇:.NET设计模式-迭代器模式(Iterator Pattern)


下一篇:教你使用File类批量修改文件名称 | 带你学《Java语言高级特性》之五十