第十章IO流的其他知識(shí)點(diǎn).ppt_第1頁(yè)
第十章IO流的其他知識(shí)點(diǎn).ppt_第2頁(yè)
第十章IO流的其他知識(shí)點(diǎn).ppt_第3頁(yè)
第十章IO流的其他知識(shí)點(diǎn).ppt_第4頁(yè)
第十章IO流的其他知識(shí)點(diǎn).ppt_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、IO流的其他知識(shí)點(diǎn) 第十章,Scanner類簡(jiǎn)介 數(shù)據(jù)操作流 合并流 ZIP壓縮輸入/輸出流簡(jiǎn)介 ZipFile類 ZipInputStream類 回退流 基本概念與Serializable接口 實(shí)例操作-單人信息管理程序,Scanner類簡(jiǎn)介,1 Scanner類簡(jiǎn)介 在JDK 1.5之后Java提供了專門的輸入數(shù)據(jù)類,此類不只可以完成輸入數(shù)據(jù)操作,也可以方便地對(duì)輸入數(shù)據(jù)進(jìn)行驗(yàn)證。此類存放在java.util包中,其常用方法如表12-14所示。,Scanner類的常用方法,U提示: Scanner類可以接收任意的輸入流。 在Scanner類中提供了一個(gè)可以接收InputStream類型的構(gòu)造

2、方法,這就表示只要是字節(jié)輸入流的子類都可以通過(guò)Scanner類進(jìn)行方便的讀取。,2 使用Scanner類輸入數(shù)據(jù)(1) 1實(shí)例操作一:實(shí)現(xiàn)基本的數(shù)據(jù)輸入 最簡(jiǎn)單的數(shù)據(jù)輸入直接使用Scanner類的next()方法即可。,范例:輸入數(shù)據(jù),但是,如果在以上程序中輸入了帶有空格的內(nèi)容,則只能取出空格之前的數(shù)據(jù),代碼如下所示:,從運(yùn)行結(jié)果中可以發(fā)現(xiàn),空格后的數(shù)據(jù)沒(méi)有了,造成這樣的結(jié)果是因?yàn)镾canner將空格當(dāng)作了一個(gè)分隔符,所以為了保證程序的正確,可以將分隔符號(hào)修改為n(回車)。,范例:修改輸入數(shù)據(jù)的分隔符,以上代碼完成了字符串內(nèi)容的輸入,如果要輸入int或float類型的數(shù)據(jù),在Scanner類中

3、也有支持,但是在輸入之前最好先使用hasNextXxx()方法進(jìn)行驗(yàn)證,代碼如下所示。,范例:輸入int、float,2實(shí)例操作二:實(shí)現(xiàn)日期格式的數(shù)據(jù)輸入 在Scanner類中沒(méi)有提供專門的日期格式輸入操作,所以,如果想得到一個(gè)日期類型的數(shù)據(jù),則必須自己編寫(xiě)正則驗(yàn)證,并手工轉(zhuǎn)換。以下代碼演示了具體的操作。,范例:得到日期,3實(shí)例操作三:從文件中得到數(shù)據(jù) 如果要從文件中取得數(shù)據(jù),則直接將File類的實(shí)例傳入到Scanner的構(gòu)造方法中即可。例如,現(xiàn)在要顯示d:test.txt中的內(nèi)容,則可以采用以下的代碼,此文件的內(nèi)容如圖所示。,范例:讀取test.txt文件,從Scanner類的操作中可以發(fā)現(xiàn)

4、,Scanner類有默認(rèn)的分隔符,這樣如果在文件中存在換行,則表示一次輸入結(jié)束,所以本程序采用循環(huán)的方式讀取,并在每次讀完一行之后加入換行符,因?yàn)樽x取時(shí)內(nèi)容需要反復(fù)修改,所以使用StringBuffer類以提升操作性能。,數(shù)據(jù)操作流,在IO包中,提供了兩個(gè)與平臺(tái)無(wú)關(guān)的數(shù)據(jù)操作流,分別為數(shù)據(jù)輸出流(DataOutputStream)和數(shù)據(jù)輸入流(DataInputStream),通常數(shù)據(jù)輸出流會(huì)按照一定的格式將數(shù)據(jù)輸出,再通過(guò)數(shù)據(jù)輸入流按照一定的格式將數(shù)據(jù)讀入,這樣可以方便地對(duì)數(shù)據(jù)進(jìn)行處理。 例如,有表所示的一組表示訂單的數(shù)據(jù)。,訂單數(shù)據(jù),如果要將以上數(shù)據(jù)保存到文件中,就可以使用數(shù)據(jù)輸出流將內(nèi)容

