解决Java读取File乱码问题

来源:互联网 发布:在c语言中char型数据 编辑:程序博客网 时间:2024/06/03 13:50

一开始的代码是

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>

0 0