JAVA輸入輸出流-字符流和字節流詳解

深入理解字符流編碼

首先要理解字符流輸入的原理:
字符流輸入其實底層也是字節流輸入

字符–>計算機二進制數字(字節):編碼
字節(計算機二進制數字)–>字符:解碼

寫入時:

1、當使用字符流的write方法向文件寫入數據的時候,數據會先寫進內存緩衝區中,
2、內存緩衝區會先字符對比着系統碼錶編碼(中文系統是GBK)爲對應的字節:字符–>數字
3、調用了flush方法或者是close方法後,內存緩衝區中編碼爲字節(數字)會寫入到文件中

讀取時:

使用read方法讀取文件的時候,文建會先將存儲在計算機中的二進制對照系統碼錶解碼成相應的字符,讀入程序

圖片不能用字符流的原因

因爲圖片是字節文件,計算機中存儲的也是字節數字,所以用字節流輸入的時候不需要編碼解碼的過程,直接將計算機中的字節讀取寫入就可以了

但是用字符流讀取的時候,一次讀取兩個字節,然後將這兩個字節按照碼錶解碼成相應的字符,當讀取圖片的時候,將兩個字節拼在一起對比碼錶解碼,碼錶中可能沒有相應的字符,就會將此二進制數據標記爲未知字符,
在寫入的時候,會將未知字符丟掉,所以圖片拷貝不成功

因爲原圖片和你拷貝的“圖片”在計算機中的字節都是不一樣的
拷貝的“圖片”丟失了很多 解碼後被標記爲“未知字符”的字節

舉個例子:一個圖片在計算機中存儲的字節是:-121,34,124,53,-65,-43,1…

使用字節流讀取的時候,一次讀取一個字節,會原封不動的讀取出來:-121,34,124,53,-65,-43,1…
但是當使用字符流讀取的時候,一次讀兩個字節-12134,12453…然後將每次讀取到的兩個字節對照系統碼錶解碼成相應的字符,但是碼錶中可能沒有相應的字符;

例如沒有和-12134對應的字符,就會將此二進制數據標記爲未知字符(假設標記爲¥);
在寫入的時候,就會將¥字符給丟掉,所以最後實際寫入的數據爲124,53,-65,-43,1…
這樣拷貝自然就失敗了

關於寫入字符到文件中,打開文件查看亂碼的原因,參考上面鏈接

最後:字符流因爲解碼編碼等原因,比字節流慢很多
字符流一般用於傳輸純文本文件,尤其是中文文檔,不能用於視頻,圖片等傳輸
圖片等視頻音頻文件要用字節流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章