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之 序列化總結(jié)(Serializable 和 Externalizable)
07.java io系列07之 FileInputStream和FileOutputStream
09.java io系列09之 FileDescriptor總結(jié)
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(數(shù)據(jù)輸入流)的認知、源碼和示例
15.java io系列15之 DataOutputStream(數(shù)據(jù)輸出流)的認知、源碼和示例
16.java io系列16之 PrintStream(打印輸出流)詳解
17.java io系列17之 System.out.println("hello world")原理
18.java io系列18之 CharArrayReader(字符數(shù)組輸入流)
19.java io系列19之 CharArrayWriter(字符數(shù)組輸出流)
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
前言
關(guān)于java的io部分,以前學習過。當時學習的節(jié)奏是,首先了解io的相關(guān)介紹,再查看io的使用示例,最后才是打開API參考文檔并參考文檔通過寫demo來學習。結(jié)果,當時是了解了API的使用方法;可是一段時間之后,只能零零碎碎的記得一些片段,再要自己講出個所以然來,已經(jīng)非常之艱難。之所以造成這種困境,我想主要是:一,學習的時候,理解的不夠徹底,沒有真正理解它的思想和框架。二,加之后來使用的較少,加速了遺忘的速度。在這里面,最根本的問題還是理解,使用的目的也是為了更加深入的理解。
最近,抽空整理以前所學的java基礎(chǔ)。整理也就是重新學習的過程,在這個學習過程中,我一直嘗試著站在一個更高的角度來看問題,將這些類和接口的原理和思想理解的更加透徹一些!在這里,將所學的東西分享出來,一是共同提高;再者,有不足的地方或好的建議,還希望各位讀者能指出。謝謝!
轉(zhuǎn)載請注明出處:http://www.cnblogs.com/skywang12345/p/io_01.html
java io簡介
java io系統(tǒng)的設計初衷,就是為了實現(xiàn)“文件、控制臺、網(wǎng)絡設備”這些io設置的通信。例如,對于一個文件,我們可以打開文件,然后進行讀取和寫入。
在java 1.0中,java提供的類都是以字節(jié)(byte)為單位,例如,F(xiàn)ileInputStream和FileOutputStream。而到了java 1.1,為了與國際化進行接軌,在java io中添加了許多以字符(Unicode)為單位進行操作的類。
在java io的稱呼中,我們經(jīng)常會提到“輸入流”、“輸出流”等等概念。首先,什么是流呢?
所謂“流”,就是一種抽象的數(shù)據(jù)的總稱,它的本質(zhì)是能夠進行傳輸。
a) 按照“流”的數(shù)據(jù)流向,可以將其化分為:輸入流和輸出流。
b) 按照“流”中處理數(shù)據(jù)的單位,可以將其區(qū)分為:字節(jié)流和字符流。在java中,字節(jié)是占1個Byte,即8位;而字符是占2個Byte,即16位。而且,需要注意的是,java的字節(jié)是有符號類型,而字符是無符號類型!
java io框架
有了上面的基本概念之后,我們看看java io的框架。
1. 以字節(jié)為單位的輸入流的框架圖
下面,是以字節(jié)為單位的輸入流的框架圖。
從中,我們可以看出。
(01) InputStream 是以字節(jié)為單位的輸入流的超類。InputStream提供了read()接口從輸入流中讀取字節(jié)數(shù)據(jù)。
(02) ByteArrayInputStream 是字節(jié)數(shù)組輸入流。它包含一個內(nèi)部緩沖區(qū),該緩沖區(qū)包含從流中讀取的字節(jié);通俗點說,它的內(nèi)部緩沖區(qū)就是一個字節(jié)數(shù)組,而ByteArrayInputStream本質(zhì)就是通過字節(jié)數(shù)組來實現(xiàn)的。
(03) PipedInputStream 是管道輸入流,它和PipedOutputStream一起使用,能實現(xiàn)多線程間的管道通信。
(04) FilterInputStream 是過濾輸入流。它是DataInputStream和BufferedInputStream的超類。
(05) DataInputStream 是數(shù)據(jù)輸入流。它是用來裝飾其它輸入流,它“允許應用程序以與機器無關(guān)方式從底層輸入流中讀取基本 Java 數(shù)據(jù)類型”。
(06) BufferedInputStream 是緩沖輸入流。它的作用是為另一個輸入流添加緩沖功能。
(07) File 是“文件”和“目錄路徑名”的抽象表示形式。關(guān)于File,注意兩點:
a), File不僅僅只是表示文件,它也可以表示目錄!
b), File雖然在io保重定義,但是它的超類是Object,而不是InputStream。
(08) FileDescriptor 是“文件描述符”。它可以被用來表示開放文件、開放套接字等。
(09) FileInputStream 是文件輸入流。它通常用于對文件進行讀取操作。
(10) ObjectInputStream 是對象輸入流。它和ObjectOutputStream一起,用來提供對“基本數(shù)據(jù)或?qū)ο蟆钡某志么鎯Α?/p>
2. 以字節(jié)為單位的輸出流的框架圖
下面,是以字節(jié)為單位的輸出流的框架圖。
從中,我們可以看出。以字節(jié)為單位的輸出流的公共父類是OutputStream。
(01) OutputStream 是以字節(jié)為單位的輸出流的超類。OutputStream提供了write()接口從輸出流中讀取字節(jié)數(shù)據(jù)。
(02) ByteArrayOutputStream 是字節(jié)數(shù)組輸出流。寫入ByteArrayOutputStream的數(shù)據(jù)被寫入一個 byte 數(shù)組。緩沖區(qū)會隨著數(shù)據(jù)的不斷寫入而自動增長??墒褂?toByteArray() 和 toString() 獲取數(shù)據(jù)。
(03) PipedOutputStream 是管道輸出流,它和PipedInputStream一起使用,能實現(xiàn)多線程間的管道通信。
(04) FilterOutputStream 是過濾輸出流。它是DataOutputStream,BufferedOutputStream和PrintStream的超類。
(05) DataOutputStream 是數(shù)據(jù)輸出流。它是用來裝飾其它輸出流,它“允許應用程序以與機器無關(guān)方式向底層寫入基本 Java 數(shù)據(jù)類型”。
(06) BufferedOutputStream 是緩沖輸出流。它的作用是為另一個輸出流添加緩沖功能。
(07) PrintStream 是打印輸出流。它是用來裝飾其它輸出流,能為其他輸出流添加了功能,使它們能夠方便地打印各種數(shù)據(jù)值表示形式。
(08) FileOutputStream 是文件輸出流。它通常用于向文件進行寫入操作。
(09) ObjectOutputStream 是對象輸出流。它和ObjectInputStream一起,用來提供對“基本數(shù)據(jù)或?qū)ο蟆钡某志么鎯Α?/p>
3. 以字節(jié)為單位的輸入流和輸出流關(guān)聯(lián)的框架圖
輸入流和輸出流都有對應的關(guān)系,下面是將以字節(jié)為單位的輸入流和輸出流關(guān)聯(lián)起來的圖片。
4. 以字符為單位的輸入流的框架圖
下面,是以字符為單位的輸入流的框架圖。
從中,我們可以看出。以字符為單位的輸入流的公共父類是Reader。
(01) Reader 是以字符為單位的輸入流的超類。它提供了read()接口來取字符數(shù)據(jù)。
(02) CharArrayReader 是字符數(shù)組輸入流。它用于讀取字符數(shù)組,它繼承于Reader。操作的數(shù)據(jù)是以字符為單位!
(03) PipedReader 是字符類型的管道輸入流。它和PipedWriter一起是可以通過管道進行線程間的通訊。在使用管道通信時,必須將PipedWriter和PipedReader配套使用。
(04) FilterReader 是字符類型的過濾輸入流。
(05) BufferedReader 是字符緩沖輸入流。它的作用是為另一個輸入流添加緩沖功能。
(06) InputStreamReader 是字節(jié)轉(zhuǎn)字符的輸入流。它是字節(jié)流通向字符流的橋梁:它使用指定的 charset 讀取字節(jié)并將其解碼為字符。
(07) FileReader 是字符類型的文件輸入流。它通常用于對文件進行讀取操作。
5. 以字符為單位的輸出流的框架圖
下面,是以字符為單位的輸出流的框架圖。
(01) Writer 是以字符為單位的輸出流的超類。它提供了write()接口往其中寫入數(shù)據(jù)。
(02) CharArrayWriter 是字符數(shù)組輸出流。它用于讀取字符數(shù)組,它繼承于Writer。操作的數(shù)據(jù)是以字符為單位!
(03) PipedWriter 是字符類型的管道輸出流。它和PipedReader一起是可以通過管道進行線程間的通訊。在使用管道通信時,必須將PipedWriter和PipedWriter配套使用。
(04) FilterWriter 是字符類型的過濾輸出流。
(05) BufferedWriter 是字符緩沖輸出流。它的作用是為另一個輸出流添加緩沖功能。
(06) OutputStreamWriter 是字節(jié)轉(zhuǎn)字符的輸出流。它是字節(jié)流通向字符流的橋梁:它使用指定的 charset 將字節(jié)轉(zhuǎn)換為字符并寫入。
(07) FileWriter 是字符類型的文件輸出流。它通常用于對文件進行讀取操作。
(08) PrintWriter 是字符類型的打印輸出流。它是用來裝飾其它輸出流,能為其他輸出流添加了功能,使它們能夠方便地打印各種數(shù)據(jù)值表示形式。
6. 以字符為單位的輸入流和輸出流關(guān)聯(lián)的框架圖
下面是將以字符為單位的輸入流和輸出流關(guān)聯(lián)起來的圖片。
7. 字節(jié)轉(zhuǎn)換為字符流的框架圖
在java中,字節(jié)流能轉(zhuǎn)換為字符流,下面是它們的轉(zhuǎn)換關(guān)系圖。
從中,我們可以看出。
(01) FileReader繼承于InputStreamReader,而InputStreamReader依賴于InputStream。具體表現(xiàn)在InputStreamReader的構(gòu)造函數(shù)是以InputStream為參數(shù)。我們傳入InputStream,在InputStreamReader內(nèi)部通過轉(zhuǎn)碼,將字節(jié)轉(zhuǎn)換成字符。
(02) FileWriter繼承于OutputStreamWriter,而OutputStreamWriter依賴于OutputStream。具體表現(xiàn)在OutputStreamWriter的構(gòu)造函數(shù)是以OutputStream為參數(shù)。我們傳入OutputStream,在OutputStreamWriter內(nèi)部通過轉(zhuǎn)碼,將字節(jié)轉(zhuǎn)換成字符。
8. 字節(jié)和字符的輸入流對應關(guān)系
9. 字節(jié)和字符的輸出流對應關(guān)系
認識了java io的總體框架之后。接下來,我們可以開始對其中的各個類進入學習,包括“它的作用和用法,源碼的探索”等方面。