Teleport文件名乱码怎么办?我是程序员啊!
#说在前面
可能很多人还不知道Teleport是什么东西.其实就是个全站下载工具,能够将一些网站完整的克隆到本地存根.
因为本人有逛别人自建博客的习惯,当发现一些技术大神的干货的时候忍不住自己在本地留存一份.
但是久而久之发现一篇篇的保存也不是长久之计.
作为一个懒惰的程序员,我就开始各种问度娘,在度娘的建议下,我使用了Teleport作为我的"打手".
但是这个打手有个毛病,就是下载下来的文件名称中如果有中文,就会乱码,造成本地访问的时候链接不到对应的网页,十分的烦人.,
正当我到处百度方法的时候,我找到了一位老哥的博文
附上链接-解决teleport 下载的中文文件名乱码
这个老哥的思路是用php去转换文件编码(据他描述是因为windows下是gbk编码,而Teleport下载下来的文件名是utf8导致).
这时候,本来我可以直接使用它的代码,但是为了打破"php是世界上最好的语言"这个定论,我准备按照这个思路写个Java版的.
闲话就不多说了,撸起袖子开干!
#我的思路
简单说下我的思路,先写绝对路径,把绝对路径下的文件夹递归调用出来(因为不知道有多少层文件夹),遍历每个文件夹下的文件,将编码从utf8转换到gbk.
完工!
#代码实现
/*
* @author Laolata
* @description 编码转换工具,支持将文件夹下的任意格式编码转化为指定格式
* @blog 我的博客地址 https://blog.csdn.net/itkfdektxa
* */
public class ConvertEncoding {
/*定义转换后的编码格式*/
private final static String targetCharset = "GBK";
/*定义转换计数器*/
private static int count = 0;
/*
* @description 递归方法,递归指定目录下所有文件夹与文件,并重命名
* @param originFile 递归文件或目录
* */
public static void renameFiles(File originFile) throws UnsupportedEncodingException {
//递归出口
if(originFile.isFile()){
//对文件进行重命名
byte[] newName = originFile.getName().getBytes(targetCharset);
//将字节码转换为String
String newNameStr = new String(newName);
//创建新的完整路径
String newPath = originFile.getParent()+File.separator+newNameStr;
//重命名
originFile.renameTo(new File(newPath));
//计数器加一
count++;
}else{
//文件夹递归调用自身
File[] files = originFile.listFiles();
for(File f:files){
renameFiles(f);
}
}
}
/*
* @description 测试方法
* */
public static void main(String[] args) throws UnsupportedEncodingException {
File file = new File("需要转换的文件夹路径");
System.out.println("开始调用");
renameFiles(file);
System.out.println("重命名完成,共重命名了"+count+"个文件");
}
}
#运行效果
运行前:
运行后:
大功告成!