获取文件字符集后转换成指定编码

package com.jiaotd.file;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

/**
 * @author jiaotd@asiainfo.com
 * @since 2016年3月24日 下午4:43:18
 */
public class ConvertCharacter {

    /**
     * 遍历文件夹,获取文件
     * 
     * @author jiaotd@asiainfo.com
     * @since 2016年3月24日 下午4:49:09
     * @param file
     * @throws Exception
     */
    public static void checkout(File file) throws Exception {
        if (file.exists()) {
            if (file.isDirectory()) {
                if(!file.getName().startsWith(".svn")){
                    File[] listFiles = file.listFiles();
                    for (File subfile : listFiles) {
                        if (subfile.isFile()) {
                            // 进行文件操作
                            convertCharacter(subfile);
                        } else if (subfile.isDirectory()) {
                            checkout(subfile);
                        }
                    }
                }
            } else {
                convertCharacter(file);
            }
        }
    }

    /**
     * 转换字符编码
     * 
     * @author jiaotd@asiainfo.com
     * @since 2016年3月24日 下午4:49:53
     * @param file
     * @throws IOException
     */
    public static void convertCharacter(File file) throws IOException {
        if(file.getName().endsWith(".gif") || file.getName().endsWith(".jpg") || file.getName().endsWith(".class") 
                || file.getName().endsWith(".png") || file.getName().endsWith(".jar") || file.getName().endsWith(".xml")
                || file.getName().endsWith(".properties") || file.getName().endsWith(".jsp") ){
            return;
        }
        // 文件为空时,Files.move会报错
        if (file.length() > 0) {
            String chartset = getFilecharset(file);
            if("GBK".equals(chartset)){
                return;
            }
            InputStreamReader isr = new InputStreamReader(new FileInputStream(file), chartset);// 获取文件格式
            BufferedReader reader = new BufferedReader(isr);

            File out = new File(file.getAbsolutePath() + ".bak");
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(out), "GBK");
            BufferedWriter bw = new BufferedWriter(osw);

            String s = "";
            while ((s = reader.readLine()) != null) {
                osw.write(s+ "
");
            }
            bw.close();
            osw.close();
            reader.close();
            isr.close();
            // StandardCopyOption.ATOMIC_MOVE 将本操作标记为原子性操作,要么完成移动,要么源文件保持原来位置
            Files.move(out.toPath(), file.toPath(),    StandardCopyOption.ATOMIC_MOVE);
            System.out.println(out.getName());
        }
    }

    /**
     * 获取文件编码
     * @author jiaotd@asiainfo.com
     * @since 2016年3月24日 下午6:01:44
     * @param sourceFile
     * @return
     */
    public static String getFilecharset(File sourceFile) {
        String charset = "GBK";
        byte[] first3Bytes = new byte[3];
        BufferedInputStream bis = null; 
        try {
            boolean checked = false;
            bis = new BufferedInputStream(new FileInputStream(sourceFile));
            bis.mark(0);
            int read = bis.read(first3Bytes, 0, 3);
            if (read == -1) {
                return charset; // 文件编码为 ANSI
            } else if (first3Bytes[0] == (byte) 0xFF
                    && first3Bytes[1] == (byte) 0xFE) {
                charset = "UTF-16LE"; // 文件编码为 Unicode
                checked = true;
            } else if (first3Bytes[0] == (byte) 0xFE
                    && first3Bytes[1] == (byte) 0xFF) {
                charset = "UTF-16BE"; // 文件编码为 Unicode big endian
                checked = true;
            } else if (first3Bytes[0] == (byte) 0xEF
                    && first3Bytes[1] == (byte) 0xBB
                    && first3Bytes[2] == (byte) 0xBF) {
                charset = "UTF-8"; // 文件编码为 UTF-8
                checked = true;
            }
            bis.reset();
            if (!checked) {
                while ((read = bis.read()) != -1) {
                    if (read >= 0xF0)
                        break;
                    if (0x80 <= read && read <= 0xBF) // 单独出现BF以下的,也算是GBK
                        break;
                    if (0xC0 <= read && read <= 0xDF) {
                        read = bis.read();
                        if (0x80 <= read && read <= 0xBF) // 双字节 (0xC0 - 0xDF)
                            // (0x80
                            // - 0xBF),也可能在GB编码内
                            continue;
                        else
                            break;
                    } else if (0xE0 <= read && read <= 0xEF) {// 也有可能出错,但是几率较小
                        read = bis.read();
                        if (0x80 <= read && read <= 0xBF) {
                            read = bis.read();
                            if (0x80 <= read && read <= 0xBF) {
                                charset = "UTF-8";
                                break;
                            } else
                                break;
                        } else
                            break;
                    }
                }
            }
            bis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(null != bis){
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return charset;
    }

    public static void main(String[] args) throws Exception {
//        File file = new File("F:/WorkSpace/MyEclipse/asiainfo/ol_java/");
         File file = new File("F:/MyProject/HttpUtil.java");
        checkout(file);
        // convertCharacter(file);

    }
}
原文地址:https://www.cnblogs.com/Yiran583/p/5327920.html