一:節點流:
1.字節流:能處理一切文件,純文本、視頻、圖片、音頻
1)文件字節流:(以文件爲源頭)FileInputStream
FileOutputStream
2)數組字節流:(以數組爲源頭)ByteArrayInputStream
ByteArrayOutputStream toByteArray()新增方法,操作不同
2.字符流:只能處理純文本文件
1)文件字節流:FileReader
FileWriter
2)數組字節流:CharArrayInputStream
CharArrayOutputStream
二:處理流:增強節點流的功能,提高可靠性
1.緩衝流:1)字節緩衝流:BufferedInputStream BufferedOutputStream
2)字符緩衝流:BufferedReader readLine() 一行一行的讀取
BufferedWriter newLLine() 換行 相當於"\r\n"
注意運用新增方法時,不能使用多態
2.轉換流:只能把字節流轉換成字符流的,不能把字符流轉換成字節流
1).編碼與解碼概念:
編碼:二進制 編碼字符集 字符
解碼:字符 解碼字符集 二進制
2).亂碼原因:
1)編碼與解碼字符集不統一
2)字節缺少,長度丟失
3). InputStreamReader 解碼(讀取操作)
OutputStreamWriter 編碼(寫入操作)
3.處理 基本數據類型+String 保存類型
DataInputStream readXxx()
DataOutputStream writeXxx()
注意點:1)讀取的順序與寫入的順序必須相同
2)寫入到文件中的內容由於保存了數據類型,因此我們無法識別,但計算機可以識別
4.處理 對象 保存對象
其實4相當於3的增強版,除了3的功能外,還可以處理對象類型:
ObjectInputStream readObject() 對象的反序列化
ObjectOutputStream writeObject() 對象的序列化
注意:1) 不是所用的對象都能序列化 必須是實現了java.io.Serializable接口才能序列化
2) 不是所有的屬性都需要序列化,不想序列化的屬性使用 transient關鍵字
5.打印流:PrintStream
System.in 從鍵盤輸入
System.out 從控制檯輸出
System.err 和out差不多
注意:1)可以改變流向,比如不從鍵盤接收數據,而從文件中接收數據、輸出數據到文件而不是到控制檯
2)在System中定義了標準控制檯:FileDescriptor.in
FileDescriptor.out
可以使用setIn() 和 setOut() 方法進行重定向
三:在流的操作中經常需要關閉流,大量的關閉會很繁瑣,基於封裝的思想,可以建立一個工具類來專門關閉流:
/**
* 工具類:關閉流
* 可變參數:... 表示可以有很多參數,只能在形參的最後一個位置,處理起來和數組一樣
* jdk1.7新增特性可以用try-with-resource實現該功能
*/
/*
public static void closeAll(String str, Closeable ... io) {
}// 沒有問題
public static void closeAll(Closeable ... io, String str) {
}// 有問題
*/
/**
* 面向接口編程,實現了Closeable接口的類都有close()方法
* @param obj
*/
public static void closeAll(Closeable ... io) {
for(Closeable temp: io) {
if(null != temp) {
try {
temp.close();
} catch (IOException e) {
System.out.println("關閉流異常");
e.printStackTrace();
}
}
}
}