Java--io系列--1途乃、目錄

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

08.java io系列08之 File總結

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的總體框架之后。接下來雹嗦,我們可以開始對其中的各個類進入學習范舀,包括“它的作用和用法,源碼的探索”等方面了罪。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末锭环,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子泊藕,更是在濱河造成了極大的恐慌辅辩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娃圆,死亡現場離奇詭異汽久,居然都是意外死亡,警方通過查閱死者的電腦和手機踊餐,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門景醇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吝岭,你說我怎么就攤上這事三痰。” “怎么了窜管?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵散劫,是天一觀的道長。 經常有香客問我幕帆,道長获搏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任失乾,我火速辦了婚禮常熙,結果婚禮上纬乍,老公的妹妹穿的比我還像新娘。我一直安慰自己裸卫,他們只是感情好仿贬,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著墓贿,像睡著了一般茧泪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上聋袋,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天队伟,我揣著相機與錄音,去河邊找鬼幽勒。 笑死缰泡,一個胖子當著我的面吹牛,可吹牛的內容都是我干的代嗤。 我是一名探鬼主播棘钞,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼干毅!你這毒婦竟也來了宜猜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤硝逢,失蹤者是張志新(化名)和其女友劉穎姨拥,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體渠鸽,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叫乌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了徽缚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憨奸。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凿试,靈堂內的尸體忽然破棺而出排宰,到底是詐尸還是另有隱情,我是刑警寧澤那婉,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布板甘,位于F島的核電站,受9級特大地震影響详炬,放射性物質發(fā)生泄漏盐类。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望在跳。 院中可真熱鬧枪萄,春花似錦、人聲如沸硬毕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吐咳。三九已至,卻和暖如春元践,著一層夾襖步出監(jiān)牢的瞬間韭脊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工单旁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沪羔,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓象浑,卻偏偏與公主長得像蔫饰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子愉豺,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容

  • tags:io categories:總結 date: 2017-03-28 22:49:50 不僅僅在JAVA領...
    行徑行閱讀 2,171評論 0 3
  • 1篓吁、IO流 1.1、概述 之前學習的File類它只能操作文件或文件夾蚪拦,并不能去操作文件中的數據杖剪。真正保存數據的是文...
    Villain丶Cc閱讀 2,660評論 0 5
  • 1 I/O流的概念,分類2 I/O所有類的結構圖及詳解3 何為NIO驰贷,和傳統(tǒng)I/O有何區(qū)別4 在開發(fā)中正確使用I/...
    艾剪疏閱讀 487評論 0 2
  • 1.java IO流的概念盛嘿,分類,類圖 1.1. java IO 流的概念 java的io是實現輸入和輸出的基礎括袒,...
    onlyHalfSoul閱讀 570評論 0 1
  • 什么是 CSS hack 簡單的說次兆,HACK就是只有特定瀏覽器才能識別這段hack代碼。Hack也可以說是讓前端最...
    好好頑閱讀 169評論 0 1