###问题 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