最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java如何獲取文件編碼格式

 更新時間:2017年01月11日 11:54:03   作者:Java開發(fā)-擱淺  
這篇文章主要介紹了詳解Java如何獲取文件編碼格式,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

1:簡單判斷是UTF-8或不是UTF-8,因為一般除了UTF-8之外就是GBK,所以就設(shè)置默認(rèn)為GBK。

按照給定的字符集存儲文件時,在文件的最開頭的三個字節(jié)中就有可能存儲著編碼信息,所以,基本的原理就是只要讀出文件前三個字節(jié),判定這些字節(jié)的值,就可以得知其編碼的格式。其實,如果項目運行的平臺就是中文操作系統(tǒng),如果這些文本文件在項目內(nèi)產(chǎn)生,即開發(fā)人員可以控制文本的編碼格式,只要判定兩種常見的編碼就可以了:GBK和UTF-8。由于中文Windows默認(rèn)的編碼是GBK,所以一般只要判定UTF-8編碼格式。

對于UTF-8編碼格式的文本文件,其前3個字節(jié)的值就是-17、-69、-65,所以,判定是否是UTF-8編碼格式的代碼片段如下:

File file = new File(path); 
InputStream in= new java.io.FileInputStream(file); 
byte[] b = new byte[3]; 
in.read(b); 
in.close(); 
if (b[0] == -17 && b[1] == -69 && b[2] == -65) 
 System.out.println(file.getName() + ":編碼為UTF-8"); 
else 
 System.out.println(file.getName() + ":可能是GBK,也可能是其他編碼"); 

2:若想實現(xiàn)更復(fù)雜的文件編碼檢測,可以使用一個開源項目cpdetector,它所在的網(wǎng)址是:http://cpdetector.sourceforge.net/。它的類庫很小,只有500K左右,cpDetector是基于統(tǒng)計學(xué)原理的,不保證完全正確,利用該類庫判定文本文件的代碼如下:

讀外部文件(先利用cpdetector檢測文件的編碼格式,然后用檢測到的編碼方式去讀文件):

/** 
 * 利用第三方開源包cpdetector獲取文件編碼格式 
 * 
 * @param path 
 *   要判斷文件編碼格式的源文件的路徑 
 * @author huanglei 
 * @version 2012-7-12 14:05 
 */ 
public static String getFileEncode(String path) { 
 /* 
  * detector是探測器,它把探測任務(wù)交給具體的探測實現(xiàn)類的實例完成。 
  * cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法 加進(jìn)來,如ParsingDetector、 
  * JChardetFacade、ASCIIDetector、UnicodeDetector。 
  * detector按照“誰最先返回非空的探測結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測到的 
  * 字符集編碼。使用需要用到三個第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar 
  * cpDetector是基于統(tǒng)計學(xué)原理的,不保證完全正確。 
  */ 
 CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance(); 
 /* 
  * ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于 
  * 指示是否顯示探測過程的詳細(xì)信息,為false不顯示。 
  */ 
 detector.add(new ParsingDetector(false)); 
 /* 
  * JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼 
  * 測定。所以,一般有了這個探測器就可滿足大多數(shù)項目的要求,如果你還不放心,可以 
  * 再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。 
  */ 
 detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar 
 // ASCIIDetector用于ASCII編碼測定 
 detector.add(ASCIIDetector.getInstance()); 
 // UnicodeDetector用于Unicode家族編碼的測定 
 detector.add(UnicodeDetector.getInstance()); 
 java.nio.charset.Charset charset = null; 
 File f = new File(path); 
 try { 
  charset = detector.detectCodepage(f.toURI().toURL()); 
 } catch (Exception ex) { 
  ex.printStackTrace(); 
 } 
 if (charset != null) 
  return charset.name(); 
 else 
  return null; 
} 

String charsetName = getFileEncode(configFilePath); 
System.out.println(charsetName); 
inputStream = new FileInputStream(configFile); 
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, charsetName));

讀jar包內(nèi)部資源文件(先利用cpdetector檢測jar內(nèi)部的資源文件的編碼格式,然后以檢測到的編碼方式去讀文件):

