理解JAVA的IO流

File類

在程序中想要操作文件和目錄,是通過File類來完成的,File類中提供是一系列的方法(查看API文檔),藉助File類可以完成新建、刪除、重命名文件和目錄,但值得注意的是File並不能訪問文件中的內容。想要對訪問的文件中的內容,就需要利用IO流(輸入輸出流)

理解JAVA的IO流
stream 流是java中對不同的輸入/輸出源(鍵盤、文件、網絡連接等)的抽象表述。簡單來說,可以理解爲從起源(source)到接收(sink)的有序數據。


流的分類

  1. 從流向的角度來分,流分爲輸入流和輸出流。
    輸入流:只讀,不寫(只能從中讀取數據,不能向其寫數據)。
    輸出流:只寫,不讀(只能向其寫入數據,不能從中讀取數據)。

  2. 從操作數據的單元不同,流分爲字節流和字符流。
    字節流:操作的數據單元是8位字節
    字符流:操作的數據單元是16位的字符

  3. 從流的角色來分,流分爲節點流和處理流。
    節點流(也稱低級流):程序從/向特定的IO設備(如磁盤、網絡)讀/寫數據。
    這裏寫圖片描述

    • 處理流(也稱高級流、包裝流):對一個已經存在的流進行連接或封裝,程序通過封裝後的流來進行數據的讀/寫。
      這裏寫圖片描述
      . 節點流就相當於用一根特定的水管從數據源端伸出(不同的處理流,對應不同的大小的水管),從程序直接連接到實際的數據源,程序和實際的輸入/輸出節點是直接連接上的,此時通過這特定的水管程序只能訪問一個特定的數據源。但處理流則是在程序端加入了一個轉接水管,根據數據源端的水管的大小在外面套上一個轉接水管(也就是對節點流進行了封裝),然後再接到程序,這樣使用的優點就是,只要使用相同的處理流(也就是數據源端的水管大小一樣),程序就可以採用完全相同的輸入/輸出代碼(一個對應大小固定的轉接水管)來訪問不同的數據源。(使用處理流來包裝節點流其實是一種典型的裝飾器設計模式。)
      . 使用處理流的思路:使用處理流來包裝節點流,程序通過處理流來執行輸入/輸出功能,讓節點流與底層的IO設備、文件交互。
      . 識別處理流和節點交:只要流的構造器的參數不是一個物理節點,而是已經存在的流,那麼這種流就一定是處理流;而所有節點流都是直接以物理IO節點作爲構造器參數的。例如:
...
    //以一個文本,即物理節點作爲構造器參數,FileOutputStream 是節點流
    FileOutputStream fos = new FileOoutputStream("test.txt");
    //以一個流作爲構造器參數,PrintStream 是處理流
    PrintStream ps = new PrintStream(fos);
...

IO流的體系

這裏寫圖片描述

  • Java中的IO流有將近40個類,但所有的IO流都是從四個基類中擴展出來的。
    InputStream/Reader: 是所有輸入流的基類,前者是字節輸入流,後者是字符輸入流。
    OutputStram/Writer:是所有輸出流的基類,前者是字節輸出流,後者是字符輸出流。
  • 選擇的規則:內容是文本內容,使用字符流;內容是二進制內容,則使用字節流。
    (附:在計算機中,文件可以分爲文本文件和二進制文件,所以能用記事本打開關查看到其中的字符內容的文件都是文本文件,反之則是二進制文件。實質上,計算機中所有文件都是二進制文件,文本文件只是二進制文件的特例:當二進制文件裏的內容恰好能被正常解析成字符時,二進制文件也就成了文本文件。)

本文參考了李剛《瘋狂Java講義》一書。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章