2016-07-13 81 views
0

如果我們的文本文件中有一個字符是unicode,那麼它不是2字節的數據嗎? 但是read()方法一次只讀取一個字節,作爲int。因此,如果我們有一個FileInputStream對象fin並且我們調用int x = fin.read()一次,如果只有一個字節被讀取,我們如何獲得全字符System.out.println(x)? (fin.read()不在while循環或任何東西,它只是調用一次)爲什麼read()一次讀取一個字節,如果char是2個字節?

+1

它每次讀取一個字節,因爲它一次指定讀取一個字節。如果你需要很好地處理字符串,你將不得不使用裝飾器。 –

+0

不完全重複,但鏈接問題的接受答案解釋了讀取字節和字符之間的區別。 –

回答

2

好問題!你是對的,在Java字符總是兩個字節,但在其他地方(例如在一個文件的內容)是不正確的。

的文件不被編碼「中的‘統一’,因爲Unicode是一個規範,而不是編碼。編碼映射Unicode規範某些字節序列,並且不是所有的這樣的編碼使用兩個字節字符。爪哇char s爲UTF-16它總是兩個字節寬,但許多文件存儲爲UTF-8這是可變寬度; ASCII字符是一個字節,其他是兩個或更多

更重要的是,但InputStream旨在讀取二進制數據, 不是字符,二進制數據(實質上)總是一次讀取一個字節。如果你想讀取文本,你可以將你的流包裝成一個Reader(最好明確指定要使用的編碼)將二進制數據轉換爲文本。在內部,它會調用read()一次或多次,以便根據編碼從字節序列中正確構造一個字符。

2

流是用於讀取字節,而不是字符。如果您想閱讀字符,請使用Reader。 Reader將逐個讀取一個字符,並將處理字節從字節解碼:根據字符編碼(和字符本身),可以將字符編碼爲單個字節,兩個或更多字符。

相關問題