Java處理文件BOM頭的方式推薦

背景:

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

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

目標:

實現一種方式,可對BOM頭進行捕捉和過濾

?

解決方案有二:

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

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

? ?該類的構造方式:
? ?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實現BOM的自動檢測和過濾讀取;

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

? ?

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

轉載于:https://www.cnblogs.com/powerwu/articles/9078052.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251695.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251695.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251695.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

封裝svg組件

如何封裝svg圖標組件 封裝svg圖標組件的方法有很多種,如果只是單純的想使用svg圖標,可以將svg導出fonts字體圖標使用,但這樣做會失去svg原有的樣式與尺寸,也可以當成img圖片或者背景引入,但這樣做非常繁瑣。 最近項目中…

RabbitMQ 延遲隊列,消息延遲推送

應用場景 目前常見的應用軟件都有消息的延遲推送的影子,應用也極為廣泛,例如: 淘寶七天自動確認收貨。在我們簽收商品后,物流系統會在七天后延時發送一個消息給支付系統,通知支付系統將款打給商家,這個過程…

windows Navicat Premium連接oracle

需要下載并指定Instant Client 下載地址:在oracle官網搜索Instant Client Downloads選擇自己需要的客戶端 //說明 //Navicat 版本 9 或以上捆綁了 instant client,但是捆綁的用不了,捆綁的10.2。因此下載高版本替換之 //版本有要求&#xff0…

關于arraylist的擴容機制

ArrayList會自動改變size的長度: 首先,ArrayList定義了一個私有的未被序列化的數組elementData,用來存儲ArrayList的對象列表(注意只定義未初始):private transient Object[] elementData;   其次&am…

不同級別UI設計師的區別有哪些?

不同等級的UI設計師在工作內容以及基本的薪資待遇方面也是有區別的,很多在UI培訓學校學習的小伙伴們并不知道各個等級的UI設計師工作內容有什么差別,那么合肥學碼思小編就給大家總結一下這些區別分別表現在哪些方面。 一、初級UI設計師 初級UI設計師的主…

Linux命令行參數前加--,-和不加杠

參數前“-”的表明后面的參數是字符形式。參數前“--”的則表明后面的參數是單詞形式。參數前有橫的是System V風格。 參數前沒有橫的是BSD風格。 轉載于:https://www.cnblogs.com/YYRise/p/9090476.html

反射筆記-----------------------------

1.反射基本概念: 01.定義: 反射是指在程序運行期間,能夠觀察和修改類或者類的對象的屬性和行為的特性! 02.作用: 001.在運行期間獲取類的修飾符,包名,類名,實現的接口,繼…

kubernetes 集群部署

kubernetes 集群部署 環境JiaoJiao_Centos7-1(152.112) 192.168.152.112JiaoJiao_Centos7-2(152.113) 192.168.152.113JiaoJiao_Centos7-3(152.114) 192.168.152.114已開通 4C8G80G 集群規劃 部署方式 環境準備:基于主機名稱通信,時間同步,關…

PHP學習筆記--抽象類和抽象方法的應用

抽象類** 什么是抽象方法?** 定義:如果一個類中的方法,沒有方法體的方法就是抽象方法(就是一個方法沒有使用{}而直接使用分號結束)* * abstract function test(); //抽象方法* * function test(){ //有方法體…

wordpress 顯示數學公式 (MathJax-LaTeX)

blog 不放一堆數學公式怎么能顯得高大上,所以 MathJax-LaTeX 也是必裝的插件之一了。 一、安裝 MathJax-LaTex 插件 直接在 wordpress 插件中,搜索并安裝 MathJax-LaTeX 二、安裝本地 MathJax 服務 不過由默認的 MathJax cdn 服務經常被墻,所…

長春理工大學第十四屆程序設計競賽(重現賽)F.Successione di Fixoracci

鏈接:https://ac.nowcoder.com/acm/contest/912/F 題意: 動態規劃(Dynamic programming,簡稱dp)是一種通過把原問題分解為相對簡單的子問題的方式求解復雜問題的方法。例如,假設小x一步能爬1層或2層臺階,求小x爬n層臺階…

ConstraintLayout

ConstraintLayout使用筆記 具體使用參考:http://blog.csdn.net/guolin_blog/article/details/53122387 ConstraintLayout 好處還是很明顯,確實可以減少嵌套。性能對比參閱:http://www.cnblogs.com/liujingg/p/7161319.html 簡單嵌套Constrain…

css權重

權重大小 內嵌權重為1000 <p style"color: yellow;">ALEX</p> id選擇器的權重為100&#xff0c;類選擇器的權重為10&#xff0c;標簽選擇器的權重為1. /*1 1 1*/ #box1 .wrap2 p{color: red; }當權重一樣的時候&#xff0c;是以后設置的屬性為準&#xf…

手機兩列布局,正方形

手機兩列布局&#xff0c;正方形。 直接貼出調試網站的結果&#xff0c;閱讀效果還不錯。 轉載于:https://www.cnblogs.com/blogzhang/p/11002428.html

python(5)- 基礎數據類型

一 int 數字類型 #abs(x)      返回數字的絕對值&#xff0c;如abs(-10) 返回 10 # ceil(x)    返回數字的上入整數&#xff0c;如math.ceil(4.1) 返回 5 # cmp(x, y)    如果 x < y 返回 -1, 如果 x y 返回 0, 如果 x > y 返回 1 # exp(x)…

B s

666 轉載于:https://www.cnblogs.com/lovelgx/articles/9099239.html

基于HTK的語音撥號系統

為什么80%的碼農都做不了架構師&#xff1f;>>> 基于 HTK 的語音撥號系統 Veket NWPU 2011-6-22 目標&#xff1a; 該系統能夠識別連續說出的數字串和若干組姓名。建模是針對子詞&#xff08; sub-word,eg.. 音素&#xff09;&#xff0c;具有一定的…

MySQL無法重啟問題解決Warning: World-writable config file '/etc/my.cnf' is ignored

為什么80%的碼農都做不了架構師&#xff1f;>>> 今天幫朋友維護服務器&#xff0c;在關閉數據庫的命令發現mysql關不了&#xff0c;提示Warning: World-writable config file /etc/my.cnf is ignored &#xff0c;大概意思是權限全局可寫&#xff0c;任何一個用戶都…

用戶體驗分析: 以 “南通大學教務管理系統微信公眾號” 為例

基于實例分析&#xff0c;體會用戶體驗設計的 7 條準則&#xff0c;分析“南通大學教務管理系統微信公眾號” 在用戶體驗設計方面讓你覺得滿意的地方&#xff08;不少于2點&#xff09;&#xff1b;&#xff08;20分&#xff09;&#xff0c;請陳述理由。 同樣&#xff0c;分析…

JVM學習筆記(一):Java內存區域

由于Java程序是交由JVM執行的&#xff0c;所以我們在談Java內存區域劃分的時候事實上是指JVM內存區域劃分。在討論JVM內存區域劃分之前&#xff0c;先來看一下Java程序具體執行的過程&#xff1a; 首先Java源代碼文件(.java后綴)會被Java編譯器編譯為字節碼文件(.class后綴)&am…