如果我們的文本文件中有一個字符是unicode,那麼它不是2字節的數據嗎? 但是read()
方法一次只讀取一個字節,作爲int
。因此,如果我們有一個FileInputStream
對象fin
並且我們調用int x = fin.read()
一次,如果只有一個字節被讀取,我們如何獲得全字符System.out.println(x)
? (fin.read()
不在while
循環或任何東西,它只是調用一次)爲什麼read()一次讀取一個字節,如果char是2個字節?
0
A
回答
2
好問題!你是對的,在Java字符總是兩個字節,但在其他地方(例如在一個文件的內容)是不正確的。
的文件不被編碼「中的‘統一’,因爲Unicode是一個規範,而不是編碼。編碼映射Unicode規範某些字節序列,並且不是所有的這樣的編碼使用兩個字節字符。爪哇char
s爲UTF-16它總是兩個字節寬,但許多文件存儲爲UTF-8這是可變寬度; ASCII字符是一個字節,其他是兩個或更多
更重要的是,但InputStream
旨在讀取二進制數據, 不是字符,二進制數據(實質上)總是一次讀取一個字節。如果你想讀取文本,你可以將你的流包裝成一個Reader
(最好明確指定要使用的編碼)將二進制數據轉換爲文本。在內部,它會調用read()
一次或多次,以便根據編碼從字節序列中正確構造一個字符。
2
流是用於讀取字節,而不是字符。如果您想閱讀字符,請使用Reader
。 Reader將逐個讀取一個字符,並將處理字節從字節解碼:根據字符編碼(和字符本身),可以將字符編碼爲單個字節,兩個或更多字符。
相關問題
- 1. 爲什麼一箇中文字符需要一個字符(2個字節)而不是3個字節?
- 2. 爲什麼InputStream#read()返回一個int而不是一個字節?
- 3. 一次只讀取一個字節而不使用一個字節的HTTP流
- 4. 什麼是低半字節,爲什麼結果是不同的一個數字
- 5. golang Read(p []字節)不讀全字節?
- 6. 爲什麼FileInputReader.read()每次只讀取5個字節(Java)?
- 7. 爲什麼BufferedInputStream每次最多讀取2048個字節?
- 8. 從套接字讀取一個字節
- 9. 一次讀取一個二進制文件1個字節
- 10. 一次讀取一個字節的兩個文件
- 11. C中2個字節的字節縮短爲2個字節?
- 12. 爲什麼Java char原語佔用2個字節的內存?
- 13. 爲什麼java使用2個字節來存儲char值
- 14. 字節 - 2然後下一次+2不起作用...爲什麼?
- 15. java:FileInputStream.read()讀取一個字節,但可以讀取一個字符,怎麼來的?
- 16. 爲什麼我只能從okhttp.Response InputStream一次讀取2048個字節?
- 17. 說一個方法讀取一個字節的數據是什麼意思?
- 18. 作爲一個無符號字節讀單個字節
- 19. 爲什麼sizeof()返回4個字節而不是2個字節的short int?
- 20. 爲什麼BitConverter.ToInt32一次只讀取一個字節,如果數據未在給定偏移量處對齊?
- 21. 從一個字節獲取半字節
- 22. MemoryStream:爲什麼在讀取字節後轉換爲字節
- 23. 每個字節讀取陣列字節
- 24. 在C中一次讀取一個文件16字節0
- 25. 使用輪詢/選擇一次讀取一個字節
- 26. 一次讀取一個文件16字節問題
- 27. Python http.client.Incomplete Read(0字節讀取)錯誤
- 28. PIC C18:從一個字節讀取位
- 29. 從一個字節讀取EXIF數據[]
- 30. 讀取下一個字節的位數
它每次讀取一個字節,因爲它一次指定讀取一個字節。如果你需要很好地處理字符串,你將不得不使用裝飾器。 –
不完全重複,但鏈接問題的接受答案解釋了讀取字節和字符之間的區別。 –