2013-02-26 36 views
5

我看到您可以通過Charset.forName("UTF-16")指定UTF-16作爲字符集,並且您可以通過Charset.forName("UTF-16").newDecoder()創建新的UTF-16解碼器,但我只能看到在InputStreamReader的構造函數上指定CharsetDecoder的能力。如何在Java中讀寫時強制使用UTF-16?

怎麼樣如何指定在Java中讀取任何流時使用UTF-16?

+1

如果該類允許的話,你可以在一個字節流和字符流之間的邊界這麼做。 (InputStreamReader是一個這樣的類,對於其他Reader,它不給你指定字符集的選項,只是將它包裝在InputStreamReader中)。 InputStream(字節流)級別的較低結構不具有字符集的概念。 – nhahtdh 2013-02-26 20:04:08

回答

11

輸入流處理原始字節。當你直接從輸入流中讀取時,你得到的只是字符集不相關的原始字節。

根據定義,將原始字節解釋爲字符需要進行某種類型的翻譯:如何將原始字節翻譯爲可讀的字符串?這個「翻譯」是以字符集的形式出現的。

該「添加」層由讀者實現。因此,要從流中讀取字符(而不是字節),您需要在流的頂部構建某種類型的Reader(取決於您的需要)。例如:

InputStream is = ...; 
Reader reader = new InputStreamReader(is, Charset.forName("UTF-16")); 

這將導致reader.read()讀取使用的字符指定字符集。如果你想讀整線,在上面使用BufferedReader

BufferedReader reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-16"))); 
String line = reader.readLine();