一、流的分類:
資料機關:位元組流 字元流
方向: 輸出流 輸入流(輸入流:由檔案輸入到程式;輸出流:由程式輸出到檔案)
角色: 節點流 套節流
位元組流:以Stream結尾。
字元流:以Reader 和Writer 結尾。
輸入流:所有帶有Input或者Reader。
輸出流:所有帶有Output或者Writer。
節點流:構造時傳入檔案對象或檔案路徑的類都是位元組流類。
處理流:構造時傳入其他流的對象的類都是處理流類。
二、InputStream 是所有位元組輸入流的基類:
最典型的實作是:FileInputStream
構造方法
最重要的三個方法:
int read() 從輸入流中讀取一個位元組資料。
int read(byte[] b) 從輸入流中将最多 b.length 個位元組的資料讀入 byte 數組 b 中。
int read(byte[] b, int off, int len) 從輸入流中将最多 len 個位元組的資料讀入 byte 數組 b 中。
三、OutputStream 是所有位元組輸出流的基類:
最典型的是:FileOutputStream
構造方法
最重要的三個方法:
void write(int b) 将指定的位元組寫入此輸出流。
void write(byte[] b) 将 b.length 個位元組從指定的 byte 數組寫入此輸出流。
void write(byte[] b, int off, int len) 将指定 byte 數組中從偏移量 off 開始的 len 個 位元組寫入此輸出流。
四、Reader
Reader 是所有字元輸入流的基類
Reader 的典型實作時 FileReader 類
構造方法
最重要的方法:
int read() 從輸入流中讀取一個字元資料。
int read(char[] c) 從輸入流中将最多 c.length 個字元的資料讀入 char 數組 c 中。
int read(char[] c, int off, int len) 從輸入流中将最多 len 個字元的資料讀入 char 數組 c 中。
五、Writer
Writer 是所有字元輸出流的基類。
構造方法
Writer 的典型實作就是 FileWriter 最重要的方法:
void write(int c) 将指定的字元寫入此輸出流。
void write(char[] c) 将 c.length 個字元從指定的 char 數組寫入此輸出流。
void write(char[] c, int off, int len) 将指定 char 數組中從偏移量 off 開始的 len 個 字元寫入此輸出流。
void write(String s) 将字元串寫入此輸出流。
void write(String s, int off, int len) 将指定字元串中從偏移量 off 開始的 len 個 字元寫入此輸出流。
七、位元組緩沖流:
BufferedInputStream(FileInputStream)
BufferedOutputStream(FileOutputStream)//括号裡是舉例
八、字元緩沖流:
BufferedReader(FileReader)
BufferedWriter(FileWriter)//括号裡是舉例
緩沖流要套接在相應的節點流上,對讀寫的資料提供了緩沖的功能,提高了讀寫的效率,同時增加了一些新的方法。
九、轉換流:
轉換流提供了在位元組流和字元流之間的轉換。
InputStreamReader和OutputStreamWriter。
InputStreamReader需要套接在InputStream對象上操,
OutputStreamWriter需要套接在OutputStream對象上操作
構造方法:
InputStreamReader(InputStream)
InputStreamReader(InputStream,String charsetName)
OutputStreamWriter(OutputStream)
OutputStreamWriter(OutputStream,String charsetName)
轉換流通常在作業系統非預設的字元(并且明确知道檔案的字元編碼)編碼檔案時使用。
十、流的關閉
流的對象是不作為 Java 虛拟機垃圾回收處理的對象的,是以需要手動關閉流。
流的對象在使用完之後必須調用流對象的 close()方法來關閉流,釋放堆記憶體(heap)。
十一、為什麼Gc回收不了流對象?
垃圾回收是Java中自動記憶體管理的另一種叫法。垃圾回收的目的是為程式保持盡可能多的可用堆(heap)。 JVM會删除堆上不再需要從堆引用的對象。
Gc是主要清理記憶體,但close方法還要釋放掉一些系統資源,比如硬碟讀寫所使用的資源。如果沒有close,程式還是在運作,Gc不把它當成垃圾,回收不了。
如果一個流不關閉會産生一些額外問題。比如說鎖定了某種資源。如果你用流打開了一個檔案,沒有關閉的話,這個檔案就不能再被操作。會提示有程式在操作這個檔案。而且也會占 用系統句柄。
緩沖流的關閉 :關閉緩沖流,那麼會自動關閉它所包裝的底層節點流。
十二、位元組流和字元流的應用
1、在處理視訊,音頻,圖檔等二進制資料檔案是使用位元組流。
2、在處理文本檔案等字元檔案時使用字元流。
十三、緩沖流通過減少調用本地 API 的次數來優化的輸入和輸出。
因為:
使用非緩沖 I/O。這意味着每次讀或寫請求是由基礎 OS 直接處理。這可以使一個程式效率非常低下,因為每個這樣的請求通常引發磁盤通路,網絡活動,
或一些其它的操作,而這些是相對昂貴的。
十四、flush()方法:
1.在調用緩沖輸出流的 write 方法時并沒有把資料寫入檔案,而是從記憶體緩沖進入了輸出流中,通過調用緩沖輸出流的 flush 方法可以強制把輸出流中的資料輸出到檔案中。
2.緩沖輸出流調用 close 方法時會先進行 flush 操作再關閉流。但是隻儲存最後一次的資料。
十五、流的操作規律
1、明确源和目的。
資料源:就是需要讀取,可以使用兩個體系:InputStream、Reader;
資料彙:就是需要寫入,可以使用兩個體系:OutputStream、Writer;
2、操作的資料是否是純文字資料?
如果是:資料源:Reader
資料彙:Writer
如果不是:資料源:InputStream
資料彙:OutputStream
3、雖然确定了一個體系,但是該體系中有太多的對象,到底用哪個呢?
明确操作的資料裝置。
資料源對應的裝置:硬碟(File),記憶體(數組),鍵盤(System.in)
資料彙對應的裝置:硬碟(File),記憶體(數組),控制台(System.out)。
4、需要在基本操作上附加其他功能嗎?比如緩沖。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90zZjxmUYp1dW1GZwh3VZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DO1UTMwYTMwETMyEDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)