5、保存到文件,然后再使用數(shù)據(jù)輸入流從文件中讀取進(jìn)來(lái)。,1 DataOutputStream類 DataOutputStream是OutputStream的子類,此類的定義如下: public class DataOutputStream extends FilterOutputStream implements DataOutput 此類繼承自FilterOutputStream類(FilterOutputStream是OutputStream的子類),同時(shí)實(shí)現(xiàn)了DataOutput接口,在DataOutput接口定義了一系列的寫(xiě)入各種數(shù)據(jù)的方法。 U提示:DataOutput接口的作用。 Da

6、taOutput是數(shù)據(jù)的輸出接口,其中定義了各種數(shù)據(jù)的輸出操作方法,例如,在DataOutputStream類中的各種writeXxx()方法就是此接口定義的,但是在數(shù)據(jù)輸出時(shí)一般都會(huì)直接使用DataOutputStream,只有在對(duì)象序列化時(shí)才有可能直接操作到此接口.,DataOutputStream類的常用方法,以上程序的結(jié)果中每條數(shù)據(jù)之間使用n分隔,每條數(shù)據(jù)中的每個(gè)內(nèi)容之間使用t分隔,如圖所示。寫(xiě)入后就可以利用DataInputStream將內(nèi)容讀取進(jìn)來(lái)。,2 DataInputStream類 DataInputStream是InputStream的子類,專門負(fù)責(zé)讀取使用DataOutp

7、utStream輸出的數(shù)據(jù),此類的定義如下: public class DataInputStream extends FilterInputStream implements DataInput 此類繼承自FilterInputStream類(FilterInputStream是InputStream的子類),同時(shí)實(shí)現(xiàn)DataInput接口,在DataInput接口中定義了一系列讀入各種數(shù)據(jù)的方法。 U提示:DataInput接口的作用。 DataInput接口是讀取數(shù)據(jù)的操作接口,與DataOutput接口提供的各種writerXxx()方法對(duì)應(yīng),在此接口中定義了一系列的readXxx()

8、方法,這些方法在DataInputStream類中都有實(shí)現(xiàn)。一般在操作時(shí)不會(huì)直接使用到此接口,而主要使用DataInputStream類完成讀取功能,只有在對(duì)象序列化時(shí)才有可能直接利用此接口讀取數(shù)據(jù).,DataInputStream類的常用方法,范例:從order.txt中讀取數(shù)據(jù),合并流,合并流的主要功能是將兩個(gè)文件的內(nèi)容合并成一個(gè)文件,如圖所示。,如果要實(shí)現(xiàn)合并流,則必須使用SequenceInputStream類,此類的常用方法如表所示。 SequenceInputStream類的常用方法,范例:合并兩個(gè)文件,以上程序在實(shí)例化SequenceInputStream類時(shí)指定了兩個(gè)輸入流,所

9、以SequenceInputStream類在進(jìn)行讀取時(shí)實(shí)際上是從兩個(gè)輸入流中一起讀取內(nèi)容的。,ZIP壓縮輸入/輸出流簡(jiǎn)介,壓縮流 在日常的使用中經(jīng)常會(huì)使用到WinRAR或WinZIP等壓縮文件,通過(guò)這些軟件可以把一個(gè)很大的文件進(jìn)行壓縮以方便傳輸,如圖12-20所示。在Java中為了減少傳輸時(shí)的數(shù)據(jù)量也提供了專門的壓縮流,可以將文件或文件夾壓縮成ZIP、JAR、GZIP等文件形式。,1 ZIP壓縮輸入/輸出流簡(jiǎn)介 ZIP是一種較為常見(jiàn)的壓縮形式,在Java中要實(shí)現(xiàn)ZIP的壓縮需要導(dǎo)入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputSt

10、ream和ZipEntry幾個(gè)類完成操作。 U提示:JAR及GZIP文件格式的壓縮輸入、輸出流。 在Java IO中,不僅可以實(shí)現(xiàn)ZIP壓縮格式的輸入、輸出,也可以實(shí)現(xiàn)JAR及GZIP文件格式的壓縮。 JAR壓縮的支持類保存在java.util.jar包中,常用類有如下幾個(gè)。 JAR壓縮輸出流:JarOutputStream。 JAR壓縮輸入流:JarInputStream。 JAR文件:JARFile。 JAR實(shí)體:JAREntry。 GZIP是用于UNIX系統(tǒng)的文件壓縮,在Linux中經(jīng)常會(huì)使用到*.gz的文件,就是GZIP格式,GZIP壓縮的支持類保存在java.util.zip包中,常

