遇到问题,解决问题,然后就是要总结问题,所以有了这篇小白级的技术分享。
- 场景:做IM聊天时会用到表情库,想引入别人的表情库,又不想改动自己已有的表情文件名称,所以需要把别人的几十张或上百张文件按照自己的需要重命名。
- 坑:第一想法,小脚本,遍历重命名,做法是java程序,如下:
public static void main(String[] args) {
//想命名的原文件的路径
File file = new File("D:/temp/drawable-hdpi");//D:\temp\drawable-hdpi
for (int i = 0;i<file.listFiles().length;i++){
File file2 = file.listFiles()[i];
file2.renameTo(new File("D:/temp/emoji/"+i+".gif"));
}
System.out.println("over");
}
- 解读:原文件所在目录D:\temp\drawable-hdpi,目标文件所在目录D:\temp\emoji,通过listFiles()得到要修改的所有文件,for循环遍历,每个文件通过renameTo方法,将文件名修改为“数字.gif”
- 结果:原文件共有106个,执行完后,目标文件夹下有53个,原文件夹下有53个。
- 分析:苦思冥想、绞尽脑汁……renameTo方法会移动文件,所以每重命名一个文件,原文件夹就少一个文件,listFiles().length就改变一次,同时listFiles()里的文件顺序会往前挪动一个顺序,如果在for循环中加上日志,就会看到,重命名成功的文件都是隔一个隔一个的。
so,原因找到了,for循环的问题(只是不适用于renameTo方法的情况下)
解决:
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("hello world!");
File file = new File("D:/temp/drawable-hdpi");//D:\temp\drawable-hdpi
System.out.println("before num=:"+file.listFiles().length);
// int num = file.listFiles().length;
int i = 0;
for (File file2:file.listFiles()){
System.out.println("第:"+i+"次循环");
// File file2 = file.listFiles()[i];
System.out.println("file:"+file2.getName());
file2.renameTo(new File("D:/temp/emoji/"+i+".gif"));
System.out.println("rename to:"+i+".gif");
i++;
}
System.out.println("end");
}
执行,OK,完美的批量修改成功!
- 举一反三:其他批量操作,for循环遍历场景下的操作。