天天看點

java io系列

總結的全是很好,值得學習!

原文中對IO的各個方法都有講述!

前言

關于java的io部分,以前學習過。當時學習的節奏是,首先了解io的相關介紹,再檢視io的使用示例,最後才是打開API參考文檔并參考文檔通過寫demo來學習。結果,當時是了解了API的使用方法;可是一段時間之後,隻能零零碎碎的記得一些片段,再要自己講出個是以然來,已經非常之艱難。之是以造成這種困境,我想主要是:一,學習的時候,了解的不夠徹底,沒有真正了解它的思想和架構。二,加之後來使用的較少,加速了遺忘的速度。在這裡面,最根本的問題還是了解,使用的目的也是為了更加深入的了解。

最近,抽空整理以前所學的java基礎。整理也就是重新學習的過程,在這個學習過程中,我一直嘗試着站在一個更高的角度來看問題,将這些類和接口的原理和思想了解的更加透徹一些!在這裡,将所學的東西分享出來,一是共同提高;再者,有不足的地方或好的建議,還希望各位讀者能指出。謝謝!

java io簡介

java io系統的設計初衷,就是為了實作“檔案、控制台、網絡裝置”這些io設定的通信。例如,對于一個檔案,我們可以打開檔案,然後進行讀取和寫入。

在java 1.0中,java提供的類都是以位元組(byte)為機關,例如,FileInputStream和FileOutputStream。而到了java 1.1,為了與國際化進行接軌,在java io中添加了許多以字元(Unicode)為機關進行操作的類。

在java io的稱呼中,我們經常會提到“輸入流”、“輸出流”等等概念。首先,什麼是流呢?

所謂“流”,就是一種抽象的資料的總稱,它的本質是能夠進行傳輸。

      a) 按照“流”的資料流向,可以将其化分為:輸入流和輸出流。

      b) 按照“流”中處理資料的機關,可以将其區分為:位元組流和字元流。在java中,位元組是占1個Byte,即8位;而字元是占2個Byte,即16位。而且,需要注意的是,java的位元組是有符号類型,而字元是無符号類型!

java io架構

有了上面的基本概念之後,我們看看java io的架構。

1. 以位元組為機關的輸入流的架構圖

下面,是以位元組為機關的輸入流的架構圖。

​​

java io系列

​​

從中,我們可以看出。

(01) InputStream 是以位元組為機關的輸入流的超類。InputStream提供了read()接口從輸入流中讀取位元組資料。

(02) ByteArrayInputStream 是位元組數組輸入流。它包含一個内部緩沖區,該緩沖區包含從流中讀取的位元組;通俗點說,它的内部緩沖區就是一個位元組數組,而ByteArrayInputStream本質就是通過位元組數組來實作的。

(03) PipedInputStream 是管道輸入流,它和PipedOutputStream一起使用,能實作多線程間的管道通信。

(04) FilterInputStream 是過濾輸入流。它是DataInputStream和BufferedInputStream的超類。

(05) DataInputStream 是資料輸入流。它是用來裝飾其它輸入流,它“允許應用程式以與機器無關方式從底層輸入流中讀取基本 Java 資料類型”。

(06) BufferedInputStream 是緩沖輸入流。它的作用是為另一個輸入流添加緩沖功能。

(07) File 是“檔案”和“目錄路徑名”的抽象表示形式。關于File,注意兩點:

a), File不僅僅隻是表示檔案,它也可以表示目錄!

b), File雖然在io保重定義,但是它的超類是Object,而不是InputStream。

(08) FileDescriptor 是“檔案描述符”。它可以被用來表示開放檔案、開放套接字等。

(09) FileInputStream 是檔案輸入流。它通常用于對檔案進行讀取操作。

(10) ObjectInputStream 是對象輸入流。它和ObjectOutputStream一起,用來提供對“基本資料或對象”的持久存儲。

2. 以位元組為機關的輸出流的架構圖

下面,是以位元組為機關的輸出流的架構圖。

​​

java io系列

​​

從中,我們可以看出。以位元組為機關的輸出流的公共父類是OutputStream。

(01) OutputStream 是以位元組為機關的輸出流的超類。OutputStream提供了write()接口從輸出流中讀取位元組資料。

(02) ByteArrayOutputStream 是位元組數組輸出流。寫入ByteArrayOutputStream的資料被寫入一個 byte 數組。緩沖區會随着資料的不斷寫入而自動增長。可使用 toByteArray() 和 toString() 擷取資料。