11、用類有如下兩個(gè)。 GZIP壓縮輸出流:GZIPOutputStream。 GZIP壓縮輸入流:GZIPInputStream。 在每一個(gè)壓縮文件中都會(huì)存在多個(gè)子文件,那么每一個(gè)子文件在Java中就使用ZipEntry表示. ZipEntry類的常用方法如表,注意:壓縮的輸入/輸出類定義在java.util.zip包中。 壓縮的輸入/輸出流也屬于InputStream或OutputStream的子類,但是卻沒(méi)有定義在java.io包中,而是以一種工具類的形式提供的,在操作時(shí)還需要使用java.io包的支持。,2 ZipOutputStream類(1) 如果要完成一個(gè)文件或文件夾的壓縮,則要使用Z

12、ipOutputStream類。ZipOutputStream是OutputStream的子類,常用操作方法如表所示。,現(xiàn)在假設(shè)在D盤中存在一個(gè)mldn.txt文件,文件內(nèi)容如圖12-22所示,要將其壓縮成mldn.zip文件,具體代碼如下。,范例:壓縮mldn.zip文件,程序運(yùn)行后,會(huì)在D盤上創(chuàng)建一個(gè)mldn.zip的壓縮文件,文件打開(kāi)如圖12-23所示。 上面是對(duì)一個(gè)文件進(jìn)行壓縮,但是在日常的開(kāi)發(fā)中,往往需要對(duì)一個(gè)文件夾進(jìn)行壓縮,例如,現(xiàn)在在D盤中存在一個(gè)mldn的文件夾,如圖12-24所示。,ZipOutputStream類(2) 從使用各種壓縮軟件的經(jīng)驗(yàn)來(lái)看,如果現(xiàn)在要進(jìn)行壓縮,則在

13、壓縮后的文件中應(yīng)該存在一個(gè)mldn文件夾。在文件夾中應(yīng)該存放著各個(gè)壓縮文件。所以,在實(shí)現(xiàn)時(shí)就應(yīng)該列出文件夾中的全部?jī)?nèi)容,并把每一個(gè)內(nèi)容設(shè)置成ZipEntry對(duì)象,保存到壓縮文件中,執(zhí)行流程如圖12-25所示。,范例:壓縮一個(gè)文件夾,以上代碼將mldn文件夾的內(nèi)容壓縮成mldndir.zip文件。程序首先判斷給定的路徑是否是文件夾,如果是文件夾,則將此文件夾中的內(nèi)容使用listFiles()方法全部列出,此方法返回File的對(duì)象數(shù)組,然后將此File對(duì)象數(shù)組中的每個(gè)文件進(jìn)行壓縮,每次壓縮時(shí)都要設(shè)置一個(gè)新的ZipEntry對(duì)象。 程序執(zhí)行完畢后,在D盤中會(huì)生成一個(gè)mldndir.zip的文件,文件

14、打開(kāi)如圖所示。,ZipFile類,在Java中,每一個(gè)壓縮文件都可以使用ZipFile表示,還可以使用ZipFile根據(jù)壓縮后的文件名稱找到每一個(gè)壓縮文件中的ZipEntry并將其進(jìn)行解壓縮操作,ZipFile類的常用方法如表所示。,范例:實(shí)例化ZipFile類對(duì)象,以上程序只是實(shí)例化ZipFile對(duì)象,并通過(guò)getName()方法取得了壓縮文件的名稱。下面介紹如何利用此類進(jìn)行文件的解壓縮操作,以前面的mldn.zip文件為例進(jìn)行解壓縮(注意,此壓縮文件中只存在一個(gè)ZipEntry,即mldn.txt,如圖所示)。,范例:解壓縮文件,ZipInputStream類,ZipInputStream

15、是InputStream的子類,通過(guò)此類可以方便地讀取ZIP格式的壓縮文件,此類的常用方法如表所示。,使用ZipInputStream可以像ZipFile一樣取得ZIP壓縮文件中的每一個(gè)ZipEntry。,范例:取得mldn.zip中的一個(gè)ZipEntry,范例:解壓縮mldndir.zip文件,以上程序首先使用ZipInputStream讀取ZIP格式的壓縮文件,然后通過(guò)getNextEntry()方法依次讀取出其中每一個(gè)ZipEntry對(duì)象的名稱,并通過(guò)ZipFile類取得每一個(gè)ZipEntry的輸入流對(duì)象,在進(jìn)行文件輸出前,判斷其輸出文件夾及文件是否存在,如果不存在則創(chuàng)建。解壓縮之后的效

