一开始的代码是
BufferedReader br = new BufferedReader(new FileReader(file));
// TODO 解析br.readline();
因为JVM的默认编码是UTF-8,所以在读取UTF-8编码的文件就木有问题。
但是因为我的win是中文版的,新建.txt文件默认格式是ANSI编码,这时候就会出现乱码。
解决方案:
所以必须调用例外一个API
BufferedReader br = new BufferedReader(new FileInputStreamReader(new FileInputStream(file), charset);
即以指定编码读取文件,这里的charset就是指定的编码,UTF-8、GBK等等。
为了适用所有文件编码,必须先动态识别文件的编码格式。具体的识别方式就不在这里讨论了,但是度娘给出的很多方法都不是特别好,
所以我还是用了第三方库cpdetector.jar来识别文件格式,官网链接http://sourceforge.net/projects/cpdetector/
部分源码如下:
CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
detector.add(new ParsingDetector(false));
detector.add(JChardetFacade.getInstance()); // 需要另外一个第三方库jchardet.jar
detector.add(ASCIIDetector.getInstance());
detector.add(UnicodeDetector.getInstance());
java.nio.charset.Charset set = detector.detectCodepage(file.toURI().toURL());
String charsetName = set.name();
// 除了GB开头的编码,其他一律用UTF-8
String charset = charsetName != null && charsetName.startsWith("GB") ? charsetName : "UTF-8";
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));
// TODO 解析reader.readline();
} finally {
reader.close();
}
最后附上jcharset.jar的maven dependency
<dependency>
<groupId>net.sourceforge.jchardet</groupId>
<artifactId>jchardet</artifactId>
<version>1.0</version>
</dependency>