天天看點

java程式員菜鳥入門之五IO流

一、流的分類:

    資料機關:位元組流  字元流

    方向:  輸出流 輸入流(輸入流:由檔案輸入到程式;輸出流:由程式輸出到檔案)

    角色:  節點流 套節流

  位元組流:以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、需要在基本操作上附加其他功能嗎?比如緩沖。

java程式員菜鳥入門之五IO流