编码背景:
1、网上下载的字体名称一般杂乱无章,对字体收集保存造成了巨大的冗余。
2、字体名称不规范,需要查找某款字体时因名字不匹配导致无法找到该字体。
3、网上很多人推荐使用Font Renamer重命名工具,经测试那是一个重复性工作。
编码环境JDK1.8+:
- 新建一个IFionts的类
/**
* 将多个目录下的字体文件重命名并且拷贝到一个新文件夹
*仅限于ttf||ttc||otf类型
* @param sourcePath
* @param newPath
* @throws IOException
*/
public void copyFolder(String sourcePath, String newPath) throws IOException, FontFormatException {
// mkdirs()如果父文件夹不存在也会创建
new File(newPath).mkdirs();
File fileList = new File(sourcePath);
String[] strName = fileList.list();
//清空源文件夹
//deleteDir(newPath);
//游标
File temp = null;
//字体内英文名
String originalName = null;
//字体内中文名
String familyName = null;
//最终文件名
String newName = null;
for (int i = 0; i < strName.length; i++) {
// 如果源文件路径以分隔符File.separator /或者\结尾那就sourcePath
if (sourcePath.endsWith(File.separator)) {
temp = new File(sourcePath + strName[i]);
} else {
temp = new File(sourcePath + File.separator + strName[i]);
}
if (temp.isFile()) {
// 如果游标遇到文件
FileInputStream in = new FileInputStream(temp);
// 复制且改名
Font f = Font.createFont(Font.TRUETYPE_FONT, temp);
originalName = f.getName().toString();
familyName = f.getFamily().toString();
if (familyName.equals(originalName)){
newName = familyName;
}else{
newName =familyName+"("+originalName+")";
}
File file = new File(newPath + "/" + newName+".ttf");
FileOutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[1024 * 8];
int length;
while ((length = in.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
out.flush();
out.close();
in.close();
}
// 如果游标遇到文件夹
if (temp.isDirectory()) {
copyFolder(sourcePath + "/" + strName[i], newPath + "/" + strName[i]);
}
System.out.println(temp.getName().toString());
}
}
- 对当前文件夹字体文件重命名
/**
* 对当前文件夹字体文件重命名
*仅限于ttf||ttc||otf类型
* @param url
* @throws IOException
*/
public void sort(String url) throws IOException {
File file = new File(url);
File[] list = file.listFiles();
//字体内英文名
String originalName = null;
//字体内中文名
String familyName = null;
//最终文件名
String newName = null;
if (file.exists() && file.isDirectory()) {
for (int i = 0; i < list.length; i++) {
//获取到当前的文件名
String name = list[i].getName();
//获取文件后缀
String fileTyle=name.substring(name.lastIndexOf("."),name.length());
//判断字体类型是否可重命名
if(!(fileTyle.equalsIgnoreCase(".ttf")||fileTyle.equalsIgnoreCase(".ttc")||fileTyle.equalsIgnoreCase("otf"))){
continue;
}
//获取字体相关信息
FileInputStream fileInputStream = new FileInputStream(list[i]);
Font f = null;
try {
f = Font.createFont(Font.TRUETYPE_FONT, fileInputStream);
} catch (FontFormatException e) {
e.printStackTrace();
continue;
}
originalName = f.getName();
familyName = f.getFamily();
fileInputStream.close();
//String forName = name.replaceAll(name,familyName);
String forName = String.valueOf(familyName);
//判断如果中文名与英文名是否相同
if (originalName.equals(familyName)) {
newName = forName;
} else {
newName = forName + "(" + originalName + ")";
}
File dest = new File(url + "/" + newName + ".ttf");
list[i].renameTo(dest);
System.out.println(dest.getName());
}
}
}
- 递归清空当前文件夹方法
/**
* 清空文件夹
* @param path
* @return
*/
public static boolean deleteDir(String path){
File file = new File(path);
//判断是否待删除目录是否存在
if(!file.exists()){
System.err.println("The dir are not exists!");
return false;
}
//取得当前目录下所有文件和文件夹
String[] content = file.list();
for(String name : content){
File temp = new File(path, name);
//判断是否是目录
if(temp.isDirectory()){
//递归调用,删除目录里的内容
deleteDir(temp.getAbsolutePath());
//删除空目录
temp.delete();
}else{
//直接删除文件
if(!temp.delete()){
System.err.println("Failed to delete " + name);
}
}
}
return true;
}
- 将文件夹目录下文件更改为当前文件夹名字
/**
* 将文件夹名字赋值给文件夹下的文件名称
* @param srcFile
*/
public static void getAllFilePath(File srcFile){
//获取给定的File目录下所有的文件或者目录的File数组
File[] fileArray = srcFile.listFiles();
//文件夹名字
String newName= "";
if (fileArray != null) {
for (File file : fileArray) {
//判断该File对象是否是目录
if (file.isDirectory()) {
//是:递归调用
getAllFilePath(file);
//获取文件夹名字
newName = file.getName();
String url = file.getPath();
File file2 = new File(url);
File[] list = file.listFiles();
if (file.exists() && file.isDirectory()) {
for (int i = 0; i < list.length; i++) {
//获取到当前的文件名
String oldName = list[i].getName();
System.out.println(oldName);
//获取文件后缀
String fileTyle=oldName.substring(oldName.lastIndexOf("."),oldName.length());
//将文件夹名字赋值为文件名
oldName = newName;
File dest = new File(url + "/" + newName + fileTyle);
list[i].renameTo(dest);
System.out.println(dest.getName());
}
}
} else {
System.out.println("程序执行完毕");
}
}
}
}
- 调用方法
public static void main(String[] args) throws IOException{
//源文件输入路径
String oldUrl = "E:\\900款字体合集";
//重名名后输出路径
String newFilePath = "P:\\900款字体合集";
//根据给定的路径创建一个File对象
File srcFile = new File("P:\\笔刷");
IFionts iFionts = new IFionts();
//字体重命名
iFionts.sort(oldUrl);
//字体重命名并拷贝
// iFionts.copyFolder(oldUrl, newFilePath);
System.out.println("--------------执行完毕----------------");
}