如何判断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的项目地址
时间: 2024-10-08 17:22:25