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

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

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

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

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文件),所以使用它判断文件编码的时候,最好处理下得不到编码的情况,比如给个默认编码啥的。

###juniversalchardet的项目地址

  1. googlecode
  2. github

转载于:https://my.oschina.net/u/1010578/blog/393060

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值