日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java处理文件BOM头的方式推荐

發(fā)布時間:2023/12/13 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java处理文件BOM头的方式推荐 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景:

java普通的文件讀取方式對于bom是無法正常識別的。

? ?使用普通的InputStreamReader,如果采用的編碼正確,那么可以獲得正確的字符,但bom仍然附帶在結(jié)果中,很容易導致數(shù)據(jù)處理出錯。
另外,對于存在BOM頭的文件,無法猜測它使用的編碼。

目標:

實現(xiàn)一種方式,可對BOM頭進行捕捉和過濾

?

解決方案有二:

一、 ?使用apache的工具類,以BOMStream為例:

? ? BOMStream,api參考:http://commons.apache.org/io/apidocs/org/apache/commons/io/input/BOMInputStream.html

? ?該類的構(gòu)造方式:
? ?BOMInputStream bomIn = new BOMInputStream(in) //僅能檢測到UTF8的bom,且在流中exclude掉bom
? ?
? ?BOMInputStream bomIn = new BOMInputStream(in, include); //同上,且指定是否包含

???也可以指定檢測多種編碼的bom,但目前僅支持UTF-8/UTF-16LE/UTF-16BE三種,對于UTF32之類不支持。
? ?BOMInputStream bomIn = new BOMInputStream(in, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE);
? ?
? ?有用的方法:
? ?bomIn.hasBOM()、hasBOM(ByteOrderMask.**)可用于判斷當前流中是否檢測到了bom。

???讀取文件示例:

FileInputStream fis = new FileInputStream(file); //可檢測多種類型,并剔除bom BOMInputStream bomIn = new BOMInputStream(in, false,ByteOrderMark.UTF-8, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE); String charset = "utf-8"; //若檢測到bom,則使用bom對應的編碼 if(bomIn.hasBOM()){ charset = bomIn.bs.getBOMCharsetName(); } InputStreamReader reader = new InputStreamReader(bomIn, charset); ...


二、使用一個更強大點的工具類(可以支持UTF-8/UTF-16LE/UTF-16BE/UTF-32LE/UTF-32BE):
? ? ? ?

? ?參考地址:http://koti.mbnet.fi/akini/java/unicodereader/,?下載其中兩個文件:UnicodeStream和UnicodeReader

? ?以UnicodeReader為例:

FileInputStream fis = new FileInputStream(file); UnicodeReader ur = new UnicodeReader(fis, "utf-8"); BufferedReader br = new BufferedReader(ur); ...

?

? ?相較于Apache的工具類,這里的UnicodeReader 支持更多的BOM編碼。

? ?源碼解讀:

? ?UnicodeReader 通過PushbackInputStream+InputStreamReader實現(xiàn)BOM的自動檢測和過濾讀取;

? ?當沒有檢測到BOM時,pushback流將回退,并采用構(gòu)造函數(shù)傳入的編碼進行讀取。
? ?否則使用BOM對應的編碼進行讀取。

? ?

? 相對來說,第二種方式更加輕量和強大;另外也更加透明,可以隨便修改源碼來實現(xiàn)自己的需求。

轉(zhuǎn)載于:https://www.cnblogs.com/powerwu/articles/9078052.html

總結(jié)

以上是生活随笔為你收集整理的Java处理文件BOM头的方式推荐的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。