小工具:批量转换文件夹下的特定类…

本文介绍了一个使用Java编写的工具,用于批量转换指定文件夹内具有特定后缀的文件编码,支持用户自定义源编码和目标编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       网上没找到好的,于是自己用Java写了个小工具。
=======================代码的分割线=============================
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.ArrayList;

public class BatchCharsetConvert {

    static String filePosfix;
    static String nowCharset;
    static String targetCharset;
    static ArrayList<String> succFiles = new ArrayList<String>();
    static ArrayList<String> ignoreFiles = new ArrayList<String>();
    static ArrayList<String> failedFiles = new ArrayList<String>();

    public static void main(String[] args) {
        if (args.length != 4) {
            System.err
                    .println("Usage: java BatchCharsetConvert [文件夹路径] [文件后缀] [当前编码] [目标编码]");
            System.err
                    .println("Example: java BatchCharsetConvert ./project/src .java GBK UTF-8");
            return;
        }
        String dirPath = args[0];
        filePosfix = args[1];
        nowCharset = args[2];
        targetCharset = args[3];
        // 检查Charset
        try {
            Charset.forName(nowCharset);
        } catch (Exception ex) {
            System.err.println("指定的当前编码不正确:" + nowCharset);
            return;
        }
        try {
            Charset.forName(targetCharset);
        } catch (Exception ex) {
            System.err.println("指定的目标编码不正确:" + targetCharset);
            return;
        }
        // 遍历文件夹
        File dir = new File(dirPath);
        if (!dir.isDirectory()) {
            System.err.println("指定的文件夹不正确:" + dirPath);
            return;
        }
        visitAllDirsAndFiles(dir);
        // 打印统计结果
        for (String file : succFiles) {
            System.out.println("转换成功:" + file);
        }
        System.out
                .println("=======================================================");
        for (String file : ignoreFiles) {
            System.out.println("忽略:" + file);
        }
        System.out
                .println("=======================================================");
        for (String file : failedFiles) {
            System.out.println("转换失败:" + file);
        }
        System.out.println("转换成功文件数:" + succFiles.size());
        System.out.println("转换失败文件数:" + failedFiles.size());
        System.out.println("忽略文件数:" + ignoreFiles.size());
    }

    private static void visitAllDirsAndFiles(File file) {
        if (file.isDirectory()) {
            String[] children = file.list();
            for (int i = 0; i < children.length; i++) {
                visitAllDirsAndFiles(new File(file, children[i]));
            }
        } else if (file.isFile()) {
            if (!file.getName().endsWith(filePosfix)) {
                ignoreFiles.add(file.getAbsolutePath());
                return;
            }
            try {
                // 将文件内容读取到内存中
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        new FileInputStream(file), nowCharset));
                StringBuilder sb = new StringBuilder();
                try {
                    String str;
                    while ((str = in.readLine()) != null) {
                        sb.append(str + "\r\n");
                    }
                } finally {
                    if (in != null) {
                        try {
                            in.close();
                        } catch (Exception ex) {
                            // ignore
                        }
                    }
                }
                BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                        new FileOutputStream(file), targetCharset));
                try {
                    out.write(sb.toString());
                } finally {
                    if (out != null) {
                        try {
                            out.close();
                        } catch (Exception ex) {
                            // ignore
                        }
                    }
                }
                succFiles.add(file.getAbsolutePath());
            } catch (Exception ex) {
                failedFiles.add(file.getAbsolutePath());
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值