[14]字節流
一.字節流
1.什麼是字節流
是IO流中的一種, 可以用來讀寫字節數據.
2.字節流和字符流的區別
計算機中存儲任何數據都是以字節的形式, 所以字節流可以讀寫任意類型的數據.
在讀寫的數據是字符的時候, 用字符流更方便.
3.什麼時候用字節流, 什麼時候用字符流
當從一個文本文件中讀取數據, 在程序中當作字符使用時, 或者寫出一段字符數據到文件中時, 使用字符流比較方便.
字符流讀取數據就是字符, 字符流可以直接寫出字符
如果只是讀寫數據, 不轉爲字符, 那麼就都可以使用字節流.
4.read()方法爲什麼返回int
Reader.read() 讀取一個字符, 返回int
InputStream.read() 讀取一個字節, 返回int
爲什麼不是返回char和byte呢?
Reader.read() 如果返回char, 那麼無法表示流末尾, 因爲所有的char都有可能在流中出現.
在read方法內部, 將讀取到的char裝入int, 這時正常數據不受影響, 強轉回char之後直接使用, 也可以返回-1代表流末尾了.
InputStream.read() 如果返回byte, 也是無法表示流末尾的, 因爲從-128到127中所有值都有可能在流中出現.
在read方法內部, 是將讀取到的字節&255, 正數沒有任何變化, 負數轉爲了正數, 這時就可以用-1表示文件末尾了
在真正使用數據時, 只要將轉換後的數強轉回byte即可
5.使用字節流拷貝文件
使用FileInputStream和FileOutputStream, 逐個字節拷貝. 效率很低, 不推薦.
* 使用FileInputStream和FileOutputStream, 定義數組作爲緩衝區, 一次讀取一個數組, 一次寫出一個數組, 提高效率.
* 使用BufferedInputStream和BufferedOutputStream, 逐個字節拷貝, 但其內部使用了緩衝機制, 速度較快.
二.轉換流
* 1.InputStreamReader
當獲取了一個字節輸入流, 希望從中讀取字符數據時, 可以把字節輸入流轉爲字符輸入流InputStreamReader
當讀取非平臺默認編碼的字符文件時, FileReader做不到, 只能使用InputStreamReader.
* 2.OutputStreamWriter
當獲取了一個字節輸出流, 希望向外寫出字符數據時, 可以把字節輸出流轉爲字符輸出流OutputStreamWriter
當寫出非平臺默認編碼的字符文件時, FileWriter做不到, 只能使用OutputStreamWriter
三.標準輸入輸出流
1.System.in
標準輸入流, InputStream, 可以從鍵盤輸入讀取字節.
可以使用System.setIn(InputStream)改變標準輸入流的數據源.
2.System.out
標準輸出流, PrintStream, 可以向屏幕輸出數據.
可以使用System.setOut(PrintStream)改變標準輸出流的數據目的地.
四.練習
1.對文件進行加密.
2.讀寫UTF-8文件.
3.從鍵盤輸入讀取學生考試成績, 對其進行排序, 將結果輸出到stu.txt文件中