16、果如圖所示。,回退流,在Java IO中所有的數(shù)據(jù)都是采用順序的讀取方式,即對(duì)于一個(gè)輸入流來(lái)說(shuō),都是采用從頭到尾的順序讀取的。如果在輸入流中某個(gè)不需要的內(nèi)容被讀取進(jìn)來(lái),則只能通過(guò)程序?qū)⑦@些不需要的內(nèi)容處理掉。為了解決這樣的讀取問(wèn)題,在Java中提供了一種回退輸入流(PushbackInputStream、PushbackReader),可以把讀取進(jìn)來(lái)的某些數(shù)據(jù)重新退回到輸入流的緩沖區(qū)中?;赝肆鞑僮鳈C(jī)制如圖所示。,從圖可以發(fā)現(xiàn),在回退流之中,對(duì)于不需要的數(shù)據(jù)可以使用unread()方法將內(nèi)容重 新送回到輸入流的緩沖區(qū)中。下面以PushbackInputStream為例進(jìn)行講解,PushbackI

17、nputStream類的常用方法如表所示。,上表中的3個(gè)unread()方法與InputStream(PushbackInputStream是InputStream的子 類)類中的3個(gè)read()方法相對(duì)應(yīng),所以回退完全是針對(duì)于輸入流進(jìn)行操作的,如表所示。,下面以一個(gè)簡(jiǎn)單的程序?yàn)槔M(jìn)行回退流的講解,現(xiàn)在內(nèi)存中有一個(gè)字符串,只要輸入的內(nèi)容是.則執(zhí)行回退操作,即不讀取.。,范例:操作回退流,本程序中為了讓學(xué)員看清楚哪些內(nèi)容是被回退的,所以將被回退的部分打印輸出。,基本概念與Serializable接口,對(duì)象序列化 1、基本概念與Serializable接口 對(duì)象序列化就是把一個(gè)對(duì)象變?yōu)槎M(jìn)制的數(shù)據(jù)

18、流的一種方法,如圖12-30所示。通過(guò)對(duì)象序列化可以方便地實(shí)現(xiàn)對(duì)象的傳輸或存儲(chǔ)。 如果一個(gè)類的對(duì)象想被序列化,則對(duì)象所在的類必須實(shí)現(xiàn)java.io.Serializable接口。此接口的定義如下: 可以發(fā)現(xiàn)在此接口中并沒(méi)有定義任何的方法,所以此接口是一個(gè)標(biāo)識(shí)接口。表示一個(gè)類具備了被序列化的能力。,范例:定義可序列化的類,U提示:對(duì)象序列化和對(duì)象反序列化操作時(shí)的版本兼容性問(wèn)題。 在對(duì)象進(jìn)行序列化或反序列化操作時(shí),要考慮JDK版本的問(wèn)題。如果序列化的JDK版本和反序列化的JDK版本不統(tǒng)一則就有可能造成異常,所以在序列化操作中引入了一個(gè)serialVersionUID的常量,可以通過(guò)此常量來(lái)驗(yàn)證版本

19、的一致性。在進(jìn)行反序列化時(shí),JVM會(huì)把傳來(lái)的字節(jié)流中的serialVersionUID與本地相應(yīng)實(shí)體(類)的serialVersionUID進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,否則就會(huì)出現(xiàn)序列化版本不一致的異常。 當(dāng)實(shí)現(xiàn)java.io.Serializable接口的實(shí)體(類)沒(méi)有顯式地定義一個(gè)名為serialVersionUID、類型為long的變量時(shí),Java序列化機(jī)制在編譯時(shí)會(huì)自動(dòng)生成一個(gè)此版本的serialVersionUID。當(dāng)然,如果不希望通過(guò)編譯來(lái)自動(dòng)生成,也可以直接顯式地定義一個(gè)名為serialVersionUID、類型為long的變量,只要不修改這個(gè)變量值的序列

20、化實(shí)體,都可以相互進(jìn)行串行化和反串行化。 本程序中直接在Person中加入以下的常量即可:,2、 對(duì)象輸出流ObjectOutputStream 一個(gè)對(duì)象如果要進(jìn)行輸出,則必須使用ObjectOutputStream類,此類的定義如下: ObjectOutputStream類屬于OutputStream的子類,此類的常用方法如表所示。 ObjectOutputStream常用方法 此類的使用形式與PrintStream非常相似,在實(shí)例化時(shí)也需要傳入一個(gè)OutputStream的子類對(duì)象,然后根據(jù)傳入的OutputStream子類的對(duì)象不同,輸出的位置也不同。,范例:將Person類的對(duì)象保存在

