java io 系列目錄如下:
02. java io系列02之 ByteArrayInputStream的簡介,源碼分析和示例(包括InputStream)
03. java io系列03之 ByteArrayOutputStream的簡介,源碼分析和示例(包括OutputStream)
04. java io系列04之 管道(PipedOutputStream和PipedInputStream)的簡介,源碼分析和示例
05. java io系列05之 ObjectInputStream 和 ObjectOutputStream
06. java io系列06之 序列化總結(Serializable 和 Externalizable)
07. java io系列07之 FileInputStream和FileOutputStream
09. java io系列09之 FileDescriptor總結
10. java io系列10之 FilterInputStream
11. java io系列11之 FilterOutputStream
12. java io系列12之 BufferedInputStream(緩沖輸入流)的認知、源碼和示例
13. java io系列13之 BufferedOutputStream(緩沖輸出流)的認知、源碼和示例
14. java io系列14之 DataInputStream(數據輸入流)的認知、源碼和示例
15. java io系列15之 DataOutputStream(數據輸出流)的認知、源碼和示例
16. java io系列16之 PrintStream(打印輸出流)詳解
17. java io系列17之 System.out.println("hello world")原理
18. java io系列18之 CharArrayReader(字符數組輸入流)
19. java io系列19之 CharArrayWriter(字符數組輸出流)
20. java io系列20之 PipedReader和PipedWriter
21. java io系列21之 InputStreamReader和OutputStreamWriter
22. java io系列22之 FileReader和FileWriter
23. java io系列23之 BufferedReader(字符緩沖輸入流)
24. java io系列24之 BufferedWriter(字符緩沖輸出流)
25. java io系列25之 PrintWriter (字符打印輸出流)
26. java io系列26之 RandomAccessFile
前言
關於java的io部分,以前學習過。當時學習的節奏是,首先了解io的相關介紹,再查看io的使用示例,最后才是打開API參考文檔並參考文檔通過寫demo來學習。結果,當時是了解了API的使用方法;可是一段時間之后,只能零零碎碎的記得一些片段,再要自己講出個所以然來,已經非常之艱難。之所以造成這種困境,我想主要是:一,學習的時候,理解的不夠徹底,沒有真正理解它的思想和框架。二,加之后來使用的較少,加速了遺忘的速度。在這里面,最根本的問題還是理解,使用的目的也是為了更加深入的理解。
最近,抽空整理以前所學的java基礎。整理也就是重新學習的過程,在這個學習過程中,我一直嘗試着站在一個更高的角度來看問題,將這些類和接口的原理和思想理解的更加透徹一些!在這里,將所學的東西分享出來,一是共同提高;再者,有不足的地方或好的建議,還希望各位讀者能指出。謝謝!
轉載請注明出處:http://www.cnblogs.com/skywang12345/p/io_01.html
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. 以字節為單位的輸入流的框架圖
下面,是以字節為單位的輸入流的框架圖。
從中,我們可以看出。
(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. 以字節為單位的輸出流的框架圖
下面,是以字節為單位的輸出流的框架圖。
從中,我們可以看出。以字節為單位的輸出流的公共父類是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. 以字節為單位的輸入流和輸出流關聯的框架圖
輸入流和輸出流都有對應的關系,下面是將以字節為單位的輸入流和輸出流關聯起來的圖片。
4. 以字符為單位的輸入流的框架圖
下面,是以字符為單位的輸入流的框架圖。
從中,我們可以看出。以字符為單位的輸入流的公共父類是Reader。
(01) Reader 是以字符為單位的輸入流的超類。它提供了read()接口來取字符數據。
(02) CharArrayReader 是字符數組輸入流。它用於讀取字符數組,它繼承於Reader。操作的數據是以字符為單位!
(03) PipedReader 是字符類型的管道輸入流。它和PipedWriter一起是可以通過管道進行線程間的通訊。在使用管道通信時,必須將PipedWriter和PipedReader配套使用。
(04) FilterReader 是字符類型的過濾輸入流。
(05) BufferedReader 是字符緩沖輸入流。它的作用是為另一個輸入流添加緩沖功能。
(06) InputStreamReader 是字節轉字符的輸入流。它是字節流通向字符流的橋梁:它使用指定的 charset 讀取字節並將其解碼為字符。
(07) FileReader 是字符類型的文件輸入流。它通常用於對文件進行讀取操作。
5. 以字符為單位的輸出流的框架圖
下面,是以字符為單位的輸出流的框架圖。

(01) Writer 是以字符為單位的輸出流的超類。它提供了write()接口往其中寫入數據。
(02) CharArrayWriter 是字符數組輸出流。它用於讀取字符數組,它繼承於Writer。操作的數據是以字符為單位!
(03) PipedWriter 是字符類型的管道輸出流。它和PipedReader一起是可以通過管道進行線程間的通訊。在使用管道通信時,必須將PipedWriter和PipedWriter配套使用。
(04) FilterWriter 是字符類型的過濾輸出流。
(05) BufferedWriter 是字符緩沖輸出流。它的作用是為另一個輸出流添加緩沖功能。
(06) OutputStreamWriter 是字節轉字符的輸出流。它是字節流通向字符流的橋梁:它使用指定的 charset 將字節轉換為字符並寫入。
(07) FileWriter 是字符類型的文件輸出流。它通常用於對文件進行讀取操作。
(08) PrintWriter 是字符類型的打印輸出流。它是用來裝飾其它輸出流,能為其他輸出流添加了功能,使它們能夠方便地打印各種數據值表示形式。
6. 以字符為單位的輸入流和輸出流關聯的框架圖
下面是將以字符為單位的輸入流和輸出流關聯起來的圖片。
7. 字節轉換為字符流的框架圖
在java中,字節流能轉換為字符流,下面是它們的轉換關系圖。
從中,我們可以看出。
(01) FileReader繼承於InputStreamReader,而InputStreamReader依賴於InputStream。具體表現在InputStreamReader的構造函數是以InputStream為參數。我們傳入InputStream,在InputStreamReader內部通過轉碼,將字節轉換成字符。
(02) FileWriter繼承於OutputStreamWriter,而OutputStreamWriter依賴於OutputStream。具體表現在OutputStreamWriter的構造函數是以OutputStream為參數。我們傳入OutputStream,在OutputStreamWriter內部通過轉碼,將字節轉換成字符。
8. 字節和字符的輸入流對應關系
9. 字節和字符的輸出流對應關系

認識了java io的總體框架之后。接下來,我們可以開始對其中的各個類進入學習,包括“它的作用和用法,源碼的探索”等方面。
更多內容







