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部分怪嫌,以前學習過义锥。當時學習的節(jié)奏是,首先了解io的相關介紹岩灭,再查看io的使用示例拌倍,最后才是打開API參考文檔并參考文檔通過寫demo來學習。結果噪径,當時是了解了API的使用方法柱恤;可是一段時間之后,只能零零碎碎的記得一些片段找爱,再要自己講出個所以然來梗顺,已經非常之艱難。之所以造成這種困境车摄,我想主要是:一寺谤,學習的時候,理解的不夠徹底吮播,沒有真正理解它的思想和框架变屁。二,加之后來使用的較少意狠,加速了遺忘的速度粟关。在這里面,最根本的問題還是理解摄职,使用的目的也是為了更加深入的理解誊役。
最近获列,抽空整理以前所學的java基礎谷市。整理也就是重新學習的過程,在這個學習過程中击孩,我一直嘗試著站在一個更高的角度來看問題迫悠,將這些類和接口的原理和思想理解的更加透徹一些!在這里巩梢,將所學的東西分享出來创泄,一是共同提高;再者括蝠,有不足的地方或好的建議鞠抑,還希望各位讀者能指出。謝謝忌警!
轉載請注明出處:http://www.cnblogs.com/skywang12345/p/io_01.html
java io簡介
java io系統(tǒng)的設計初衷搁拙,就是為了實現“文件、控制臺、網絡設備”這些io設置的通信箕速。例如酪碘,對于一個文件,我們可以打開文件盐茎,然后進行讀取和寫入兴垦。
在java 1.0中,java提供的類都是以字節(jié)(byte)為單位字柠,例如探越,FileInputStream和FileOutputStream。而到了java 1.1募谎,為了與國際化進行接軌扶关,在java io中添加了許多以字符(Unicode)為單位進行操作的類。
在java io的稱呼中数冬,我們經常會提到“輸入流”节槐、“輸出流”等等概念。首先拐纱,什么是流呢铜异?
所謂“流”,就是一種抽象的數據的總稱秸架,它的本質是能夠進行傳輸揍庄。
a) 按照“流”的數據流向,可以將其化分為:輸入流和輸出流东抹。
b) 按照“流”中處理數據的單位蚂子,可以將其區(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é)數據岗喉。
(02) ByteArrayInputStream 是字節(jié)數組輸入流秋度。它包含一個內部緩沖區(qū),該緩沖區(qū)包含從流中讀取的字節(jié)钱床;通俗點說荚斯,它的內部緩沖區(qū)就是一個字節(jié)數組,而ByteArrayInputStream本質就是通過字節(jié)數組來實現的查牌。
(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. 以字節(jié)為單位的輸出流的框架圖
下面芋簿,是以字節(jié)為單位的輸出流的框架圖峡懈。
從中,我們可以看出与斤。以字節(jié)為單位的輸出流的公共父類是OutputStream肪康。
(01) OutputStream 是以字節(jié)為單位的輸出流的超類荚恶。OutputStream提供了write()接口從輸出流中讀取字節(jié)數據。
(02) ByteArrayOutputStream 是字節(jié)數組輸出流磷支。寫入ByteArrayOutputStream的數據被寫入一個 byte 數組谒撼。緩沖區(qū)會隨著數據的不斷寫入而自動增長∥肀罚可使用 toByteArray() 和 toString() 獲取數據廓潜。
(03) PipedOutputStream 是管道輸出流,它和PipedInputStream一起使用善榛,能實現多線程間的管道通信辩蛋。
(04) FilterOutputStream 是過濾輸出流。它是DataOutputStream移盆,BufferedOutputStream和PrintStream的超類悼院。
(05) DataOutputStream 是數據輸出流。它是用來裝飾其它輸出流咒循,它“允許應用程序以與機器無關方式向底層寫入基本 Java 數據類型”据途。
(06) BufferedOutputStream 是緩沖輸出流。它的作用是為另一個輸出流添加緩沖功能叙甸。
(07) PrintStream 是打印輸出流昨凡。它是用來裝飾其它輸出流,能為其他輸出流添加了功能蚁署,使它們能夠方便地打印各種數據值表示形式便脊。
(08) FileOutputStream 是文件輸出流。它通常用于向文件進行寫入操作光戈。
(09) ObjectOutputStream 是對象輸出流哪痰。它和ObjectInputStream一起,用來提供對“基本數據或對象”的持久存儲久妆。
3. 以字節(jié)為單位的輸入流和輸出流關聯的框架圖
輸入流和輸出流都有對應的關系晌杰,下面是將以字節(jié)為單位的輸入流和輸出流關聯起來的圖片。
4. 以字符為單位的輸入流的框架圖
下面筷弦,是以字符為單位的輸入流的框架圖肋演。
從中,我們可以看出烂琴。以字符為單位的輸入流的公共父類是Reader爹殊。
(01) Reader 是以字符為單位的輸入流的超類。它提供了read()接口來取字符數據奸绷。
(02) CharArrayReader 是字符數組輸入流梗夸。它用于讀取字符數組,它繼承于Reader号醉。操作的數據是以字符為單位反症!
(03) PipedReader 是字符類型的管道輸入流辛块。它和PipedWriter一起是可以通過管道進行線程間的通訊。在使用管道通信時铅碍,必須將PipedWriter和PipedReader配套使用润绵。
(04) FilterReader 是字符類型的過濾輸入流。
(05) BufferedReader 是字符緩沖輸入流胞谈。它的作用是為另一個輸入流添加緩沖功能授药。
(06) InputStreamReader 是字節(jié)轉字符的輸入流。它是字節(jié)流通向字符流的橋梁:它使用指定的 charset 讀取字節(jié)并將其解碼為字符呜魄。
(07) FileReader 是字符類型的文件輸入流悔叽。它通常用于對文件進行讀取操作。
5. 以字符為單位的輸出流的框架圖
下面爵嗅,是以字符為單位的輸出流的框架圖娇澎。
(01) Writer 是以字符為單位的輸出流的超類。它提供了write()接口往其中寫入數據睹晒。
(02) CharArrayWriter 是字符數組輸出流趟庄。它用于讀取字符數組,它繼承于Writer伪很。操作的數據是以字符為單位戚啥!
(03) PipedWriter 是字符類型的管道輸出流。它和PipedReader一起是可以通過管道進行線程間的通訊锉试。在使用管道通信時猫十,必須將PipedWriter和PipedWriter配套使用。
(04) FilterWriter 是字符類型的過濾輸出流呆盖。
(05) BufferedWriter 是字符緩沖輸出流拖云。它的作用是為另一個輸出流添加緩沖功能。
(06) OutputStreamWriter 是字節(jié)轉字符的輸出流应又。它是字節(jié)流通向字符流的橋梁:它使用指定的 charset 將字節(jié)轉換為字符并寫入宙项。
(07) FileWriter 是字符類型的文件輸出流。它通常用于對文件進行讀取操作株扛。
(08) PrintWriter 是字符類型的打印輸出流尤筐。它是用來裝飾其它輸出流,能為其他輸出流添加了功能洞就,使它們能夠方便地打印各種數據值表示形式盆繁。
6. 以字符為單位的輸入流和輸出流關聯的框架圖
下面是將以字符為單位的輸入流和輸出流關聯起來的圖片。
7. 字節(jié)轉換為字符流的框架圖
在java中奖磁,字節(jié)流能轉換為字符流改基,下面是它們的轉換關系圖繁疤。
從中咖为,我們可以看出秕狰。
(01) FileReader繼承于InputStreamReader,而InputStreamReader依賴于InputStream躁染。具體表現在InputStreamReader的構造函數是以InputStream為參數鸣哀。我們傳入InputStream,在InputStreamReader內部通過轉碼吞彤,將字節(jié)轉換成字符我衬。
(02) FileWriter繼承于OutputStreamWriter,而OutputStreamWriter依賴于OutputStream饰恕。具體表現在OutputStreamWriter的構造函數是以OutputStream為參數挠羔。我們傳入OutputStream,在OutputStreamWriter內部通過轉碼埋嵌,將字節(jié)轉換成字符破加。
8. 字節(jié)和字符的輸入流對應關系
9. 字節(jié)和字符的輸出流對應關系
認識了java io的總體框架之后。接下來雹嗦,我們可以開始對其中的各個類進入學習范舀,包括“它的作用和用法,源碼的探索”等方面了罪。