2014-01-19 159 views
-1

1個字節應該足以存儲一個字符,而不是爲什麼java使用2個字節,另一個令人困惑的事情是使用FileInputStream完成所有操作字節明智如何讀取字符爲什麼java使用2個字節來存儲char值

+2

1個字節用於存儲ASCII字符。 Java使用Unicode,而不是ASCII。 – BackSlash

+0

一個字節不會飛,因爲可悲的是,不是每個人都用相同的語言進行通信。一些[背景閱讀](http://www.joelonsoftware.com/articles/Unicode.html)適合你。 – avik

回答

3

Java char數據類型是16位,字節是8位。

這是因爲Java字符串是unicode字符串,而不是ASCII字符串,允許在全球大多數語言中使用標準Java字符串。

0

FileInputStream(以及從InputStream繼承的其他類)確實是「面向字節」的,它不適合讀取字符數據。

如果你需要閱讀的文本文件,你應該試試這個:

new InputStreamReader(new FileInputStream(file), "UTF8") 

你需要知道文件的編碼事前,當然。

如果您只需要將文件讀入字符串並且文件不是特別大,最簡單的方法就是調用FileUtils.readFileToString。有關更多信息,請參見Apache Commons IO javadoc

更新-201301191245: 對於那些誰天真地認爲他們可以從文件中讀取字節到字節數組,然後轉換成字節數組字符串:此不會爲UTF-8工作,因爲它可能包含多字節字符。考慮以下幾點:

  • 美元符號( 「$」,U + 0024)在UTF-8只佔用一個字節:24
  • 歐元符號( 「€」,U + 20AC)佔據UTF三個字節-8:E2 82 AC

想象一下這種情況:

假設你閱讀「E2 82」 到年底固定大小的緩衝區的,和「AC」尚需在讀下一個閱讀週期。當您嘗試將字節「E2 B2」轉換爲java字符時,結果將被損壞的文本數據。

+0

**所有**流都是「面向字節」的......字節是字節。類之間的唯一區別是它們公開的便利方法將這些字節強制轉換爲其他內容(並提供緩衝)。你可以很容易地從'FileInputStream'中讀取一個字節數組,並將它們轉換爲'String',而不會引入巨大的第三方依賴。 –

+0

我同意,所有的流都是「字節爲導向的」,會糾正我的答案。 我不同意這個:「從FileInputStream讀取一個字節數組並將它們轉換爲一個字符串」。這對於複合(多字節)字符不適用。 考慮歐元符號U + 20AC:它以UTF-8:E2 82 AC中的3個字節進行編碼。 – akhikhl

+0

你真的不明白數據如何在計算機/文件之間產生效果,或者如何使用Java實際表示/編碼字符串。提示:它是字節。 'new String(byteArray,Charset.forName(「UTF-8」));' –

相關問題