文件转码

工程项目太多,各工程或各文件编码不统一时,可运行本工具类,把工作目录下,指定类型的文件,转换成指定的编码格式

 

源码:

import info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import info.monitorenter.cpdetector.io.JChardetFacade;

import java.io.BufferedReader;
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;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 文本文件转码
 * @author Howard.He
 */
public class TransFileCoding {

    private static final Logger logger = LoggerFactory.getLogger(TransFileCoding.class);

    public static void main(String[] args) {
        String dirPath = "E:/workspace/";
        String suffix = ".java";
        transformEncoding(dirPath, suffix, "UTF-8");
    }

    /**
     * 文件转码 (文本文件)
     * 
     * @param dirPath
     *            工程路径
     * @param suffix
     *            要转码文件的后缀(.java)
     * @param newEncoding
     *            转换的编码
     */
    public static void transformEncoding(String dirPath, String suffix, String newEncoding) {
        List<File> list = getFileList(null, dirPath, suffix);
        if (null != list && !list.isEmpty()) {
            for (File f : list) {
                String encoding = getFileCharacterEnding(f);
                newEncoding = isEmpty(newEncoding) ? getFileCharacterEnding(f) : newEncoding;
                if (!encoding.equals(newEncoding)) {
                    StringBuilder content = readContent(f, encoding);
                    logger.info("convert file encoding from {} to {}" ,new Object[]{encoding,newEncoding});
                    write(f, content, newEncoding);
                }
                else {
                    logger.debug("srcEncoding({})==dstEncoding({}) skipped f: {}", new Object[] { encoding, newEncoding, f.toString() });
                }
            }
        }
    }

    /**
     * 取文件的编码格式
     * 异常时默认UTF-8
     * 
     * @param file
     * @return
     */
    @SuppressWarnings("deprecation")
    public static String getFileCharacterEnding(File file) {
        String fileCharacterEnding = "UTF-8";
        CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
        detector.add(JChardetFacade.getInstance());
        try {
            Charset charset = detector.detectCodepage(file.toURL());
            if (charset != null)
                fileCharacterEnding = charset.name();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return fileCharacterEnding;
    }

    /**
     * 获取指定路径下的特定类型的文件集
     * 
     * @param list
     * @param dirPath
     * @param suffix
     * @return
     */
    public static List<File> getFileList(List<File> list, String dirPath, String suffix) {
        File dir = new File(dirPath);
        if (dir.exists()) {
            File[] files = dir.listFiles();
            if (null == list)
                list = new ArrayList<File>();
            for (File f : files) {
                String name = f.getName();
                if (f.isDirectory() && !name.equals(".svn"))
                    getFileList(list, f.getPath(), suffix);
                else if (f.isFile() && name.endsWith(suffix))
                    list.add(f);
            }
        }
        return list;
    }

    public static StringBuilder readContent(File f, String encoding) {
        return readContent(f, encoding, "\n");
    }

    /**
     * 读取文件内容
     * 
     * @param f
     * @param encoding
     * @return
     */
    public static StringBuilder readContent(File f, String encoding, String enter) {
        StringBuilder builder = new StringBuilder();
        try {
            encoding = encoding == null ? getFileCharacterEnding(f) : encoding;
            String data = null;
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f), encoding));
            while ((data = br.readLine()) != null) {
                builder.append(isEmpty(enter) ? data : data + enter);
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return builder;
    }

    /**
     * 写入文件内容
     * 
     * @param f
     * @param content
     * @param newEncoding
     */
    private static void write(File f, StringBuilder content, String newEncoding) {
        try {
            logger.debug("write file:{}",f);
            logger.debug(content.toString());
            OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(f), newEncoding);
            writer.write(content.toString());
            writer.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static boolean isEmpty(String str) {
        return null == str || "".equals(str);
    }
}

 

取文件编码格式,依赖cpdetector ,可到 http://cpdetector.sourceforge.net/  下载lib包

使用maven时,直接添加依赖信息:

 

  <dependency>
   <groupId>org.mozilla.intl</groupId>
   <artifactId>chardet</artifactId>
   <version>1.4.2</version>
   <scope>test</scope>
  </dependency>
  <dependency>
   <groupId>info.monitorenter</groupId>
   <artifactId>cpdetector</artifactId>
   <version>1.0.7</version>
   <scope>test</scope>
  </dependency>

  

你可能感兴趣的:(文件)