21、文件中,3、對(duì)象輸入流ObjectInputStream 使用ObjectInputStream可以直接把被序列化好的對(duì)象反序列化。ObjectInputStream的定義如下: ObjectInputStream類也是InputStream的子類,與PrintStream類的使用類似。此類同樣需要接收InputStream類的實(shí)例才可以實(shí)例化。主要操作方法如表所示。,范例:從文件中將Person對(duì)象反序列化(讀?。?從程序的運(yùn)行結(jié)果中可以清楚地發(fā)現(xiàn),實(shí)現(xiàn)了Serializable接口類,對(duì)象中的所有屬性都被序列化,如果用戶想根據(jù)自己的需要選擇被序列化的屬性,則可以使用另外一種序列化接口-Ex

22、ternalizable接口。,4、Externalizable接口 被Serializable接口聲明的類的對(duì)象的內(nèi)容都將被序列化,如果現(xiàn)在用戶希望自己指定序列化的內(nèi)容,則可以讓一個(gè)類實(shí)現(xiàn)Externalizable接口,此接口定義如下: Externalizable接口是Serializable接口的子接口,在此接口中定義了兩個(gè)方法,這兩個(gè)方法的作用如下。 writeExternal(ObjectOutput out):在此方法中指定要保存的屬性信息,對(duì)象序列化時(shí)調(diào)用。 readExternal(ObjectInput in):在此方法中讀取被保存的信息,對(duì)象反序列化時(shí)調(diào)用。 這兩個(gè)方法的

23、參數(shù)類型是ObjectOutput和ObjectInput,兩個(gè)接口的定義如下。,范例:修改Person類并實(shí)現(xiàn)Externalizable接口,以上程序中的Person類實(shí)現(xiàn)了Externalizable接口,這樣用戶就可以在類中有選擇地保存需要的屬性或者其他的具體數(shù)據(jù)。在本程序中,為了與之前的程序統(tǒng)一,將全部屬性保存下來(lái)。,范例:序列化和反序列化Person對(duì)象,從以上代碼中可以發(fā)現(xiàn),使用Externalizable接口實(shí)現(xiàn)序列化明顯要比使用Serializable接口實(shí)現(xiàn)序列化麻煩得多,除此之外,兩者的實(shí)現(xiàn)還有不同,如表12-27所示。,Externalizable接口與Serializ

24、able接口實(shí)現(xiàn)序列化的區(qū)別,實(shí)例操作-單人信息管理程序(1),將前面的菜單程序進(jìn)行擴(kuò)充,要求增加時(shí)可以增加一個(gè)人的完整信息,人的信息包括姓名和年齡。保存后也可以修改、刪除、查詢此信息。 可以使用對(duì)象序列化保存。此時(shí)程序可以使用前面講解過(guò)的InputData、Person、Operate、Menu幾個(gè)類。需要增加文件操作類,專門負(fù)責(zé)保存和讀取文件的內(nèi)容,并修改Operate類,為其增加具體的操作,此程序的操作如圖所示。,范例:增加文件操作類,實(shí)例操作-單人信息管理程序(2),以上程序中的類的功能就是向程序中寫(xiě)入對(duì)象和讀取對(duì)象,在操作時(shí)只需要傳入一個(gè)路徑即可。,范例:修改Person類,增加se

25、tter和getter,需要在增加、修改、刪除、顯示的地方編寫(xiě)具體的代碼,但是在修改時(shí)應(yīng)該先查詢出來(lái),顯示已有的內(nèi)容。,范例:修改操作類,本章要點(diǎn),1本章主要講解了如圖12-34中所列的操作類,在圖中列出了各類間的繼承關(guān)系。,2在Java中使用File類表示文件本身,可以直接使用此類完成文件的各種操作,如創(chuàng)建、刪除等。 3RandomAccessFile類可以從指定的位置開(kāi)始讀取信息,但是要求文件中各個(gè)數(shù)據(jù)的保存長(zhǎng)度必須固定。 4輸入/輸出流主要分為字節(jié)流(OutputStream、InputStream)和字符流(Writer、Reader)兩種,但是在傳輸中以字節(jié)流操作較多,字符流在操作時(shí)使用到緩沖區(qū),而字節(jié)流沒(méi)有使用到緩沖區(qū)。 5字節(jié)或字符流都是以抽象類的形式定義的,根據(jù)其使用的子類不同,輸入或輸出的位置也不同。 6在IO包中可以使用OutputStreamWriter和InputStreamRe

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論