/** 
 * 利用第三方開源包cpdetector獲取URL對應(yīng)的文件編碼 
 * 
 * @param path 
 *   要判斷文件編碼格式的源文件的URL 
 * @author huanglei 
 * @version 2012-7-12 14:05 
 */ 
public static String getFileEncode(URL url) { 
 /* 
  * detector是探測器,它把探測任務(wù)交給具體的探測實現(xiàn)類的實例完成。 
  * cpDetector內(nèi)置了一些常用的探測實現(xiàn)類,這些探測實現(xiàn)類的實例可以通過add方法 加進(jìn)來,如ParsingDetector、 
  * JChardetFacade、ASCIIDetector、UnicodeDetector。 
  * detector按照“誰最先返回非空的探測結(jié)果,就以該結(jié)果為準(zhǔn)”的原則返回探測到的 
  * 字符集編碼。使用需要用到三個第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar 
  * cpDetector是基于統(tǒng)計學(xué)原理的,不保證完全正確。 
  */ 
 CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance(); 
 /* 
  * ParsingDetector可用于檢查HTML、XML等文件或字符流的編碼,構(gòu)造方法中的參數(shù)用于 
  * 指示是否顯示探測過程的詳細(xì)信息,為false不顯示。 
  */ 
 detector.add(new ParsingDetector(false)); 
 /* 
  * JChardetFacade封裝了由Mozilla組織提供的JChardet,它可以完成大多數(shù)文件的編碼 
  * 測定。所以,一般有了這個探測器就可滿足大多數(shù)項目的要求,如果你還不放心,可以 
  * 再多加幾個探測器,比如下面的ASCIIDetector、UnicodeDetector等。 
  */ 
 detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar 
 // ASCIIDetector用于ASCII編碼測定 
 detector.add(ASCIIDetector.getInstance()); 
 // UnicodeDetector用于Unicode家族編碼的測定 
 detector.add(UnicodeDetector.getInstance()); 
 java.nio.charset.Charset charset = null; 
 try { 
  charset = detector.detectCodepage(url); 
 } catch (Exception ex) { 
  ex.printStackTrace(); 
 } 
 if (charset != null) 
  return charset.name(); 
 else 
  return null; 
} 
URL url = CreateStationTreeModel.class.getResource("/resource/" + "配置文件"); 
URLConnection urlConnection = url.openConnection(); 
inputStream=urlConnection.getInputStream(); 
String charsetName = getFileEncode(url); 
System.out.println(charsetName); 
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, charsetName)); 

3:探測任意輸入的文本流的編碼,方法是調(diào)用其重載形式:

charset=detector.detectCodepage(待測的文本輸入流,測量該流所需的讀入字節(jié)數(shù)); 

上面的字節(jié)數(shù)由程序員指定,字節(jié)數(shù)越多,判定越準(zhǔn)確,當(dāng)然時間也花得越長。要注意,字節(jié)數(shù)的指定不能超過文本流的最大長度。

4:判定文件編碼的具體應(yīng)用舉例:

屬性文件(.properties)是Java程序中的常用文本存儲方式,象STRUTS框架就是利用屬性文件存儲程序中的字符串資源。它的內(nèi)容如下所示:

#注釋語句

屬性名=屬性值

讀入屬性文件的一般方法是:

FileInputStream ios=new FileInputStream(“屬性文件名”); 
Properties prop=new Properties(); 
prop.load(ios); 
String value=prop.getProperty(“屬性名”); 
ios.close(); 

 利用java.io.Properties的load方法讀入屬性文件雖然方便,但如果屬性文件中有中文,在讀入之后就會發(fā)現(xiàn)出現(xiàn)亂碼現(xiàn)象。發(fā)生這個原因是load方法使用字節(jié)流讀入文本,在讀入后需要將字節(jié)流編碼成為字符串,而它使用的編碼是“iso-8859-1”,這個字符集是ASCII碼字符集,不支持中文編碼,

方法一:使用顯式的轉(zhuǎn)碼:

String value=prop.getProperty(“屬性名”); 
String encValue=new String(value.getBytes(“iso-8859-1″),”屬性文件的實際編碼”); 

