2013-07-01 198 views
10

如果我寫這篇文章的代碼,我得到這樣的輸出 - >這個第一:我»¿ ,然後其他線路從文本文件閱讀的第一個字符:我»¿

try { 
    BufferedReader br = new BufferedReader(new FileReader(
      "myFile.txt")); 

    String line; 
    while (line = br.readLine() != null) { 
     System.out.println(line); 
    } 
    br.close(); 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

如何我可以避免它嗎?

+0

我想這是因爲編碼。 –

+3

也許BOM? https://en.wikipedia.org/wiki/Byte_order_mark –

+1

它是[UTF-8 BOM](https://en.wikipedia.org/wiki/Byte_order_mark)。 –

回答

1

這個問題可能出現在使用的編碼中。 試試這個:

BufferedReader in = new BufferedReader(new InputStreamReader(
     new FileInputStream("yourfile"), "UTF-8")); 
+0

我會說*絕對*是編碼;) – Joey

+2

我已經試過了。取代'?'變成'?' – Milton90

+0

這可能是因爲你使用的IDE。有時他們設置本地操作系統的默認編碼 – Tala

13

你所得到的字符第一線,因爲這個序列是UTF-8 byte order mark (BOM)。如果文本文件以BOM開頭,則很可能它是由記事本之類的Windows程序生成的。

解決您的問題,我們選擇明確地讀取該文件爲UTF-8,而不是任何默認的系統字符編碼(US-ASCII等):

BufferedReader in = new BufferedReader(
    new InputStreamReader(
     new FileInputStream("myFile.txt"), 
     "UTF-8")); 

然後在UTF-8,字節序列解碼爲一個字符,即U + FEFF。這個字符是可選的 - 合法的UTF-8文件可能會或可能不會以它開頭。所以我們只會在U + FEFF時跳過第一個字符:

in.mark(1); 
if (in.read() != 0xFEFF) 
    in.reset(); 

現在您可以繼續使用其餘的代碼。