如何判断java.io.File所读取的文件编码

如何判断java.io.File所读取的文件编码

###问题 java中涉及到文件读取,就常常要考虑文件编码问题。虽然程序中通常都指定UTF-8编码,可是用户总可能提交各类编码的文件(特别是windows下用户),若是对这些文件不作判断就直接按照UTF-8的方式读取的话,是确定会乱码的。java

###解决方案 java原生并不支持文件编码的判断,通常都是read文件的前几个字节来判断,须要本身编写工具类,判断的编码类型也比较少。最近找到了个开源的项目juniversalchardet,能比较优雅的完成这个任务。 使用方法也很简单,下载它的jar包,按照官网的例子操做便可,固然这段代码本身封装成工具类最好了:git

import org.mozilla.universalchardet.UniversalDetector;
 
public class TestDetector {
  public static void main(String[] args) throws java.io.IOException {
    byte[] buf = new byte[4096];
    String fileName = args[0];
    java.io.FileInputStream fis = new java.io.FileInputStream(fileName);
 
    // (1)
    UniversalDetector detector = new UniversalDetector(null);
 
    // (2)
    int nread;
    while ((nread = fis.read(buf)) > 0 && !detector.isDone()) {
      detector.handleData(buf, 0, nread);
    }
    // (3)
    detector.dataEnd();
 
    // (4)
    String encoding = detector.getDetectedCharset();
    if (encoding != null) {
      System.out.println("Detected encoding = " + encoding);
    } else {
      System.out.println("No encoding detected.");
    }
 
    // (5)
    detector.reset();
  }
}

我本身写成工具类测试的时候,发现有些文件仍是不能判断出来(好比excel保存过的gbk编码的.csv文件),因此使用它判断文件编码的时候,最好处理下得不到编码的状况,好比给个默认编码啥的。github

###juniversalchardet的项目地址windows

  1. googlecode
  2. github
相关文章
相关标签/搜索