轉載:https://blog.csdn.net/clementad/article/details/47168573
2015-18-01修改:增長 apache commons io 處理方法。
在Windows下用文本編輯器建立的文本文件,若是選擇以UTF-8等Unicode格式保存,會在文件頭(第一個字符)加入一個BOM標識。
這個標識在Java讀取文件的時候,不會被去掉,並且String.trim()也沒法刪除。若是用readLine()讀取第一行存進String裏面,這個String的length會比看到的大1,並且第一個字符就是這個BOM。
這種狀況會形成一些麻煩,好比在讀取ini文件的時候,若是想判斷第一行是否是以「[」開頭就沒法正確判斷。
幸虧,Java在讀取Unicode文件的時候,會統一把BOM變成「\uFEFF」,這樣的話,就能夠本身手動解決了(判斷後,用substring()或replace()去除掉這個BOM):
-
if(line.startsWith("\uFEFF")){
-
-
line = line.replace(
"\uFEFF", "");
-
然而,這種方法並非完美的,若是生成jar文件在windows下運行,仍是有問題。終極的解決方法是使用apache commons io提供的BOMInputStream:
-
-
<groupId>commons-io</groupId>
-
<artifactId>commons-io</artifactId>
-
-
-
BufferedReader reader =
null;
-
-
-
-
-
reader =
new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream(file))));
-
-
-
-
while ((str = reader.readLine()) != null) {
-
什麼是BOM?
BOM = Byte Order Mark
BOM是Unicode規範中推薦的標記字節順序的方法。好比說對於UTF-16,若是接收者收到的BOM是FEFF,代表這個字節流是Big-Endian的;若是收到FFFE,就代表這個字節流是Little-Endian的。
UTF-8不須要BOM來代表字節順序,但能夠用BOM來代表「我是UTF-8編碼」。BOM的UTF-8編碼是EF BB BF(用UltraEdit打開文本、切換到16進制能夠看到)。因此若是接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。
Wikipedia關於POM的說明介紹: