2017-02-09 50 views
1

我有一個具有中國字符的文件。我寫了一個讀取這個文件並使用FileInputStream/FileOutputStream(字節流)寫入另一個文件的Java代碼,它工作正常。但是,當我使用字符流FileReader/FileWriter時,問題即將到來。字讀/寫器的FileReader和FileWriter的無法讀/寫文件,中國而是字節讀/寫器工作正常

現在的問題是,如何才能使用只有8位能夠讀取中文字符的字節流,因爲我知道的是字節流一次讀取/寫入一個字節並使用一個字節,我們只能識別ASCII字符(即只有128個字符)。字符流(FileReader/FileWriter)使用16位讀/寫並且具有讀/寫漢字的能力,因此無法正確讀/寫文件。

+0

你應該告訴我們你的代碼,但* *請注意,'FileInputStream'不關心你的文件存儲,它複製原始字節;當您打開已複製到您正在使用的工具(假設記事本)的文件時,正在應用將這些字節轉換爲人類可讀文本的編碼。 – Eugene

+0

不一定兩個字節,它可能更多;例如,代理對。也幾乎可以肯定你所得到的編碼錯誤,在這裏看到一個提示:http://stackoverflow.com/questions/13350676/how-to-read-write-this-in-utf-8 – Eugene

回答

1

字符編碼(或解碼)只有當你試圖向字節流轉換爲字符串(或字符)適用。 FileInputStream和FileOutputStream可以處理任何字符,因爲它們不是字符,而是字節。

當你嘗試讀取文件與使用的FileReader和FileWriter的性格,你必須採取的字符編碼考慮。看的FileReader從下面的Java文檔,

便捷類用來讀取字符文件。此 類的構造函數假設默認的字符編碼和默認字節緩衝器 大小是合適的。要自己指定這些值,請在FileInputStream上構建一個InputStreamReader。

現在,如果您使用的是FileReader(與FileWriter類似),它將從正在運行的系統(基於語言環境)中選擇默認編碼,特別是在Windows操作系統中。你可以,

  1. 具體傳遞的file.encoding參數爲 「UTF-8」
  2. 用正確的編碼構建自己的InputStream。

希望這有助於

+1

要強調的是,如果你在做文本處理時不要使用FileInputStream(除非你有一些需要避免Java的文本處理類)。 –