方法二:象這種屬性文件是項目內(nèi)部的,我們可以控制屬性文件的編碼格式,比如約定采用Windows內(nèi)定的GBK,就直接利用”gbk”來轉(zhuǎn)碼,     如果約定采用UTF-8,就使用”UTF-8″直接轉(zhuǎn)碼。

方法三:如果想靈活一些,做到自動探測編碼,就可利用上面介紹的方法測定屬性文件的編碼,從而方便開發(fā)人員的工作

補充:可以用下面代碼獲得Java支持編碼集合:

Charset.availableCharsets().keySet();

可以用下面的代碼獲得系統(tǒng)默認(rèn)編碼:

Charset.defaultCharset();

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java -jar后臺啟動的四種方式小結(jié)

    java -jar后臺啟動的四種方式小結(jié)

    這篇文章主要介紹了java -jar后臺啟動的四種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java泛型繼承原理與用法詳解

    Java泛型繼承原理與用法詳解

    這篇文章主要介紹了Java泛型繼承原理與用法,結(jié)合實例形式分析了java泛型繼承的相關(guān)原理與實現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • 淺談JVM垃圾回收之哪些對象可以被回收

    淺談JVM垃圾回收之哪些對象可以被回收

    這篇文章主要介紹了JVM垃圾回收之哪些對象可以被回收,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • IDEA GIT 忽略文件的最佳方式推薦

    IDEA GIT 忽略文件的最佳方式推薦

    這篇文章主要介紹了IDEA GIT 忽略文件的最佳方式推薦,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • SpringBoot和Vue實現(xiàn)動態(tài)二維碼的示例代碼

    SpringBoot和Vue實現(xiàn)動態(tài)二維碼的示例代碼

    二維碼在現(xiàn)代社交和營銷活動中被廣泛使用,本文主要介紹了SpringBoot和Vue實現(xiàn)動態(tài)二維碼的示例代碼,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • SpringBoot + openFeign實現(xiàn)遠(yuǎn)程接口調(diào)用的過程

    SpringBoot + openFeign實現(xiàn)遠(yuǎn)程接口調(diào)用的過程

    現(xiàn)在的微服務(wù)項目不少都使用的是springboot+spring cloud構(gòu)建的項目,微服務(wù)之間的調(diào)用都離不開feign來進(jìn)行遠(yuǎn)程調(diào)用,這篇文章主要介紹了SpringBoot + openFeign實現(xiàn)遠(yuǎn)程接口調(diào)用,需要的朋友可以參考下
    2022-11-11
  • 最新IntelliJ IDEA 2020版本的安裝教程詳解

    最新IntelliJ IDEA 2020版本的安裝教程詳解

    這篇文章主要介紹了最新IntelliJ IDEA 2020版本的安裝教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • 使用Scala生成隨機數(shù)的方法示例

    使用Scala生成隨機數(shù)的方法示例

    這篇文章主要介紹了使用Scala生成隨機數(shù)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 利用數(shù)組實現(xiàn)棧(Java實現(xiàn))

    利用數(shù)組實現(xiàn)棧(Java實現(xiàn))

    這篇文章主要為大家詳細(xì)介紹了利用數(shù)組實現(xiàn)棧,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java的Cglib動態(tài)代理實現(xiàn)方式詳解

    Java的Cglib動態(tài)代理實現(xiàn)方式詳解

    這篇文章主要介紹了Java的Cglib動態(tài)代理實現(xiàn)方式詳解,CGLIB是強大的、高性能的代碼生成庫,被廣泛應(yīng)用于AOP框架,它底層使用ASM來操作字節(jié)碼生成新的類,為對象引入間接級別,以控制對象的訪問,需要的朋友可以參考下
    2023-11-11

最新評論

土默特左旗| 贵阳市| 宝坻区| 丹寨县| 余江县| 睢宁县| 巢湖市| 贺州市| 楚雄市| 洛南县| 华亭县| 湖南省| 肃南| 兴文县| 景泰县| 乌海市| 余庆县| 南城县| 南汇区| 肃北| 赤水市| 江都市| 罗江县| 佳木斯市| 报价| 霍林郭勒市| 和平区| 丹巴县| 靖江市| 黔西县| 新和县| 繁峙县| 峨眉山市| 于都县| 大竹县| 南郑县| 浦江县| 新邵县| 江北区| 师宗县| 崇明县|