Java根据文本内容,批量修改文件名称

发布时间 2023-11-05 17:07:10作者: 风来三醒

这两天学到IO流对文件的操作,想起在几年前有几百个按"1,2,3"排序命名的短文,于是产生将其批量命名后整理的想法.

这批文本的名称在文件内第十行的位置,前面的是广告和其他不相关的东西

本想构造抓到第九行广告语后返回下一行文本的方法,没能实现,只好用了更简单直接的直接抓第十行

 1 package mycharset;
 2 
 3 import javax.naming.Name;
 4 import java.io.*;
 5 import java.nio.charset.StandardCharsets;
 6 import java.util.Arrays;
 7 //批量修改文件名
 8 public class CharSetDemo3 {
 9     //.getBytes("GBK"), "UTF-8"
10     public static void main(String[] args) throws IOException {
11         //输入要修改的路径
12         File file = new File("Z:\\AAAA\\TEST");
13         //System.out.println(file.renameTo(newfile));
14         //System.out.println(file.getAbsoluteFile());
15         Rename(file);
16     }
17 
18     //遍历文件夹 修改文件名
19     public static void Rename(File path) throws IOException {
20         File[] files = path.listFiles();
21         for (File file : files) {
22             if(file!=null){
23                 if(file.isFile()){
24                     String name = GetName(file.getAbsolutePath());
25                     File newfile = new File("Z:\\AAAA\\TEST\\"+name);
26                     file.renameTo(newfile);
27                     System.out.println("修改名称为:"+newfile);
28                 }
29             }
30         }
31     }
32 
33     //传入路径的字符串,输出名字字符串
34     public static String GetName(String path) throws IOException {
35         FileReader fr = new FileReader(path);
36         int flag = 0;
37         int len = fr.read();
38         String temp = "";
39         a:
40         while (true) {
41             temp = "";
42             while (len != 10) {
43                 temp += String.valueOf((char) len);
44                 len = fr.read();
45             }
46             //获取名称的规则  得到第十行数据
47             len = fr.read();
48             if (flag++ > 9) {
49                 //System.out.println(temp);
50                 break a;
51             }
52         }
53         //将最后一位回车byte删除后return
54         fr.close();
55         int len1 = temp.getBytes().length - 1;
56         byte[] bytes = temp.getBytes();
57         byte[] bytes1 = new byte[len1];
58         System.arraycopy(bytes, 0, bytes1, 0, len1);
59         String name = new String(bytes1);
60         return name + ".txt";
61     }
62 }
View Code

经过一上午的测试和修改,确实能达成目标,虽然局限性和方法都很差劲,但好歹能跑

其中遇到了两个问题

一是通过GetName方法获取的字符串名称无法在其后添加任何字符,比如抓到了"惊悚乐园",想要在其后加上".txt"变为完整名称,却在拼接后只显示".txt"

第一反应是前面的基础知识不牢靠,String方法用错了,但之后不管用Stringbuffer还是Stringbuild操作都无法成功,测试用创建的其他字符串却没有这种错误

那么只可能是GetName获得的字符串出现了问题,先想到的是编码问题,统一将编码和解码格式全改为UTF-8,还是失败

陷入无措后索性用byte数组提出来看一下抓的到底是什么格式的什么东西,结果在最后看到个"13",合着全被换行符整蛊了

又加了个很低效的代码去将最后换行符去掉,再次运行后,成功

第二个问题是输出后的名称为乱码,原本的文本都是ANSI编码的,感觉应该还是编码和转码的问题,应该再写个批量转换文本编码的方法的

然而并不会写,哈哈

直接去网上下了个批量转码的工具,转成UTF-8后再次运行,成功

 

总体感觉就是在一个残疾人身上不断装劣等义体,最后确实跑起来也实现了目的,但丑陋到自己都不想去读第二遍

而且这才半天过去,再看已经看不懂了

sad