Java IO系列之初始IO
什麼是IO流?
IO指的是輸入/輸出(Input/Output),而流是一種抽象概念,這裡我們可以把流想像成是一條長河,在上游有一水庫提供水源,河邊住著一戶人,隨時都可以從河邊取到水,同時,這戶人也可以把一些廢水倒進河裡,使得廢水可以流進大海。這裡所提到的河就是一個數據的流動通道,而水庫就好比是計算機上的一切資料來源,包括磁碟檔案,記憶體,IO裝置,鍵盤等等,河邊上的使用者就是程式,它能隨時隨地從流中取得資料,只要有資料來源掛接到這個通道上可以。而大海就是程式處理完資料後要流向的目的地,這些目的地包抱磁碟檔案,記憶體,IO裝置,顯示器等,這些目的地只是相對程式來說的,它們也可能是別的程序的輸入流。但計算機中的流指的是資料的一種傳輸方式,它代表了資料的無結構化傳輸。與之相對的則是資料的結構化傳輸方式,結構化的資料被稱之為記錄或者資料塊,這些資料當中除了有需要處理的實際資料之外,還可能包含附加資訊,這些附加資訊通常是對本記錄資料的描述。
Java中的IO流
一個獨立的Java程式總是過於寂寞與空虛,成天想著與外界發生點什麼,於是就出現了IO流,這樣程式就可以通過IO與外界發生點什麼有意義的事情了。而且在Java的類庫中,IO部分的內容是很龐大的,因為它涉及的領域很廣泛:標準輸入輸出,檔案的操作,網路上的資料流,字串流,物件流,zip檔案流等。
Java中IO流的分類
按流向分:
輸入流: 程式可以從中讀取資料的流。
輸出流: 程式能向其中寫入資料的流。
這裡的輸入流與輸出流是以程式為參考點來說的,所謂的輸入流就是程式從中獲取資料的流,輸出流就是程式要其寫資料的流。在輸入流的一邊是程式,而另一邊就是流的資料來源。而輸出流的一邊則目標,一邊就是程式。
按資料傳輸單位分:
位元組流: 以位元組為單位傳輸資料的流
字元流: 以字元為單位傳輸資料的流
因為檔案編碼的不同,就有了對字元進行高效操作的字元流物件,它的原理就是基於位元組流讀取位元組時去查了指定的碼錶。它和位元組流的區別有兩點:1、在讀取資料的時候,位元組流讀到一個位元組就返回一個位元組,字元流使用了位元組流讀到一個或多個位元組(一箇中文對應的位元組數是兩個,在UTF-8碼錶中是3個位元組)時,先去查指定的編碼表,再將查到的字元返回;2、位元組流可以處理所有型別的資料,如jpg、avi、mp3、wav等等,而字元流只能處理字元資料。所以可以根據處理的檔案不同考慮使用位元組流還是字元流,如果是純文字資料可以優先考慮字元流,否則使用位元組流。
按功能分:
節點流: 用於直接操作目標裝置的流
處理流: 是對一個已存在的流的連結和封裝,通過對資料進行處理為程式提供功能強大、靈活的讀寫功能。
節點流指的是可以從或向一個特定的地方(節點)讀寫資料;處理流則是對一個已存在的流的連線的封裝,通過所封裝的流的功能呼叫實現資料的讀寫。此外處理流的構造方法總是以一個其他的流物件做引數。一個流物件經過其他流的多次包裝,稱為流的連結。
最後的最後附一張我整理的Java中與IO相關的各個類的關係圖,當然也有幾個很少見的類就沒有寫上去,有興趣的可以去查查API手冊,之後我會對其中最常見的一些類做一些詳細的介紹,好了,今天的分享就到這裡,我們下次見。