1、流的定義: 數據的有序集合,能從一個地方傳輸到另一端的過程。
2、流的本質: 數據傳輸
3、流的劃分:
(1)按照方向:
輸入流: 從磁盤(存儲介質)---------->當前程序(內存)的過程
基類: InputStream 、 Reader
輸出流: 從當前程序(內存)---------->磁盤的過程(存儲介質)
基類: OutputStrem 、 Writer
(2)按照操作單元
字節流 : 二進制表示的數據,一個字節8個bit
基類: InputStream 、 OutputStream
字符流 : 將數據以字符形式表示,例如‘a’ ‘b’ 1、2、3
基類: Reader 、 Writer
(3)按照角色劃分:
節點流(介質流):低級流,連接程序和儲存介質的流
處理流(高級流):和節點流直接相連的流,
抽象基類: 節點流(文件流) 緩衝流(節點流的一種) 轉化流 (指定編碼解碼)
字節流 InputStream FileInputStream BufferedInputStream InputSreamReader
字節流 OutStream FileOutputSteam BufferedOutputStream OutputStreamWriter
字節流可以用與讀寫視頻文件 圖片文件、音頻文件等
字符流 Reader FileReader BufferedReader
字符流 Writer FileWriter BufferedWriter
字符流只能用於讀寫字符數據
4、字節流、字符流的區別:
字節: 存儲的是0101
字符: 存儲的字符,
(1) 讀寫單元不同:
字節流以字節(8 bit) 爲單位
字符流以字符爲單位,
(2)處理對象不同
字節流可操作所有類型的文件(視頻、圖片、音樂…)
字符流只能操作字符類型的文件,
(3)處理效率不同
字節流效率高,
字符流效率低,因爲要涉及到編碼解碼
(4) 可移植性
字節流高,與平臺無關
字符流低,
5、字節和字符的相互轉換 (亂碼問題)
原因分析:
字節數組容量太小,最後幾個字節包含了一個字符的部分字節。
開始的指針不在某個字符的開始字節上。
解碼、譯碼的碼錶不匹配
(1)編碼解碼;
字符 ----->字節: 編碼過程
byte[] b = "abc".getBytes() ; //返回的是一個byte類型的數組{96,97,98}
字節------>字符: 解碼過程
byte[] b = {96,97,98} ;
String str = new String(b); //返回的是一個字符串 “abc”
(2)碼錶:
ASCII碼 :一個字符的七位表示 ,對應的字節都是整數,0-xxxxxxx
ISO-8899-1 :拉丁碼錶,以一個字節的8爲表示,可以表示整數和負數,(最高位表示符號)
GBK :中文碼錶,用兩個字節表示,2個字節中,第一個字節最高位爲1,第二個字節的最高位爲0;
Unicode :國際標準碼:無論什麼文字,都是兩個字節
UTF-8 :基於Unicode,一個字節表示存儲信息,每個字節頭加入了編碼信息
(2)編碼類:Charset