版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
異常處理和輸入/輸出Java程序設(shè)計(jì)第七章01異常處理7.1異常處理異常在程序的編寫(xiě)過(guò)程中,難免會(huì)遇到出現(xiàn)錯(cuò)誤或者意外的情況。程序中的語(yǔ)法錯(cuò)誤,可以被Java編譯系統(tǒng)發(fā)現(xiàn),必須在編譯階段排除,否則程序無(wú)法運(yùn)行。一個(gè)程序即使在編譯階段沒(méi)有問(wèn)題,在運(yùn)行時(shí)還是可能出現(xiàn)各種各樣的意外情況。例如,用戶(hù)輸入數(shù)據(jù)出錯(cuò)、所需文件找不到、運(yùn)行時(shí)磁盤(pán)空間不足、內(nèi)存空間不足、數(shù)組下標(biāo)越界等。這樣的錯(cuò)誤通常稱(chēng)為異常(Exception)。7.1.1什么是異常7.1異常處理【例7-1】程序中的異常示例?!境绦颉俊境绦蛘f(shuō)明】程序運(yùn)行時(shí)輸入3,程序運(yùn)行正常,輸出為3。程序運(yùn)行時(shí)輸入3.0,“b=in.nextInt()”語(yǔ)句執(zhí)行時(shí)出現(xiàn)InputMismatchException異常,顯示為:7.1異常處理程序運(yùn)行時(shí)輸入0,“System.out.print(a/b)”語(yǔ)句執(zhí)行時(shí)出現(xiàn)ArithmeticException異常,顯示為:如果程序沒(méi)有處理異常,Java系統(tǒng)會(huì)終止程序執(zhí)行并把異常信息直接輸出,從用戶(hù)的角度來(lái)說(shuō),任何異常都沒(méi)有實(shí)際意義,絕大多數(shù)的用戶(hù)也根本看不懂異常信息,這會(huì)給用戶(hù)造成十分不好的印象,程序容易出錯(cuò),即使這種錯(cuò)誤是用戶(hù)的輸入錯(cuò)誤造成的。作為程序設(shè)計(jì)者,要力爭(zhēng)做到程序能夠排除環(huán)境錯(cuò)誤的干擾,即在出現(xiàn)意外情況時(shí)仍可以繼續(xù)運(yùn)行,至少要給出適當(dāng)?shù)奶崾?,這就是異常處理的任務(wù)。7.1異常處理異常主要分為3類(lèi):Exception、RuntimeException和Error,這3類(lèi)異常都是Throwable的子類(lèi)。直接從Exception中派生的各個(gè)異常類(lèi)型是檢查型異常(CheckedException)。RuntimeException類(lèi)的各個(gè)子類(lèi)則沒(méi)有異常處理的強(qiáng)制性需求。Error則是一系列很難通過(guò)程序解決的問(wèn)題,這些問(wèn)題基本上是無(wú)法恢復(fù)的,如內(nèi)存空間不足等。7.1異常處理try-catch-finally結(jié)構(gòu)try-catch-finally結(jié)構(gòu)可以用來(lái)捕捉(catch)和處理異常。將可能發(fā)生異常的程序語(yǔ)句放在try程序塊中,將處理異常的語(yǔ)句放在catch程序塊中。try-catch-finally結(jié)構(gòu)可以不包含finally塊。如果結(jié)構(gòu)中包含了finally塊,那么不論異常是否發(fā)生,finally塊中的語(yǔ)句總會(huì)執(zhí)行。7.1.2用try-catch-finally結(jié)構(gòu)處理異常7.1異常處理【例7-2】程序中的異常處理?!境绦颉?.1異常處理【程序說(shuō)明】如果運(yùn)行時(shí)輸入3,try語(yǔ)句塊中的語(yǔ)句正常執(zhí)行,未出現(xiàn)異常。接下來(lái)先執(zhí)行finally語(yǔ)句塊中的語(yǔ)句,再執(zhí)行try-catch-finally結(jié)構(gòu)后面的語(yǔ)句。程序輸出結(jié)果為:如果運(yùn)行時(shí)輸入3.0,語(yǔ)句“b=in.nextInt()”拋出InputMismatchException異常,于是不再執(zhí)行try語(yǔ)句塊的剩余語(yǔ)句(也就是語(yǔ)句“System.out.println(a/b)”不被執(zhí)行)。接下來(lái)先跳轉(zhuǎn)到InputMismatchException異常對(duì)應(yīng)的catch語(yǔ)句塊執(zhí)行,然后執(zhí)行finally語(yǔ)句塊,再執(zhí)行try-catch-finally結(jié)構(gòu)后面的語(yǔ)句,程序輸出結(jié)果為:7.1異常處理【程序說(shuō)明】如果運(yùn)行時(shí)輸入0,語(yǔ)句“b=in.nextInt()”正常執(zhí)行,語(yǔ)句“System.out.println(a/b)”拋出ArithmeticException異常,但程序中沒(méi)有給出處理該異常的catch語(yǔ)句塊,Java系統(tǒng)首先顯示描述異常信息的字符串,然后執(zhí)行finally語(yǔ)句塊,再終止程序的運(yùn)行,也就是不再執(zhí)行try-catch-finally結(jié)構(gòu)后面的語(yǔ)句。程序輸出結(jié)果為:7.1異常處理多catch結(jié)構(gòu)由于try語(yǔ)句塊可能產(chǎn)生多種不同的異常,這就要求定義多個(gè)catch語(yǔ)句塊實(shí)現(xiàn)多異常處理機(jī)制,每個(gè)catch語(yǔ)句塊接收和處理一個(gè)異常對(duì)象,至于一個(gè)異常對(duì)象能否被一個(gè)catch語(yǔ)句塊所接收,取決于異常與該語(yǔ)句塊的異常參數(shù)匹配情況。7.1.3用多catch結(jié)構(gòu)處理異常7.1異常處理【例7-3】多catch結(jié)構(gòu)示例?!境绦颉俊境绦蛘f(shuō)明】如果運(yùn)行時(shí)輸入3,try語(yǔ)句塊中的語(yǔ)句正常執(zhí)行,未出現(xiàn)異常。接下來(lái)先執(zhí)行finally語(yǔ)句塊中的語(yǔ)句,再執(zhí)行try-catch-finally結(jié)構(gòu)后面的語(yǔ)句。程序輸出結(jié)果為:7.1異常處理【程序說(shuō)明】如果運(yùn)行時(shí)輸入3.0,語(yǔ)句“b=in.nextInt()”拋出InputMismatchException異常,于是不再執(zhí)行try語(yǔ)句塊的剩余語(yǔ)句(也就是語(yǔ)句“System.out.println(a/b)”不被執(zhí)行)。接下來(lái)先跳轉(zhuǎn)到InputMismatchException異常對(duì)應(yīng)的catch語(yǔ)句塊執(zhí)行,然后執(zhí)行finally語(yǔ)句塊,再執(zhí)行try-catch-finally結(jié)構(gòu)后面的語(yǔ)句,程序輸出結(jié)果為:如果運(yùn)行時(shí)輸入0,語(yǔ)句“b=in.nextInt()”正常執(zhí)行,語(yǔ)句“System.out.println(a/b)”拋出ArithmeticException異常,接下來(lái)先跳轉(zhuǎn)到IArithmeticException異常對(duì)應(yīng)的catch語(yǔ)句塊執(zhí)行,然后執(zhí)行finally語(yǔ)句塊,再執(zhí)行try-catch-finally結(jié)構(gòu)后面的語(yǔ)句,程序輸出結(jié)果為:7.1異常處理多catch結(jié)構(gòu)程序中會(huì)聲明許多方法,這些方法中的語(yǔ)句可能引發(fā)異常,如果不希望直接在這個(gè)方法中對(duì)異常進(jìn)行處理,就可以在聲明方法時(shí)使用throws聲明拋出異常,然后在調(diào)用該方法的其他方法中對(duì)異常進(jìn)行處理。如果需要使用throws聲明拋出多個(gè)異常,各異常之間要用逗號(hào)分隔。throws聲明拋出異常的語(yǔ)法格式如下:7.1.4用throws聲明拋出異常7.1異常處理【例7-4】用throws聲明拋出異常。【程序】【程序說(shuō)明】方法中聲明的異常是throws子句中指定的異常類(lèi)或其子類(lèi)的實(shí)例。例如,在方法的說(shuō)明中指明方法可能產(chǎn)生IOException的實(shí)例,但是實(shí)際上拋出的異?;蛟S是EOFException類(lèi)的實(shí)例,這些異常都是IOException子類(lèi)的實(shí)例。將getChar()方法中可能產(chǎn)生的異常通過(guò)throws語(yǔ)句進(jìn)行聲明,將異常交給調(diào)用者(本例中是main()方法)進(jìn)行捕獲和處理。02輸入/輸出處理7.2輸入/輸出處理輸入/輸出處理輸入/輸出處理是程序設(shè)計(jì)中非常重要的部分,方便易用的輸入和輸出可以使程序和用戶(hù)之間產(chǎn)生良好的交互。Java語(yǔ)言的輸入/輸出功能強(qiáng)大而靈活,在Java類(lèi)庫(kù)中,IO部分的內(nèi)容是很龐大的,因?yàn)樗婕暗念I(lǐng)域很廣泛:標(biāo)準(zhǔn)輸入/輸出、文件的操作、網(wǎng)絡(luò)上的數(shù)據(jù)流等。Java的輸入/輸出功能是通過(guò)數(shù)據(jù)流的方式實(shí)現(xiàn)的。7.2輸入/輸出處理數(shù)據(jù)流數(shù)據(jù)流是一個(gè)很形象的概念,當(dāng)程序需要讀取數(shù)據(jù)的時(shí)候,就會(huì)開(kāi)啟一個(gè)通向數(shù)據(jù)源的流,這個(gè)數(shù)據(jù)源可以是文件、內(nèi)存或網(wǎng)絡(luò)連接。類(lèi)似地,當(dāng)程序需要寫(xiě)入數(shù)據(jù)的時(shí)候,就會(huì)開(kāi)啟一個(gè)通向目的地的流。這時(shí)候,數(shù)據(jù)就像在這其中“流動(dòng)”一樣。流式輸入/輸出的特點(diǎn)是數(shù)據(jù)的獲取和發(fā)送沿?cái)?shù)據(jù)序列的順序進(jìn)行,即每個(gè)數(shù)據(jù)都必須等待排在它前面的數(shù)據(jù)讀入或送出之后才能被讀寫(xiě),每次讀寫(xiě)操作處理的都是序列中剩余的未讀寫(xiě)數(shù)據(jù)中的第一個(gè),而不能隨意選擇輸入/輸出的位置。7.2.1什么是數(shù)據(jù)流7.2輸入/輸出處理【例7-5】接收鍵盤(pán)輸入的若干字符,統(tǒng)計(jì)并輸出其中數(shù)字字符的個(gè)數(shù)。【程序】【運(yùn)行結(jié)果】輸入:輸出:【程序說(shuō)明】System.in是InputStream類(lèi)的對(duì)象,用于從鍵盤(pán)上輸入數(shù)據(jù)。System.in.read()方法用于從鍵盤(pán)上讀取一字節(jié),但返回值是int型,因此向ch賦值時(shí),需要強(qiáng)制類(lèi)型轉(zhuǎn)換。System.in.read()方法聲明拋出IOException異常,程序中需要用try-catch語(yǔ)句捕獲處理異常,或者用throwsIOException聲明拋出異常。此外,由于在編寫(xiě)輸入/輸出程序時(shí),使用了IOException以及其他輸入/輸出流類(lèi),因此需要引用java.io包中的類(lèi)。程序中的System.out是PrintStream類(lèi)的對(duì)象,用于向屏幕輸出數(shù)據(jù)。7.2輸入/輸出處理7.2.2通過(guò)FileReader輸入流讀文件文件有文本文件、圖像文件、聲音文件等類(lèi)型,文本文件中存放的是字符序列。FileReader是字符輸入流類(lèi),可用于讀取文本文件,F(xiàn)ileReader的常用方法有:(1)publicFileReader(StringfileName):構(gòu)造方法,參數(shù)fileName是字符串,用于指定要讀取文件的文件名。(2)intread():讀取一個(gè)字符,返回值為讀取字符的編碼。(3)intread(charcbuf[]):讀取多字節(jié),放置到字節(jié)數(shù)組cbuf中,通常讀取的字節(jié)數(shù)量為cbuf的長(zhǎng)度,返回值為實(shí)際讀取的字節(jié)的數(shù)量。如果輸入流已結(jié)束,則返回?1。7.2輸入/輸出處理(4)intread(charcbuf[],intoff,intlen)throwsIOException:讀取len個(gè)字符到數(shù)組cbuf[]中,從數(shù)組cbuf[]的下標(biāo)off處開(kāi)始存放,返回值為實(shí)際讀取的字符數(shù)量。(5)longskip(longn):在輸入流中跳過(guò)n個(gè)字符不讀,返回值為實(shí)際跳過(guò)的字符數(shù)。(6)abstractvoidclose():關(guān)閉該流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。上述方法都可聲明拋出異常,其中構(gòu)造方法拋出FileNotFoundException類(lèi)異常,其他方法拋出IOException類(lèi)異常,F(xiàn)ileNotFoundException是IOException的子類(lèi)。編程時(shí)調(diào)用這些方法時(shí),可以用try-catch結(jié)構(gòu)捕獲處理,也可以聲明拋出。7.2輸入/輸出處理編寫(xiě)讀取文本文件的程序一般遵循如下步驟:(1)創(chuàng)建FileReader類(lèi)對(duì)象,用于讀取指定文件;(2)通過(guò)FileReader類(lèi)對(duì)象讀取文件;(3)關(guān)閉數(shù)據(jù)流,釋放相關(guān)資源。7.2輸入/輸出處理【例7-6】利用字符流讀文件。【程序】【程序說(shuō)明】程序要讀文件d:\a.txt,由于反斜杠(\)是轉(zhuǎn)義字符,所以用字符串"d:\\a.txt"作為參數(shù),指定要讀取文件的文件名。read()方法從文件中讀取一個(gè)字符,返回值為字符的編碼,類(lèi)型為int。所以變量ch的類(lèi)型定義為int。程序中利用while循環(huán)反復(fù)讀寫(xiě)文件,每次讀取一個(gè)字符,直到輸入流結(jié)束,也就是read()的返回值為?1。7.2輸入/輸出處理7.2.3通過(guò)FileWriter輸出流寫(xiě)文件FileWriter是字符輸出流,用于以字符方式向文件中寫(xiě)入數(shù)據(jù)。FileWriter的常用方法有:(1)publicFileWriter(StringfileName):構(gòu)造方法,fileName是要打開(kāi)的文件名。如果指定文件存在,則覆蓋文件內(nèi)容,如果指定文件不存在,則創(chuàng)建一個(gè)新文件。(2)publicFileWriter(StringfileName,Booleanappend):構(gòu)造方法,fileName是要打開(kāi)的文件名。如果append的值為true,則在原文件的尾部添加數(shù)據(jù),否則覆蓋原文件內(nèi)容。如果指定文件不存在,則創(chuàng)建一個(gè)新文件。7.2輸入/輸出處理7.2.3通過(guò)FileWriter輸出流寫(xiě)文件(3)voidwrite(intc):將整型值c的低16位寫(xiě)入輸出流。(4)voidwrite(Stringstr):將字符串str中的字符寫(xiě)入輸出流。(5)voidwrite(charcbuf[],intoff,intlen):將字符數(shù)組cbuf[]中從索引off處開(kāi)始的len個(gè)字符寫(xiě)入輸出流。(6)voidwrite(Stringstr,intoff,intlen)throwsIOException:將字符串str中從索引off處開(kāi)始的len個(gè)字符寫(xiě)入輸出流。(7)close():關(guān)閉輸出流。7.2輸入/輸出處理【例7-7】利用FileReader類(lèi)和FileWriter類(lèi)實(shí)現(xiàn)文件復(fù)制?!境绦颉俊境绦蛘f(shuō)明】FileWriter的構(gòu)造方法拋出FileNotFoundException異常,write()方法和close()方法拋出IOException異常。本程序用try-catch結(jié)構(gòu)捕獲和處理異常。程序創(chuàng)建文件字符輸入流對(duì)象和文件字符輸出流對(duì)象,分別用于讀文件和寫(xiě)文件。每次循環(huán)從文件中讀入一個(gè)字符,再寫(xiě)入目標(biāo)文件。7.2輸入/輸出處理7.2.4通過(guò)字節(jié)流讀寫(xiě)文件所有文件都是由8位的字節(jié)組成的。如果文件字節(jié)中的內(nèi)容被解釋為字符,則文件可稱(chēng)為文本文件;如果被解釋為其他含義,則文件可稱(chēng)為二進(jìn)制文件。例如,字處理軟件Word產(chǎn)生的doc文件中,數(shù)據(jù)可被解釋為字體、格式、圖形和其他非字符信息,這樣的文件是二進(jìn)制文件,一般不能用Reader流正確讀取。如果希望以字節(jié)為單位讀寫(xiě)文件,則可以利用FileInputStream和FileOutputStream兩個(gè)文件字節(jié)流類(lèi)。7.2輸入/輸出處理【例7-8】利用FileInputStream類(lèi)和FileOutputStream類(lèi)實(shí)現(xiàn)文件復(fù)制?!境绦颉俊境绦蛘f(shuō)明】不難發(fā)現(xiàn),F(xiàn)ileInputStream類(lèi)和FileOutputStream類(lèi)的方法在形式和功能上與FileReader類(lèi)和FileWriter類(lèi)的方法非常相似,實(shí)際上,在程序編寫(xiě)環(huán)節(jié),其與前面兩小節(jié)介紹的內(nèi)容也非常相似,區(qū)別僅在于字節(jié)流以字節(jié)為單位讀取文件,而字符流以字符為單位讀取文件。7.2輸入/輸出處理7.2.5File類(lèi)File類(lèi)的常用方法有:(1)booleancreateNewFile():創(chuàng)建一個(gè)新文件。(2)booleanmkdir():創(chuàng)建新的文件夾。(3)booleandelete():刪除文件或者文件夾。(4)booleanexists():判斷當(dāng)前文件或者文件夾是否存在。(5)booleanisDirectory():判斷File對(duì)象代表的是否是一個(gè)文件夾。(6)StringgetParent():返回當(dāng)前File對(duì)象的父級(jí)文件夾。(7)String[]list():返回當(dāng)前File對(duì)象包含的子文件夾及文件。(8)intlength():獲取文件長(zhǎng)度。(9)longlastModified():獲取最后一次修改的時(shí)間。(10)listFiles():返回文件夾下的文件或者文件夾對(duì)象(File類(lèi)實(shí)例),包含隱藏文件。7.2輸入/輸出處理【例7-9】利用File類(lèi)獲取文件屬性?!境绦颉俊境绦蛘f(shuō)明】在main()方法中創(chuàng)建了File類(lèi)對(duì)象,通過(guò)這個(gè)File類(lèi)對(duì)象可以獲取文件的屬性,如文件是否存在、文件大小,也可以用delete()方法刪除文件。如果要讀寫(xiě)文件內(nèi)容,還是需要?jiǎng)?chuàng)建文件輸入/輸出流對(duì)象。FileInputStream和FileOutputStream類(lèi)的構(gòu)造方法的參數(shù)不僅可以是前面一直在使用的字符串,也可以是本例中采用的File類(lèi)對(duì)象。7.2輸入/輸出處理7.2.6通過(guò)RandomAccessFile類(lèi)讀寫(xiě)文件RandomAccessFile類(lèi)的常用方法有:(1)finalintreadInt():從文件中讀取一個(gè)整數(shù)(4字節(jié))。(2)finalStringreadLine():從文件中讀取一行后轉(zhuǎn)為String。(3)longgetFilePointer():返回文件位置指針的當(dāng)前位置。(4)voidseek(longpos):將文件位置指針定位到pos位置。(5)finalvoidwriteChars(Strings):將字符串寫(xiě)入文件。(6)finalvoidwriteInt(intv):將一個(gè)整數(shù)(4字節(jié))寫(xiě)入該文件。(7)longlength():返回此文件的長(zhǎng)度。7.2輸入/輸出處理RandomAccessFile對(duì)象的文件位置指針遵循以下規(guī)律:(1)新建RandomAccessFile對(duì)象的文件位置指針位于文件的開(kāi)頭處。(2)每次讀寫(xiě)操作之后,文件位置的指針都相應(yīng)后移到讀寫(xiě)的字節(jié)處。(3)可以通過(guò)getFilePointer()方法獲得文件位置指針的位置,通過(guò)seek()方法設(shè)置文件位置指針的位置。7.2輸入/輸出處理【例7-10】用RandomAccessFile類(lèi)讀寫(xiě)文件。先將50以?xún)?nèi)的素?cái)?shù)寫(xiě)入文件,再讀取并顯示?!境绦颉俊境绦蛘f(shuō)明】程序創(chuàng)建RandomAccessFile數(shù)據(jù)流,將"rw"傳遞給了構(gòu)造方法的第二個(gè)參數(shù),這樣隨機(jī)訪問(wèn)既可用于從文件中讀取數(shù)據(jù),也可用于向文件寫(xiě)入數(shù)據(jù)。前面的for循環(huán)由小到大搜索素?cái)?shù),并逐一寫(xiě)入文件,語(yǔ)句raf.seek(0)把讀寫(xiě)指針定位在文件的起始位置。后面的for循環(huán)讀取文件中的數(shù)據(jù)并顯示?!境绦颉?3序列化7.3序列化對(duì)象的持久性對(duì)象的持久性是指對(duì)象所具有的保存和加載其狀態(tài)的能力,即長(zhǎng)久保存一個(gè)對(duì)象的狀態(tài)并在需要時(shí)獲取該對(duì)象的信息,以重新構(gòu)造一個(gè)狀態(tài)完全相同的對(duì)象。這種保存和恢復(fù)對(duì)象狀態(tài)的過(guò)程稱(chēng)為對(duì)象序列化。對(duì)象序列化對(duì)象序列化的主要任務(wù)是,寫(xiě)出對(duì)象的狀態(tài)信息,并遍歷該對(duì)象對(duì)其他對(duì)象的引用,遞歸地序列化所有被引用到的其他對(duì)象,從而建立一個(gè)完整的序列化流。7.3序列化7.3.1序列化類(lèi)實(shí)現(xiàn)Serializable接口ObjectOutputStream只能對(duì)Serializable接口的類(lèi)的對(duì)象進(jìn)行序列化。默認(rèn)情況下,ObjectOutputStream按照默認(rèn)方式進(jìn)行序列化,這種序列化方式僅僅對(duì)對(duì)象的非transient的實(shí)例變量進(jìn)行序列化,而不會(huì)序列化對(duì)象的transient的實(shí)例變量,也不會(huì)序列化靜態(tài)變量。當(dāng)ObjectOutputStream按照默認(rèn)方式反序列化時(shí),具有如下特點(diǎn):(1)如果在內(nèi)存中對(duì)象所屬的類(lèi)還沒(méi)有被加載,則先加載并初始化這個(gè)類(lèi)。如果在classpath中不存在相應(yīng)的類(lèi)文件,則拋出ClassNotFoundException異常;(2)在反序列化時(shí)不會(huì)調(diào)用類(lèi)的任何構(gòu)造方法。7.3序列化有些對(duì)象中包含一些敏感信息,這些信息不宜對(duì)外公開(kāi)。如果按照默認(rèn)方式對(duì)它們進(jìn)行序列化,那么它們的序列化數(shù)據(jù)在網(wǎng)絡(luò)上傳輸時(shí),可能會(huì)被不法分子竊取。對(duì)于這類(lèi)信息,可以對(duì)它們進(jìn)行加密后再序列化,而在反序列化時(shí)則需要解密,再恢復(fù)為原來(lái)的信息。默認(rèn)的序列化方式會(huì)序列化整個(gè)對(duì)象圖,這需要遞歸遍歷對(duì)象圖(也就是說(shuō),對(duì)象中的基本類(lèi)型屬性和對(duì)象屬性都能夠被序列化)。如果對(duì)象圖很復(fù)雜,遞歸遍歷操作需要消耗很多的空間和時(shí)間,它內(nèi)部的數(shù)據(jù)結(jié)構(gòu)為雙向列表。在應(yīng)用時(shí),如果將某些成員變量都改為transient類(lèi)型,能節(jié)省空間和時(shí)間,提高序列化的性能。7.3序列化7.3.2實(shí)現(xiàn)Externalizable接口Externalizable接口繼承自Serializable接口,如果一個(gè)類(lèi)實(shí)現(xiàn)了Externalizable接口,那么將完全由這個(gè)類(lèi)控制自身的序列化行為。Externalizable接口中聲明了兩個(gè)方法:前者負(fù)責(zé)序列化操作,后者負(fù)責(zé)反序列化操作。在對(duì)實(shí)現(xiàn)了Externalizable接口的類(lèi)的對(duì)象進(jìn)行反序列化時(shí),會(huì)先調(diào)用類(lèi)的不帶參數(shù)的構(gòu)造方法,這是有別于默認(rèn)反序列方式的。如果把類(lèi)的不帶參數(shù)的構(gòu)造方法刪除,或者把該構(gòu)造方法的訪問(wèn)權(quán)限設(shè)置為private、protected或省略級(jí)別,會(huì)拋出java.io.InvalidException:novalidconstructor異常。7.3序列化7.3.3可序列化類(lèi)的不同版本的序列化兼容性serialVersionUID的默認(rèn)值是Java運(yùn)行時(shí)環(huán)境根據(jù)類(lèi)的內(nèi)部細(xì)節(jié)自動(dòng)生成的。如果對(duì)類(lèi)的源代碼進(jìn)行了修改,再重新編譯,新生成的類(lèi)文件的serialVersionUID的取值有可能也會(huì)發(fā)生變化。類(lèi)的serialVersionUID的默認(rèn)值完全依賴(lài)于Java編譯器,對(duì)于同一個(gè)類(lèi),用不同的Java編譯器編譯,可能會(huì)產(chǎn)生不同的serialVersionUID(也可能相同)。為了提高serialVersionUID的獨(dú)立性和確定性,建議在一個(gè)可序列化類(lèi)中顯式地定義serialVersionUID,為它賦予明確的值。7.3序列化顯式地定義serialVersionUID有兩個(gè)作用:(1)在某些場(chǎng)合,希望類(lèi)的不同版本對(duì)序列化兼容,因此需要確保類(lèi)的不同版本具有相同的serialVersionUID。(2)在某些場(chǎng)合,不希望類(lèi)的不同版本對(duì)序列化兼容,因此需要確保類(lèi)的不同版本具有不同的serialVersionUID。7.3序列化【例7-11】實(shí)現(xiàn)Student對(duì)象的存儲(chǔ)?!境绦蛘f(shuō)明】在main()方法中創(chuàng)建了ObjectOutputStream類(lèi)的對(duì)象,通過(guò)調(diào)用ObjectOutputStream類(lèi)的對(duì)象的writeObject()方法,實(shí)現(xiàn)Student對(duì)象的存儲(chǔ)。7.3序列化【例7-12】實(shí)現(xiàn)對(duì)Student對(duì)象的讀取?!具\(yùn)行結(jié)果】【程序說(shuō)明】在main()方法中創(chuàng)建了ObjectInputStream類(lèi)的對(duì)象,然后調(diào)用ObjectInputStream類(lèi)的對(duì)象的readObject()方法,就可以獲取Student對(duì)象,接著通過(guò)showInfo()方法顯示學(xué)生信息。04范例7.4范例【例7-13】文本文件的凱撒加密。凱撒加密的基本思想是,通過(guò)把字母移動(dòng)一定的位數(shù)來(lái)實(shí)現(xiàn)加密。例如,如果位數(shù)是3,明文字母B就變成了密文的E,以此類(lèi)推,X將變成A,Y將變成B,Z將變成C?!痉治觥渴紫壤肍ileReader將待加密內(nèi)容中的每個(gè)字符取出,然后針對(duì)每個(gè)字符分別移位,再利用FileWriter將移位得到的字符寫(xiě)入文件?!境绦颉?.4范例【例7-14】用字節(jié)輸入/輸出流實(shí)現(xiàn)文件復(fù)制?!痉治觥恳宰止?jié)流的方式實(shí)現(xiàn)文件的復(fù)制功能,F(xiàn)ileInputStream和FileOutputStream是常用的兩個(gè)類(lèi)?;跀?shù)組實(shí)現(xiàn)一次多字節(jié)的讀寫(xiě),顯然比逐字節(jié)讀寫(xiě)效率高。而緩沖輸入流BufferedInputStream和緩沖輸出流BufferedOutputStream又可以進(jìn)一步顯著提高復(fù)制的效率。與內(nèi)存相比,硬盤(pán)的存取速度是非常慢的。如果傳輸?shù)奈募容^大,直接讀寫(xiě)硬盤(pán)就會(huì)比較耗時(shí)。如果先把要存儲(chǔ)的數(shù)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度五金材料進(jìn)出口代理合同3篇
- 2025年度民工臨時(shí)工勞務(wù)派遣合同2篇
- 2025年度版權(quán)出版合同之出版內(nèi)容2篇
- 二零二五年度互聯(lián)網(wǎng)平臺(tái)運(yùn)營(yíng)承諾合同范本3篇
- 2024年銀行打印業(yè)務(wù)合同3篇
- 2024年防火門(mén)生產(chǎn)與交付保密協(xié)議3篇
- 2024汽車(chē)租賃平臺(tái)安全監(jiān)管服務(wù)合同
- 2024植物租賃用于別墅庭院合同
- 2024年股權(quán)贈(zèng)與合同:贈(zèng)與方與受贈(zèng)方之間的股權(quán)代持協(xié)議
- 二零二五年度商業(yè)空間裝修合作協(xié)議2篇
- 2024年南京市第一醫(yī)院分院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 鄧州市龍理鄉(xiāng)第一初級(jí)中學(xué)-2025年春節(jié)寒假跨學(xué)科主題實(shí)踐作業(yè)模板【課件】
- 電力改造電力安裝施工合同
- (新疆一模)2025屆高三高考適應(yīng)性檢測(cè)分學(xué)科第一次模擬考試 生物試卷(含答案解析)
- 【大學(xué)課件】文物數(shù)字化技術(shù)及數(shù)字化文物系統(tǒng)初探
- 高一數(shù)學(xué)上學(xué)期期末模擬試卷03-【中職專(zhuān)用】2024-2025學(xué)年高一數(shù)學(xué)上學(xué)期(高教版2023基礎(chǔ)模塊)(解析版)
- 2024年中央經(jīng)濟(jì)工作會(huì)議精神解讀
- 2023-2024學(xué)年廣東省深圳市福田區(qū)八年級(jí)(上)期末歷史試卷
- 公司安全事故隱患內(nèi)部舉報(bào)、報(bào)告獎(jiǎng)勵(lì)制度
- 歷史常識(shí)單選題100道及答案解析
- 2024年陜西榆林市神木市公共服務(wù)輔助人員招聘775人歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
評(píng)論
0/150
提交評(píng)論