项目编码批量转换工具

来源:互联网 发布:中国联通无线上网 mac 编辑:程序博客网 时间:2024/06/07 05:45

用java实现的项目编码转换:

  • 支持自动检测文件编码
  • 支持指定文件后缀
  • 支持Windows、Linux和Mac系统

    比如:java EncodingTransform D3Xmpp utf-8 .java .xml
    对D3Xmpp目录下的.java 和 .xml文件转换编码为utf-8,其余文件则直接拷贝过去。程序执行完成后,会在D3Xmpp的同级目录生成D3Xmpp.编码转换, 里面包含了完整的转换编码后的项目文件。 以下是代码,其中编码检测用的大神Billows.Van的代码。完整代码链接

import java.io.*;import java.nio.file.*;import java.util.*;import java.net.URL;public class EncodingTransform {    public static void main(String args[]) {        String inputDir;        String outputDir;        String inputEncode;        String outputEncode;        String[] filters = new String[args.length - 2];        if(args.length < 3) {            System.out.println("输入参数错误");            System.out.println("使用方法:");            System.out.println("    javac EncodingTransform.java");            System.out.println("    java EncodingTransform 输入目录 输出文件编码 要转换编码的文件后缀\n    文件后缀为.all时转换全部文件的编码");            System.out.println("比如:");            System.out.println("    java EncodingTransform Test/ utf-8 .all");            System.out.println("    转换Test目录下的所有文件编码为utf-8");            return;        }        //参数判断        inputDir = new File(args[0]).getAbsolutePath();        outputDir = inputDir + ".编码转换";        if(inputDir.endsWith(File.pathSeparator)) {            inputDir = inputDir.substring(0, inputDir.length() - 1);        }        outputEncode = args[1];        for(int i = 2; i < args.length; i++) {            filters[i - 2] = args[i];        }        System.out.println("输入路径:" + inputDir);        System.out.println("输出路径:" + outputDir);        System.out.println("输出文件编码:" + outputEncode);        System.out.println("要过滤的文件:" + Arrays.asList(filters));        transfrom(inputDir, outputDir, outputEncode, filters);    }    /**     *     * 编码转换     * 输入文件, 输出文件,输入文件编码,输出文件编码     */    public static void transfrom(String inputDir, String outputDir, String outputEncode, String[] filters) {        List<File> inputAllFiles = new ArrayList<>();        obtainFiles(new File(inputDir), inputAllFiles);        for(File inputFile : inputAllFiles) {            String outputFilePath = outputDir + inputFile.getPath().substring(inputDir.length());            File outputFile = new File(outputFilePath);            //如果是目录则直接创建            if(inputFile.isDirectory()) {                outputFile.mkdirs();                System.out.println("dir");                continue;            }            //使用EncodingDetect获取输入文件的编码            String inputEncode = EncodingDetect.getJavaEncode(inputFile.getAbsolutePath());            try {                if( filterFile( inputFile.getName(), filters ) ) {                    copy(inputFile, outputFile, inputEncode, outputEncode);                } else {                    //非目标文件直接拷贝                    outputFile.getParentFile().mkdirs();                    outputFile.createNewFile();                    Files.copy(inputFile.toPath(), outputFile.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES);                }            } catch (FileNotFoundException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    }    /**     *     * 检查filename是否以filters数组的某一个字符串元素结尾, 确定该文件是否需要转换编码     *     */    public static boolean filterFile(String filename, String filters[]) {        for(int i = 0; i < filters.length; i++) {            if(filename.endsWith(filters[i])) {                return true;            }        }        return false;    }    /**     *     *获取输入目录的所有文件     *     */    public static void obtainFiles(File inputFile, List<File> list) {        System.out.println(inputFile.getAbsolutePath());        if(inputFile.isFile()) {            list.add(inputFile);            return;        }        if(inputFile.isDirectory()) {            File[] childFiles = inputFile.listFiles();            if(childFiles == null || childFiles.length == 0) {                list.add(inputFile);                return;            }            for(File file : inputFile.listFiles()) {                obtainFiles(file, list);            }        }    }    /**     *     *转换inputFile的编码后保存到outputFile     *     */    public static void copy(File inputFile, File outputFile, String inputEncode, String outputEncode) throws IOException, FileNotFoundException{        InputStreamReader isr = null;        OutputStreamWriter osr = null;        outputFile.getParentFile().mkdirs();        outputFile.createNewFile();        isr = new InputStreamReader(new FileInputStream(inputFile), inputEncode);        osr = new OutputStreamWriter(new FileOutputStream(outputFile), outputEncode);        //每次读取1024字节        int readedLen = 0;        char[] cache = new char[1024];        try {            while((readedLen = isr.read(cache)) != -1) {                osr.write(cache, 0, readedLen);                osr.flush();            }        } finally {            isr.close();            osr.close();        }    }}
0 0