(03) PipedOutputStream 是管道輸出流,它和PipedInputStream一起使用,能實作多線程間的管道通信。

(04) FilterOutputStream 是過濾輸出流。它是DataOutputStream,BufferedOutputStream和PrintStream的超類。

(05) DataOutputStream 是資料輸出流。它是用來裝飾其它輸出流,它“允許應用程式以與機器無關方式向底層寫入基本 Java 資料類型”。

(06) BufferedOutputStream 是緩沖輸出流。它的作用是為另一個輸出流添加緩沖功能。

(07) PrintStream 是列印輸出流。它是用來裝飾其它輸出流,能為其他輸出流添加了功能,使它們能夠友善地列印各種資料值表示形式。

(08) FileOutputStream 是檔案輸出流。它通常用于向檔案進行寫入操作。

(09) ObjectOutputStream 是對象輸出流。它和ObjectInputStream一起,用來提供對“基本資料或對象”的持久存儲。

3. 以位元組為機關的輸入流和輸出流關聯的架構圖

輸入流和輸出流都有對應的關系,下面是将以位元組為機關的輸入流和輸出流關聯起來的圖檔。

​​

java io系列

​​

4. 以字元為機關的輸入流的架構圖

下面,是以字元為機關的輸入流的架構圖。

​​

java io系列

​​

從中,我們可以看出。以字元為機關的輸入流的公共父類是Reader。

(01) Reader 是以字元為機關的輸入流的超類。它提供了read()接口來取字元資料。

(02) CharArrayReader 是字元數組輸入流。它用于讀取字元數組,它繼承于Reader。操作的資料是以字元為機關!

(03) PipedReader 是字元類型的管道輸入流。它和PipedWriter一起是可以通過管道進行線程間的通訊。在使用管道通信時,必須将PipedWriter和PipedReader配套使用。

(04) FilterReader 是字元類型的過濾輸入流。

(05) BufferedReader 是字元緩沖輸入流。它的作用是為另一個輸入流添加緩沖功能。

(06) InputStreamReader 是位元組轉字元的輸入流。它是位元組流通向字元流的橋梁:它使用指定的 charset 讀取位元組并将其解碼為字元。

(07) FileReader 是字元類型的檔案輸入流。它通常用于對檔案進行讀取操作。

5. 以字元為機關的輸出流的架構圖

下面,是以字元為機關的輸出流的架構圖。

​​

java io系列

​​​ (01) Writer 是以字元為機關的輸出流的超類。它提供了write()接口往其中寫入資料。

(02) CharArrayWriter 是字元數組輸出流。它用于讀取字元數組,它繼承于Writer。操作的資料是以字元為機關!

(03) PipedWriter 是字元類型的管道輸出流。它和PipedReader一起是可以通過管道進行線程間的通訊。在使用管道通信時,必須将PipedWriter和PipedWriter配套使用。

(04) FilterWriter 是字元類型的過濾輸出流。

(05) BufferedWriter 是字元緩沖輸出流。它的作用是為另一個輸出流添加緩沖功能。

(06) OutputStreamWriter 是位元組轉字元的輸出流。它是位元組流通向字元流的橋梁:它使用指定的 charset 将位元組轉換為字元并寫入。

(07) FileWriter 是字元類型的檔案輸出流。它通常用于對檔案進行讀取操作。

(08) PrintWriter 是字元類型的列印輸出流。它是用來裝飾其它輸出流,能為其他輸出流添加了功能,使它們能夠友善地列印各種資料值表示形式。

6. 以字元為機關的輸入流和輸出流關聯的架構圖

下面是将以字元為機關的輸入流和輸出流關聯起來的圖檔。

​​

java io系列

​​

7. 位元組轉換為字元流的架構圖

在java中,位元組流能轉換為字元流,下面是它們的轉換關系圖。

​​

java io系列

​​

從中,我們可以看出。

(01) FileReader繼承于InputStreamReader,而InputStreamReader依賴于InputStream。具體表現在InputStreamReader的構造函數是以InputStream為參數。我們傳入InputStream,在InputStreamReader内部通過轉碼,将位元組轉換成字元。

(02) FileWriter繼承于OutputStreamWriter,而OutputStreamWriter依賴于OutputStream。具體表現在OutputStreamWriter的構造函數是以OutputStream為參數。我們傳入OutputStream,在OutputStreamWriter内部通過轉碼,将位元組轉換成字元。

8. 位元組和字元的輸入流對應關系

​​

java io系列

​​

9. 位元組和字元的輸出流對應關系

​​