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

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 [email protected]
 * @since 2016年3月24日 下午4:43:18
 */
public class ConvertCharacter {

    /**
     * 遍历文件夹,获取文件
     *
     * @author [email protected]
     * @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 [email protected]
     * @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+ "\r\n");
            }
            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 [email protected]
     * @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);

    }
}
时间: 2024-10-13 12:45:09

获取文件字符集后转换成指定编码的相关文章

Linux下将UTF8编码批量转换成GB2312编码的方法

Linux下将UTF8编码批量转换成GB2312编码的方法 在sqlplus中导入UTF8编码的sql脚本就会出现乱码错误,这时就需要将UTF8编码转换成GB2312编码,下面为大家介绍下在Linux下如何进行转换 UTF8编码和GB2312编码是有区别的,在sqlplus中导入UTF8编码的sql脚本就会出现乱码错误,这时就需要将UTF8编码转换 成GB2312编码,可是一个个的转换十分麻烦,下面小编就教你如何在Linux下将UTF8编码批量转换成GB2312编码. 背景 本人在使用oracl

delphi将图片转换成Base64编码函数

{************************************************************************** 名称: BaseImage 参数: fn: TFilename 返回值: string 功能: 将fn文件转换成Base64编码,返回值为编码 **************************************************************************} function BaseImage(fn: str

使用EJS脚本将字符串转换成Base64编码

此博客为9925.org的镜像,登录9925.org可以查看到最新博文. 原文出处:http://ily.so/VVfyim 由于EJS脚本解释器是完美支持 ECMA-262 标准的,因此EJS脚本是JavaScript的真超集. 说了一段废话后,我其实是想说我在网上copy了一段JS支持的将字符串转换成Base64编码的代码,不知出处,这里斗胆将代码贴出,如有侵权请联系删除. var Base64 = {     // 转码表     table : [             'A', 'B

怎么把pdf文件内容都转换成jpg图片

将文档页面的内容转成图片文件也是常遇到的事情,如果只是针对几个页面来说,通过截图就可以实现了,但是往往需要转换的页面内容较多,甚至是将整个文档都转换成为图片.如果需要转换的文档是pdf文件的话,又该如何转为图片呢? 其实不管是比较常见的word.ppt文档,还是pdf这种格式的文件,要转换成图片都可以通过转换工具来进行转换.如果不借助任何工具,那么可以在线pdf转图片. 在线转换是通过相关网页转换应用来操作的.这种方法需要先进入转换应用的主页,选择所需要转换的类型,将pdf转为图片,就点击进入到

借助JCharDet获取文件字符集

前段时间,在学习lucene的时候,遇到了读取txt文档遇到编码错误的问题.学了几个解决方案,大部分是将文件转十六进制(可以使用UE的Ctrl+H来查看),读取开头的四个标志位来判断.可是总有些文本文件无法识别(我遇到的是部分使用UTF-8编码的文件),后来发现了JCharDet.JCharDet是mozilla(就是firefox那家)的编码识别算法的Java实现,算了,这里是官网,自己看吧. 上代码: package com.zhyea.util; import java.io.Buffer

字符串转换成utf-8编码

a.将字符串转换成utf-8编码的字节,并输出,然后将该字节在转换成utf-8编码字符串,在输出 b.将字符串转换后才能gbk编码的字节,并输出,然后将该字节在转换成gbk编码字符串,在输出 def main():     n = "老男孩"     nBytes_utf = n.encode('utf-8')     nStr_utf = nBytes_utf.decode('utf-8')     print(nBytes_utf)     print(nStr_utf)     

python入门:UTF-8转换成GBK编码

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #UTF-8转换成GBK编码 4 #temp(临时雇员,译音:泰坡) 5 #decode(编码,译音:迪口德) 6 #encode(编码,译音:因口德) 7 #原理就是爸UTF-8转换成万国码,再给万国码进行编码转换成GBK,在python 2.x里面这么用 8 """ 9 给变量temp赋值等于'李杰'是UTF-8编码! 10 变量temp_unicode的赋值等于temp

dwg文件怎么打开转换成WMF格式?

dwg文件怎么打开转换成WMF格式?相信大家经常会遇见的问题就是需要将CAD图纸转换成图片格式的操作,但是图片也有很多的格式,需要我们就行选择,今天小编就要来教大家的就是需要将擦的图纸文件转换成图片中的WMF格式的全部操作步骤,希望这可以帮助大家,能够进行采纳! 步骤一:首先需要打开的是你们电脑上面的CAD转换器软件,如果电脑上没有这款软件的小伙伴们就需要去到浏览器上下载安装了,小编在这里使用的就是这款"迅捷CAD转换器"软件!步骤二:将软件完成下载后安装到你们的电脑桌面上然后就可以进

电子书文件如何在线转换成PDF文件

电子书文件如何在线转换成PDF文件,想必很多朋友都喜欢看电子书吧,在如今这个社会,电子书渐渐的要代替纸质书籍了,然而因为PDF文件的各种优点,越来越多的人喜欢将电子书转换成PDF文件进行阅读,今天小编来向大家讲解一下时如何进行在线转换的,步骤如下:步骤一:打开电脑进入浏览器内在百度首页搜索"迅捷PDF在线转换器"找到相对应的页面.(可以提前将电子书文件保存至桌面上) 步骤二:进入到在线的页面后在首页内的导航栏上找到文档转换,并在下拉框内选择"电子书转PDF". 步骤