"IO"對(duì)程序語(yǔ)言的設(shè)計(jì)者來說是一項(xiàng)難度極高的任務(wù).編程思想中這樣說過,可見要把IO徹底搞清楚并非簡(jiǎn)單之事.我也苦心研究過IO但是還不能完全理解.只是理解了主要的一些功能.File類的名字極具的富有欺騙性,剛看或許會(huì)認(rèn)為是一個(gè)關(guān)于文件的類,但它不是.可以用它來表示某個(gè)文件的名字,也可以用它來表示目錄里的一組文件的名字.如果它表示的是一組文件,那么你還可以用list()方法來進(jìn)行查詢,它返回String數(shù)組.File類的功能不僅限于顯示文件或者目錄.還可以幫你創(chuàng)建心的目錄甚至是目錄路徑.此外還可以用來檢查文件的屬性,判斷文件是否存在,刪除文件等等N多功能.個(gè)人覺的IO流是J2SE的核心技術(shù)之一,雖然J2EE的程序員精通于它,但是掌握基本的流操作和原理也是很有必要的.說了半天什么是"流"呢?所謂"流"就是一種能生成或接受數(shù)據(jù)的,代表數(shù)據(jù)的源和目標(biāo)的對(duì)象,流把I/O設(shè)備內(nèi)部的具體操作封裝了起來.JDK文檔上說到JAVA的I/O類庫(kù)分成輸入和輸出兩大部分也就是通常說的讀和寫.所有的InputStream和Reader的派生類都有一個(gè)基本的繼承來的能讀取單個(gè)或者byte數(shù)組的read()方法.反之所有的OutputStream和Writer的派生類都有一個(gè)基本的能寫入單個(gè)或byte數(shù)組的write()方法.
InputStream的任務(wù)就是代表那些從各種輸入源獲取數(shù)據(jù)的類,這些源主要有byte數(shù)組,String對(duì)象,文件,管道,流序列,Internet.這些數(shù)據(jù)源各自都有與之相對(duì)應(yīng)的InputStream的子類.
1)ByteArrayInputStream:以緩沖區(qū)內(nèi)存為InputStream
2)StringBufferInputStream:以String為InputStream
3)FileInputStream:專門用來讀文件
4)PipedInputStream:從PipedOutputStream提取數(shù)據(jù)實(shí)現(xiàn)"管道"功能
5)SequenceInputStream:把兩個(gè)或者多個(gè)InputStream合并成一個(gè).
6)FilterInputStream:一個(gè)為decorator定義接口用的抽象類.
OutputStream是解決往哪里輸出的類,是byte數(shù)組,文件或者是管道.
1)ByteArrayOutputStream:在內(nèi)存里創(chuàng)建一個(gè)緩沖區(qū),數(shù)據(jù)送到流里就是寫入這個(gè)緩沖區(qū).
2)FileOutputStream:把數(shù)據(jù)寫入文件.
3)PipedOutputStream:寫入這個(gè)流的數(shù)據(jù),最終都會(huì)變成與之相關(guān)聯(lián)的PipedInputStream的數(shù)據(jù)源.
4)FilterOutputStream:一個(gè)能decorator提供接口的抽象類.
自從java1.1對(duì)最底層的I/O流類庫(kù)作了重大修改之后,我們看到了Reader和Writer,這個(gè)時(shí)候我們也許會(huì)想reader和writer是不是要取代InputStream和OutputStream呢?不過事實(shí)并非如此,雖然InputStream和OutputStream的部分功能已經(jīng)被淘汰(你繼續(xù)用編譯會(huì)有異常),但是仍然有很多東西是有價(jià)值的,它們是面向byte的I/O流,也就是字節(jié)流.而Reader和Writer則提供的是Unicode的兼容,也就是字符類.Reader和Writer(我稱為讀流和寫流)我覺的主要的用途在與國(guó)際化問題.而原來的I/O類庫(kù)只支持8位的字節(jié),也就是輸入輸出流,因?yàn)椴荒芎芎玫奶幚?6位的unicode字符.這里說一個(gè)概念就是"標(biāo)準(zhǔn)I/O"是Unix的概念,它的意思是一個(gè)程序使用一個(gè)信息流.所有輸入都是從"標(biāo)準(zhǔn)輸入"流進(jìn)來的,輸出都是從"標(biāo)準(zhǔn)輸出"出去的.錯(cuò)誤的消息有"標(biāo)準(zhǔn)錯(cuò)誤"標(biāo)準(zhǔn)I/O的優(yōu)點(diǎn)是可以很容易的和程序串連起來,并且把一個(gè)程序的輸出當(dāng)作另一個(gè)程序的輸入.新IO是JAVA1.4引入的一個(gè)新的I/O類庫(kù),位于"java.nio.*"包,這么做只有一個(gè)目的就是速度.不過至于這個(gè)包中的類我還沒具體的使用過HOHO.
JAVA的"對(duì)象系列化"能讓一個(gè)實(shí)現(xiàn)了Serializable接口的對(duì)象轉(zhuǎn)換成一組byte,這樣日后要用這個(gè)對(duì)象的時(shí)候,就可以從byte數(shù)據(jù)恢復(fù)出來,簡(jiǎn)單的說就是把對(duì)象保存在外部文件中.而且這種方法也是跨平臺(tái)的,你無需考慮自己的對(duì)象文件應(yīng)用于什么平臺(tái),這些技術(shù)細(xì)節(jié)虛擬機(jī)為我們實(shí)現(xiàn)了.序列化一個(gè)對(duì)象還是比較簡(jiǎn)單的,只要讓它實(shí)現(xiàn)Serializable接口就行了(這是一個(gè)標(biāo)記接口(tagging interface)沒有方法的接口).但是,當(dāng)語(yǔ)言引入序列化概念之后,它的很多標(biāo)準(zhǔn)類庫(kù)的類,包括primitive的wrapper類,所有的容器類,以及別的很多類,都會(huì)相應(yīng)地發(fā)生改變.甚至連Class對(duì)象都會(huì)被序列化.要想序列化對(duì)象,你必須先創(chuàng)建一個(gè)OutputStream,然后把它嵌進(jìn)ObjectOutputStream.這時(shí),你就能用writeObject( )方法把對(duì)象寫入OutputStream了.讀的時(shí)候,你得把InputStream嵌到ObjectInputStream里面,然后再調(diào)用readObject( )方法.不過這樣讀出來的,只是一個(gè)Object的對(duì)象.對(duì)象序列化的重要用途就是Bean技術(shù)和RMI(遠(yuǎn)程方法調(diào)用).
如果想深刻學(xué)習(xí)掌握JAVA的I/O流,我在這里推薦Elliotte Rusty Harold寫的<<Java I/O>>(O’Reilly, 1999)這本書.
posted on 2005-11-16 19:26
我心依舊 閱讀(5227)
評(píng)論(6) 編輯 收藏