Java自動獲取文件和文件流編碼

在讀取文件時,如果不清楚文件編碼或者在不同的編碼環(huán)境拷貝文件,這時中文數(shù)據(jù)很可能會出現(xiàn)亂碼,參考了博客:http://blog.csdn.net/servermanage/article/details/8595676,有了如下的代碼:
?
/**
 * 檢測文件的編碼和文本流的編碼
 * 參考: http://blog.csdn.net/servermanage/article/details/8595676
 * @author Administrator
 *
 */
public class CpdetectorUtils {
    //獲取文本編碼
    private static final String FILE_ENCODE_TYPE = "file";
    //獲取文件流編碼
    private static final String IO_ENCODE_TYPE = "io";
    /** 
     * 獲取探測到的文件對象
     * 
     * @param path
     *            要判斷文件編碼格式的源文件的路徑
     */
    private  CodepageDetectorProxy getDetector() {
        /*
         * detector是探測器粪小,它把探測任務(wù)交給具體的探測實(shí)現(xiàn)類的實(shí)例完成糕再。
         * cpDetector內(nèi)置了一些常用的探測實(shí)現(xiàn)類,這些探測實(shí)現(xiàn)類的實(shí)例可以通過add方法 加進(jìn)來殴蹄,如ParsingDetector、
         * JChardetFacade袭灯、ASCIIDetector、UnicodeDetector橘茉。
         * detector按照“誰最先返回非空的探測結(jié)果姨丈,就以該結(jié)果為準(zhǔn)”的原則返回探測到的
         * 字符集編碼蟋恬。使用需要用到三個第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
         * cpDetector是基于統(tǒng)計(jì)學(xué)原理的歼争,不保證完全正確沐绒。
         */
        CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
        
        /*
         * ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于
         * 指示是否顯示探測過程的詳細(xì)信息扮超,為false不顯示申眼。
         */
        detector.add(new ParsingDetector(false));
        /*
         * JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼
         * 測定巷蚪。所以濒翻,一般有了這個探測器就可滿足大多數(shù)項(xiàng)目的要求,如果你還不放心淌喻,可以
         * 再多加幾個探測器雀摘,比如下面的ASCIIDetector、UnicodeDetector等涯塔。
         */
        detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
        // ASCIIDetector用于ASCII編碼測定
        detector.add(ASCIIDetector.getInstance());
        // UnicodeDetector用于Unicode家族編碼的測定
        detector.add(UnicodeDetector.getInstance());
        
        return detector;
    }
    
    /**
     * 根據(jù)"encodeType"獲取文本編碼或文件流編碼
     */
    public String getFileOrIOEncode(String path,String encodeType){
        CodepageDetectorProxy detector = getDetector();
        File file = new File(path);
        Charset charset = null;
        try {
            switch (encodeType) {
            case FILE_ENCODE_TYPE:
                charset = detector.detectCodepage(file.toURI().toURL());
                break;
            case IO_ENCODE_TYPE:
                charset = detector.detectCodepage(new BufferedInputStream(new FileInputStream(file)),128);//128表示讀取128字節(jié)來判斷文件流的編碼,讀得越多越精確,但是速度慢
                break;
            default:
                charset = Charset.defaultCharset();
                break;
            }
            
        } catch (IOException e) {
            //這里獲取編碼失敗,使用系統(tǒng)默認(rèn)的編碼
            charset = Charset.defaultCharset();
            System.out.println(e.getMessage());
        }
        return charset.name();
    }
    
    @Test
    public void test(){
        String path = "F:/DevelopmentSoftware/2016-04-18至2016-04-24記錄.txt";
        System.out.println("文件編碼: " + getFileOrIOEncode(path, FILE_ENCODE_TYPE));
        System.out.println("文件流編碼: " + getFileOrIOEncode(path, IO_ENCODE_TYPE));
    }
    
}

?
測試結(jié)果如下:
文件編碼: GB2312
文件流編碼: GB2312
尤其要注意在獲取文件流編碼時,重載方法detector.detectCodepage(new BufferedInputStream(new FileInputStream(file)),128);的第一個參數(shù)必須是包裝的高級流,如果是FileInputStream會包參數(shù)異常錯誤.

?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市诺凡,隨后出現(xiàn)的幾起案子践惑,更是在濱河造成了極大的恐慌,老刑警劉巖真屯,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泵额,居然都是意外死亡携添,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進(jìn)店門羞秤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來左敌,“玉大人,你說我怎么就攤上這事哺哼〉鸱纾” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵茵汰,是天一觀的道長孽鸡。 經(jīng)常有香客問我,道長画侣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮搬泥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尉尾。我一直安慰自己燥透,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布肢藐。 她就那樣靜靜地躺著吆豹,像睡著了一般理盆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衷快,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天坎拐,我揣著相機(jī)與錄音哼勇,去河邊找鬼。 笑死积担,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的先誉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼诈闺,長吁一口氣:“原來是場噩夢啊……” “哼铃芦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仁烹,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤卓缰,失蹤者是張志新(化名)和其女友劉穎砰诵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳍鸵,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尉间,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年哲嘲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片媳禁。...
    茶點(diǎn)故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡眠副,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竣稽,到底是詐尸還是另有隱情囱怕,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布毫别,位于F島的核電站娃弓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏岛宦。R本人自食惡果不足惜台丛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砾肺。 院中可真熱鬧挽霉,春花似錦、人聲如沸侠坎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽实胸。三九已至荣德,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間童芹,已是汗流浹背涮瞻。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留假褪,地道東北人署咽。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像生音,于是被迫代替她去往敵國和親宁否。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,761評論 25 707
  • 在此特此聲明:一下所有鏈接均來自互聯(lián)網(wǎng)缀遍,在此記錄下我的查閱學(xué)習(xí)歷程慕匠,感謝各位原創(chuàng)作者的無私奉獻(xiàn) ! 技術(shù)一點(diǎn)一點(diǎn)積...
    遠(yuǎn)航的移動開發(fā)歷程閱讀 11,087評論 12 197
  • 0參考代碼 藍(lán)牙(BLE)模塊及協(xié)議.pdf:在電腦內(nèi)域醇,有助于理解ble BLE藍(lán)牙在Android開發(fā)中的應(yīng)用 ...
    kamin閱讀 3,431評論 0 20
  • 做一個淡淡的 如夏花般浪漫美麗熱烈的女子 有自己的喜好台谊,有自己的原則,有自己的信仰 不急功近利譬挚,不浮夸輕薄锅铅,做到寵...
    鈺婧Erica閱讀 459評論 0 0
  • 在宿舍吃晚飯的時候,我拿出了電腦减宣,又一次不經(jīng)意的點(diǎn)開了《烏云背后的幸福線》盐须,我以為自己會又一次看幾分鐘就看不下去了...
    安靜凝望閱讀 209評論 0 0