Java实现字体重命名

编码背景:

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("--------------执行完毕----------------");
    }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值