zoukankan      html  css  js  c++  java
  • 获取文件字符集后转换成指定编码

    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);
    
        }
    }
  • 相关阅读:
    log4j到log4j2升级迁移方案
    WPF InkCanvas 书写毛笔效果
    我是怎么把一个项目带崩的
    Nginx 安装详细(一)
    设计方法小总结
    Node.js event loop 和 JS 浏览器环境下的事件循环的区别
    JavaScript this指向问题
    域名解析问题
    浏览器缓存
    Go项目部署到服务器
  • 原文地址:https://www.cnblogs.com/Yiran583/p/5327920.html
Copyright © 2011-2022 走看看