Java配置文件Unicode編碼可能引發的bug

搬遷博客[2015-05-26] http://xiaosunzhu.iteye.com/blog/2214416

  1. 發現bug:
    在服務器上部署後臺服務並驗證能夠正常運行,但是一次修改配置重啓後突然出現了一個空指針bug,部署的程序並沒有改變

  2. 定位bug:
    空指針定位到一個變量,查找代碼發現變量初始化來自於讀取配置文件,但是檢查配置文件中有正常配置相應值,所以無法找到原因。
    後來在開發機器上調試服務都沒有問題,只好重新部署服務到服務器,發現是能夠正常運行。
    比較兩次部署的服務包,內容完全一致,唯獨配置文件的二進制不同,使用十六進制查看配置文件,發現文件開頭多出了3個字節的BOM頭。

  3. 解決bug:
    使用文本編輯工具將配置文件的BOM頭去掉後,重新啓動服務,驗證能夠正常運行。

  4. 分析bug:
    Bug產生的原因:Windows系統對Unicode編碼的文本文件會使用BOM頭來定義編碼方式和字節序,如果使用記事本編輯Unicode文件保存後就會默認添加BOM頭。而Java的原生IO並不會處理BOM頭,會將BOM頭視爲普通內容,JDK Bug中有此記錄,詳見JDK Bug 4508058,結論是該Bug不會修復,爲了更好的適應性。
    Bug的避免:
    建議不使用Unicode編碼的配置文件,有些IDE默認都是ISO8859-1,這樣兼容性最好。
    在Windows系統上編輯文本文件需要使用編輯工具,不要默認使用記事本,編輯要注意BOM頭問題。
    爲使程序兼容性更好,讀取文件時程序應識別並去掉BOM頭。已提供讀取配置文件工具,源碼詳見UnicodeInputStream
    下載resource-utils庫或者可以引入maven依賴庫

        <groupId>net.sunyijun</groupId>
        <artifactId>resource-utils</artifactId>

使用該工具庫讀取配置可以兼容BOM頭。具體用法詳見README

附BOM頭規則:
00 00 FE FF = UTF-32, big-endian
FF FE 00 00 = UTF-32, little-endian
EF BB BF = UTF-8,
FE FF = UTF-16, big-endian
FF FE = UTF-16, little-endian

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章