【java修改文件名称】

											
import org.slf4j.Logger;											
import org.slf4j.LoggerFactory;											
											
import java.io.*;											
import java.text.DecimalFormat;											
import java.text.Format;											
import java.util.*;											
import java.util.stream.Collectors;											
											
											
public class FileNameChangeMain {											
											
    private static Logger logger = LoggerFactory.getLogger(FileNameChangeMain.class);											
											
    public static void main(String[] args){											
											
        if ((args == null) || (args.length != 1)) {											
            logger.error("Illegal argument count error.");											
        }else {											
			// 取参数
            String filePath = args[0];											
            logger.info("Start! filePath:" + filePath);											
													
            try{											
                String originalPath = filePath.substring(0,filePath.lastIndexOf("\\")+1);		
                //创建一个文件类实例,抽象路径名是 targetPath									
                File targetPath = new File( originalPath + "\\out");											
                File errPath = new File( originalPath + "\\error");						
                //判断抽象路径名指定的路径或者文件是否存在					
                if(!targetPath.exists()){											
                    targetPath.mkdir();											
                }else{											
                    int delRet = deleteFile(String .valueOf(targetPath));											
                    if(delRet != 0){											
                        logger.error("delete out file is error.");											
                        return;											
                    }											
                }											
                if(!errPath.exists()){											
                    errPath.mkdir();											
                }else{											
                    int delRet = deleteFile(String .valueOf(errPath));											
                    if(delRet != 0){											
                        logger.error("delete err file is error.");											
                        return;											
                    }											
                }											
                File fileDir = new File(filePath);											
                if(!fileDir.exists()){											
                    logger.error("origin file is error.");											
                }		
                //取路径下的文件list									
                File[] files = fileDir.listFiles();											
                ArrayList<String> fileList = new ArrayList<>();											
											
                for(File originFile : files){											
                    copyFiles(originFile,targetPath,errPath,fileList);											
                }											
            }catch (Exception e){											
                logger.error("file read error. :" + filePath, e);											
            }											
            logger.info("Finish!");											
        }											
    }											
											
    public static void copyFiles(File originFile, File targetPath, File errPath, ArrayList<String> fileList) throws IOException{											
        logger.info("originFile : "+ originFile.getName());											
        String[] originNames = originFile.getName().split("\\.");							
        //String:字符串常量,字符串长度不可变。字符串变量(Synchronized,即线程安全)。
        //如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转成 String 类型,
        //可以调用 StringBuffer 的 toString() 方法。	
        //	使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。
        //所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。		
        StringBuilder  newName = new StringBuilder();											
        String  keyName = "";											
        Format formatName = new DecimalFormat("000");											
        //											
        ArrayList<String> subList = new ArrayList<>();											
        File tagetFile = null;											
        int ret = 0;											
        if(originNames.length > 0){											
            //file name change											
            ret = check(originNames,newName);											
        }											
        if(ret == 0 && !"".equals(newName) ){											
            //查询list中符合条件的元素,对相同名字的文件顺番起名					
            subList = (ArrayList<String>) fileList.stream().filter(v -> v.toString().contains(newName)).collect(Collectors.toList());											
            int maxNum = 0;											
            for(String subName : subList){											
                int subNum = Integer.parseInt(subName.substring(subName.length()-3));											
                if(subNum > maxNum){											
                    maxNum = subNum;											
                }											
            }											
            if(maxNum == 0){											
                keyName = newName + "001";											
            }else {											
                String num = formatName.format(maxNum + 1);											
                keyName = newName + num;											
            }											
            fileList.add(keyName);											
            tagetFile = new File(targetPath,keyName);											
        }else {											
            //error file											
            tagetFile = new File(errPath,originFile.getName());											
        }											
        //创建读入流,从实际存在的文件读数据
        //创建写入流				
        FileInputStream fis = new FileInputStream(originFile);											
        FileOutputStream fos = new FileOutputStream(tagetFile);											
											
        int data;											
        while ((data = fis.read()) != -1) {											
            fos.write(data);											
            fos.flush();											
        }											
        fis.close();											
        fos.close();											
    }											
											
    public static int check(String[] originNames,StringBuilder newName){											
        int ret = 0;											
        switch (originNames.length){											
            case 5:											
                newName.append(originNames[3]);											
                newName.append("_");											
                newName.append(originNames[0]);											
                break;											
            case 7:											
                if("a".equals(originNames[originNames.length -1]) || "s".equals(originNames[originNames.length -1])){											
                    newName.append(originNames[5]);											
                    newName.append("_");											
                    newName.append(originNames[1]);											
                    newName.append(originNames[2]);											
                }else {											
                    logger.error("online filename is Error!");											
                    ret = -1;											
                }											
                break;											
            default:											
                logger.error("File Name Format is Error!");											
                ret = -1;											
                break;											
        }											
											
        return ret;											
    }											
											
    public static int deleteFile(String deletePath){											
        int ret = 0;											
        File file = new File(deletePath);											
        String[] content = file.list();											
        for (String name : content){											
            File temp = new File(deletePath, name);											
            if (temp.isDirectory()) {//判断是否是目录											
                deleteFile(temp.getAbsolutePath());//递归调用,删除目录里的内容											
                temp.delete();//删除空目录											
            } else {											
                if (!temp.delete()) {//直接删除文件											
                    ret = -1;											
                }											
            }											
        }											
        return ret;											
    }											
}											

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值