面向?qū)ο?教案(第27講)捕獲異常_第1頁
面向?qū)ο?教案(第27講)捕獲異常_第2頁
面向?qū)ο?教案(第27講)捕獲異常_第3頁
面向?qū)ο?教案(第27講)捕獲異常_第4頁
面向?qū)ο?教案(第27講)捕獲異常_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《面向?qū)ο蟪绦蛟O(shè)計》教案第24講教學(xué)對象計算機科學(xué)技術(shù)專業(yè)授課內(nèi)容9.1異常與異常類9.2捕獲異常9.3捕獲多個異常9.4throws和throw關(guān)鍵字9.5try…with…resources9.6自定義異常9.7案例學(xué)習(xí)——數(shù)組不匹配異常課程標準教學(xué)目標(一)知識目標1.了解異常的概念及異常分類2.理解異常體系結(jié)構(gòu)及異常處理機制3.掌握try…catch…finally異常處理4.掌握throws關(guān)鍵字(二)能力目標1.能夠根據(jù)實際情況選用合適的異常處理2.能夠合理使用異常處理機制編制更健壯的程序教學(xué)方法采用講授法、演示法、討論法、案例教學(xué)。學(xué)時及分配(第1學(xué)時50分鐘)課堂講授30分鐘課堂實踐20分鐘9.1異常與異常類9.2捕獲異常9.3捕獲多個異常9.4throws和throw關(guān)鍵字學(xué)時及分配(第2學(xué)時50分鐘)課堂講授20分鐘課堂實踐30分鐘9.5try…with…resources9.6自定義異常9.7案例學(xué)習(xí)——數(shù)組不匹配異常知識點分析重點:異常處理方法try…catch…finally結(jié)構(gòu)自定義異常難點:異常處理機制教學(xué)過程設(shè)計內(nèi)容方式問題導(dǎo)入所謂異常(exception)是在程序運行過程中產(chǎn)生的使程序終止正常運行的錯誤對象。如數(shù)組下標越界、整數(shù)除法中零作除數(shù)、文件找不到等都可能使程序終止運行。內(nèi)容要點9.1.1異常的概念所謂異常(exception)是在程序運行過程中產(chǎn)生的使程序終止正常運行的錯誤對象。如數(shù)組下標越界、整數(shù)除法中零作除數(shù)、文件找不到等都可能使程序終止運行。為了理解異常的概念,首先看下面的案例?!境绦?-1】數(shù)組下標越界異常ArrayExceptionDemo.javapackagecom.boda.xy;publicclassArrayExceptionDemo{ publicstaticvoidmain(String[]args){ int[]a=newint[5];不存在下標是5的元素System.out.println(a[5]);不存在下標是5的元素System.out.println("程序正常結(jié)束"); }}該段代碼編譯不會發(fā)生錯誤,但運行時在控制臺輸出錯誤信息。程序執(zhí)行沒有結(jié)束,而是發(fā)生了異常。在控制臺顯示了異常信息,這里的信息表示,在main線程中發(fā)生java.lang.ArrayIndexOutOfBoundsException異常,它發(fā)生在程序的第5行。Java語言規(guī)定在使用數(shù)組元素時,下標范圍是0到數(shù)組的length-1,超出這個范圍將發(fā)生ArrayIndexOutOfBoundsException異常,它稱為數(shù)組下標越界異常。9.1.2異常類型Java異常類都是Throwable類的子類,它是Object類的直接子類,定義在java.lang包中。Throwable類有Error和Exception兩個子類,這兩個子類又分別有若干個子類。Error類描述的是系統(tǒng)內(nèi)部錯誤,這樣的錯誤很少出現(xiàn)。Exception類的子類一般又可分為兩種類型:非檢查異常和檢查異常。1.非檢查異常非檢查異常(uncheckedexception)是RuntimeException類及其子類異常,也稱為運行時異常。常見的非檢查異常如圖所示。下面介紹幾種常見的非檢查異常。NullPointerException:空指針異常,即當(dāng)某個對象的引用為null時調(diào)用該對象的方法或使用對象時就會產(chǎn)生該異常,如:Stringname=null;System.out.println(name.length());//該語句發(fā)生異常ArithmeticException:算術(shù)異常,在做整數(shù)的除法或整數(shù)求余運算時可能產(chǎn)生的異常,它是在除數(shù)為零時產(chǎn)生的異常。inta=5;intb=a/0;//該語句發(fā)生異常注意:浮點數(shù)運算不會產(chǎn)生該類異常。如,1.0/0.0的結(jié)果為Infinity。ClassCastException:對象轉(zhuǎn)換異常,Java支持對象類型轉(zhuǎn)換,若不符合轉(zhuǎn)換的規(guī)定,則產(chǎn)生類轉(zhuǎn)換異常,例如:Objecto=newObject();Strings=(String)o;//該語句發(fā)生異常ArrayIndexOutOfBoundsException:數(shù)組下標越界異常,當(dāng)引用數(shù)組元素的下標超出范圍時產(chǎn)生的異常,例如:inta[]=newint[5];a[5]=10;//該語句發(fā)生異常因為定義的數(shù)組a的長度為5,不存在a[5]這個元素,因此發(fā)生數(shù)組下標越界異常。NumberFormatException:數(shù)字格式錯誤異常,在將字符串轉(zhuǎn)換為數(shù)值時,如果字符串不能正確轉(zhuǎn)換成數(shù)值則產(chǎn)生該異常,例如:doubled=Double.parseDouble("5m7.8");//該語句發(fā)生異常異常的原因是字符串"5m7.8"不能正確轉(zhuǎn)換成double型數(shù)據(jù)。2.檢查異常檢查異常(checkedexception)是除RuntimeException類及其子類以外的異常類,有時也稱為必檢異常。對這類異常,程序必須捕獲或聲明拋出,否則編譯不能通過。9.2用try-catch捕獲異常捕獲并處理異常最常用的方法是用try-catch-finally語句,一般格式為:try{可能發(fā)生異常的代碼//需要處理的代碼可能發(fā)生異常的代碼處理異常的代碼}catch(ExceptionType1exceptionObject){處理異常的代碼//異常處理代碼}[catch(ExceptionType2exceptionObject){可有多個catch塊//異常處理代碼可有多個catch塊finally塊是可選的}]finally塊是可選的[finally{//最后處理代碼}]1)try塊將程序中可能產(chǎn)生異常的代碼段用大括號括起來,該塊內(nèi)可能拋出一種或多種異常。2)catch塊用來捕獲異常,括號中指明捕獲的異常類型及異常引用名,類似于方法的參數(shù),它指明了catch語句所處理的異常。大括號中是處理異常的代碼。catch語句可以有多個,用來處理不同類型的異常。3)finally塊是可選項。異常的產(chǎn)生往往會中斷應(yīng)用程序的執(zhí)行,而在異常產(chǎn)生前,可能有些資源未被釋放。有時無論程序是否發(fā)生異常,都要執(zhí)行一段代碼,這時就可以通過finally塊實現(xiàn)。下面是對程序9-1的修改,使用try-catch結(jié)構(gòu)捕獲異常?!境绦?-2】ArrayExceptionDemo.javapackagecom.boda.xy;publicclassArrayExceptionDemo{ publicstaticvoidmain(String[]args){ int[]a=newint[5];try{拋出異常System.out.println(a[5]);拋出異常}catch(Exceptione){處理異常System.out.println(e.toString());處理異常}System.out.println("程序正常結(jié)束");}}9.3捕獲多個異常有時捕獲異常的兩個或多個catch語句可能執(zhí)行相同的代碼序列。現(xiàn)在可以使用JDK7提供的一個新功能,用一個catch語句處理多個異常,而不必單獨捕獲每個異常類型,這就減少了代碼重復(fù)。【程序9-3】捕獲處理多個異常。要在一個catch語句中處理多個異常,需要使用“或”運算符(|)分隔多個異常。MultiCatchDemo.java//這里捕獲多個異常catch(ArithmeticException|ArrayIndexOutOfBoundsExceptionme){System.out.println("捕獲到異常:"+me);}9.4throws和throw關(guān)鍵字所有的異常都產(chǎn)生在方法(包括構(gòu)造方法)內(nèi)部的語句。有時方法中產(chǎn)生的異常不需要在該方法中處理,可能需要由該方法的調(diào)用方法處理,這時可以在聲明方法時用throws子句聲明拋出異常,將異常傳遞給調(diào)用該方法的方法處理。聲明方法拋出異常的格式如下:返回值類型方法名([參數(shù)列表])throws異常列表{//方法體}按上述方式聲明的方法,就可以對方法中產(chǎn)生的異常不作處理,若方法內(nèi)拋出了異常,則調(diào)用該方法的方法必須捕獲這些異?;蛘咴俾暶鲯伋觥3绦?-3的例子是在method()方法中處理異常,若不在該方法中處理異常,而由調(diào)用該方法的main()方法處理,程序修改如下?!境绦?-6】ThrowsExceptionDemo.java前面講到子類可以覆蓋父類的方法,但若父類的方法使用throws聲明拋出了異常,子類方法也可以使用throws聲明異常。但是要注意,子類方法拋出的異常必須是父類方法拋出的異常或子異常。在程序中也可以用創(chuàng)建一個異常對象,然后用throw關(guān)鍵字拋出,或者將捕獲到的異常對象用throw語句再次拋出,throw語句的格式如下:throw異常實例;這里,異常實例可以是用戶創(chuàng)建的異常對象,也可以是程序捕獲到的異常對象,該實例必須是Throwable類或其子類的實例。程序9-7ThrowExceptionDemo.java9.5try-with-resources語句Java程序中經(jīng)常需要創(chuàng)建一些對象(如I/O流、數(shù)據(jù)庫連接),這些對象在使用完后需要關(guān)閉。忘記關(guān)閉文件可能導(dǎo)致內(nèi)存泄露,并引起其他問題。在JDK7之前,通常使用finally語句來確保一定會調(diào)用close()方法。try{//打開資源}catch(Exceptione){//處理異常}finally{//關(guān)閉資源}如果在調(diào)用close()方法也可能拋出異常,那么也要處理這種異常。這樣編寫的程序代碼會變得冗長。JDK7提供的自動關(guān)閉資源的功能為管理資源(如文件流、數(shù)據(jù)庫連接等)提供了一種簡便的方式。這種功能是通過一種叫try-with-resources的try語句實現(xiàn),有時稱為自動資源管理。try-with-resources的主要好處是可以避免在資源(如文件流)不需要時忘記將其關(guān)閉。try-with-resources語句的基本形式如下:try(resource-specification){控制離開try塊后,創(chuàng)建的資源將自動調(diào)用close()方法關(guān)閉,代碼簡潔//使用資源控制離開try塊后,創(chuàng)建的資源將自動調(diào)用close()方法關(guān)閉,代碼簡潔}[catch子句是可選的catch(Exceptione){catch子句是可選的}]Java9增強了try-with-resources語句的功能,允許在try塊外部創(chuàng)建資源對象,然后在try-with-resources語句中使用這些對象。示例如下:voidmethod(Connectionconn,ResultSetrs){try(conn;rs){while(rs.next()){//處理檢索的數(shù)據(jù)}}catch(SQLExceptionex){//執(zhí)行某種操作//異??赡苡刹徽_的SQL語句引起}}并非所有的資源都可以自動關(guān)閉。只有實現(xiàn)了java.lang.AutoCloseable接口的那些資源才可自動關(guān)閉。9.6自定義異常類編寫自定義異常類實際上是繼承一個API標準異常類,用新定義的異常處理信息覆蓋原有信息的過程。常用的編寫自定義異常類的模式如下:publicclassCustomExceptionextendsException{

publicCustomException(){}

publicCustomException(Stringmessage){

super(message);

}}【程序9-8】NegativeValueException.java【程序9-9】CustomExceptionDemo.java9.7案例學(xué)習(xí)——數(shù)組不匹配異常1.問題描述有一個名為com.boda.xy.ArrayUtils的實用工具類,該類有一個名為addArray的靜態(tài)方法,用于對兩個長度相同的數(shù)組相加。addArray的簽名如下:publicstaticlong[]addArray(int[]

array1,int[]array2)throwsMismatchedArrayException,NullPointerException

如果兩個參數(shù)的長度不相同(比如,一個長度是3,一個長度是5),方法拋出一個自定義異常MismatchedArrayException,要求該異常類的toString方法必須返回下面這個值:數(shù)組大小不同。第一個數(shù)組大小是3,第二個數(shù)組大小是5.如果其中一個數(shù)組為null,該方法將拋出NullPointerException異常。編程測試產(chǎn)生這兩種異常的情形。2.設(shè)計思路(1)由于MismatchedArrayException異常只在addArray靜態(tài)方法中使用,所以這里可將該類定義為外層類ArrayUtils類的靜態(tài)內(nèi)部類。(2)為MismatchedArrayException類定義一個帶兩個參數(shù)的構(gòu)造方法,因為拋出該異常對象時要傳遞兩個數(shù)組的大小。(3)覆蓋MismatchedArrayException類的toString()方法輸出異常信息。(4)在addArray()方法中,當(dāng)兩個數(shù)組大小不相等時,使用throw語句拋出創(chuàng)建的MismatchedArrayException對象。采用機房授課邊講邊練,同時用啟發(fā)式、討論式、案例教學(xué)等教學(xué)方法。布置課外學(xué)習(xí)任務(wù)編程題:為年齡輸入添加相應(yīng)的異常處理,保證輸入的年齡在18-25之間。教學(xué)反思

《面向?qū)ο蟪绦蛟O(shè)計》教案第25講教學(xué)對象計算機科學(xué)技術(shù)專業(yè)授課內(nèi)容10.1泛型10.2集合框架10.3List接口及實現(xiàn)類課程標準教學(xué)目標(一)知識目標1.了解泛型的概念2.掌握泛型的定義和使用3.了解集合框架4.掌握List接口及實現(xiàn)類(二)能力目標1.能夠?qū)W會泛型類的定義和使用2.熟練掌握ArrayList的基本操作,能夠熟練使用List集合解決問題教學(xué)方法采用講授法、演示法、討論法、案例教學(xué)。學(xué)時及分配(第1學(xué)時50分鐘)課堂講授30分鐘課堂練習(xí)20分鐘10.1泛型10.2集合框架學(xué)時及分配(第2學(xué)時50分鐘)課堂講授20分鐘課堂練習(xí)30分鐘10.3List接口及實現(xiàn)類知識點分析重點:泛型類型的定義和使用ArrayList的基本操作難點:泛型接口及泛型方法集合的體系結(jié)構(gòu)、迭代器教學(xué)過程設(shè)計內(nèi)容方式問題導(dǎo)入回顧一下,我們在前邊課程中定義了一個整數(shù)棧類IntStack,該類使用Integer作為棧的元素,這就限制了該類只能對Integer元素操作。如果要使這個棧類更具有通用性,我們可以使用Object作為棧的元素,因為Object類是所有類的超類,所以O(shè)bject可以引用任何對象類型。然而,這種做法無法提供類型的安全性,在進行類型轉(zhuǎn)換時可能發(fā)生類型不匹配異常。使用泛型就可以提高類型安全性,因為,它可以使類型轉(zhuǎn)換自動地、隱式地進行。所謂泛型(generics)就是帶一個或多個類型參數(shù)(typeparameter)的類或接口。對于上述討論的對象棧,可以使用泛型定義。內(nèi)容要點10.1.1泛型類泛型是帶一個或多個類型參數(shù)的類或接口。【程序10-1】定義一個泛型Node類表示節(jié)點,類型參數(shù)T表示節(jié)點中存放的值。Node.javapackagecom.boda.xy;publicclassNode<T>{privateTdata;//泛型成員publicNode(){}//默認構(gòu)造方法publicNode(Tdata){//帶參數(shù)構(gòu)造方法this.data=data;}publicTgetData(){//訪問方法定義 returndata;}publicvoidsetData(Tdata){//修改方法定義 this.data=data;}//顯示類型名publicvoidshowType(){ System.out.println("T的類型是:"+data.getClass().getName());}}泛型類型的使用與方法調(diào)用類似,方法調(diào)用需向方法傳遞參數(shù),使用泛型需傳遞一個類型參數(shù),即用某個具體的類型替換T。例如,如果要在Node對象中存放Integer對象,就需要在創(chuàng)建Node對象時為其傳遞Integer類型參數(shù)。要實例化泛型類對象,也使用new運算符,但在類名后面需加上要傳遞的具體類型。varintNode=newNode<Integer>();一旦創(chuàng)建了intNode對象,就可以調(diào)用setData()方法設(shè)置其中的Integer對象,調(diào)用getData()方法返回其中的Integer對象,如下代碼所示。【程序10-2】NodeTest.javapackagecom.boda.xy;publicclassNodeTest{publicstaticvoidmain(String[]args){varintNode=newNode<Integer>();不需要強制類型轉(zhuǎn)換intNode.setData(999);不需要強制類型轉(zhuǎn)換varvalue=intNode.getData();System.out.println(value);intNode.showType();}}按照約定,類型參數(shù)名使用單個大寫字母表示。常用的類型參數(shù)名有:E表示元素,K表示鍵,N表示數(shù)字,T表示類型,V表示值等。10.1.2泛型接口還可以定義泛型接口。泛型可能具有多個類型參數(shù),但在類或接口的聲明中,每個參數(shù)名必須是唯一的?!境绦?0-3】定義了帶兩個參數(shù)的泛型接口Entry。【程序10-4】定義了實現(xiàn)Entry接口的泛型類Pair。下面語句創(chuàng)建兩個Pair類實例:varp1=newPair<Integer,String>(20,"twenty");varp2=newPair<String,String>("china","Beijing");10.1.3泛型方法泛型方法(genericmethod)是帶類型參數(shù)的方法。類的成員方法和構(gòu)造方法都可以定義為泛型方法。泛型方法的定義與泛型類型的定義類似,但類型參數(shù)的作用域僅限于聲明的方法和構(gòu)造方法內(nèi)。泛型方法可以定義為靜態(tài)的和非靜態(tài)的?!境绦?0-5】泛型方法的定義和使用。MathUtil.java參見教材。10.1.4通配符(?)的使用泛型類型本身是一個Java類型,為泛型類型傳遞不同的類型參數(shù)會產(chǎn)生不同的類型。例如:List<Object>list1=newArrayList<Object>();List<String>list2=newArrayList<String>();List<String>并不是List<Object>的子類型。因此,把一個List<String>對象傳遞給一個需要List<Object>對象的方法,將會產(chǎn)生一個編譯錯誤。請看下面代碼。publicstaticvoidprintList(List<Object>list){for(Objectelement:list){System.out.println(element);}}如果傳遞給該方法一個List<String>對象,將發(fā)生編譯錯誤。如果要使上述方法可打印任何類型的列表,可將其參數(shù)類型修改為List<?>,如下所示:publicstaticvoidprintList(List<?>list){for(Objectelement:list){System.out.println(element);}}這里,問號(?)就是通配符,它表示該方法可接受任何類型的List對象?!境绦?0-6】WildCardDemo.java10.1.5方法中有界參數(shù)有時需要限制傳遞給類型參數(shù)的類型種類,例如,要求一個方法只接受Number類或其子類的實例,這就需要使用有界類型參數(shù)(boundedtypeparameter)。有界類型分為上界和下界,上界用extends指定,下界用super指定。例如,要聲明上界類型參數(shù),應(yīng)使用問號(?),后跟extends關(guān)鍵字,然后是上界類型。這里,extends具有一般的意義,對類表示擴展(extends),對接口表示實現(xiàn)(implements)。假如要定義一個getAverage()方法,它返回一個列表中所有數(shù)字的平均值,我們希望該方法能夠處理Integer列表、Double列表等各種數(shù)字列表。但是,如果把List<Number>作為getAverage()方法的參數(shù),它將不能處理List<Integer>列表或List<Double>列表。為了使該方法更具有通用性,可以限定傳遞給該方法的參數(shù)是Number對象或其子類對象的列表,這里Number類型就是列表中元素類型的上界(upperbound)。下面案例的getAverage()方法就是這樣的參數(shù)?!境绦?0-7】BoundedTypeDemo.java10.2集合框架集合是指集中存放一組對象的一個對象。集合相當(dāng)于一個容器,它提供了保存、獲取和操作其他元素的方法。集合能夠幫助Java程序員輕松地管理對象。Java集合框架由兩種類型構(gòu)成,一個是Collection,另一個是Map。Collection對象用于存放一組對象,Map對象用于存放一組“關(guān)鍵字/值”的對象。Collection和Map是最基本的接口,它們又有子接口,這些接口的層次關(guān)系如圖12-5所示。10.3List接口及實現(xiàn)類List接口實現(xiàn)一種線性表的數(shù)據(jù)結(jié)構(gòu)。存放在

List中的所有元素都有一個下標(從0開始),可以通過下標訪問List中的元素。List中可以包含重復(fù)元素。List接口的實現(xiàn)類包括ArrayList、LinkedList、Vector和Stack。10.3.1List的操作List接口除繼承Collection的方法外,還定義了一些自己的方法。使用這些方法可以實現(xiàn)定位訪問、查找、迭代和返回子線性表。booleanadd(Objecte):將指定元素插入到列表末尾。voidadd(intindex,Eelement):將指定元素插入到指定下標處。Eget(intindex):返回指定下標處的元素。Eset(intindex,Eelement):修改指定下標處的元素。Eremove(intindex):刪除指定下標處的元素booleanaddAll(intindex,Collection<?extendsE>c):在指定下標處插入集合c中的全部元素。intindexOf(Objecto):查找指定對象第一次出現(xiàn)的位置。intlastIndexOf(Objecto):查找指定對象最后一次出現(xiàn)的位置。List<E>subList(intfrom,intto):返回從from到to元素的一個子線性表。10.3.2ArrayList類ArrayList是最常用的列表實現(xiàn)類,它通過數(shù)組實現(xiàn)的集合對象。ArrayList類實際上實現(xiàn)了一個變長的對象數(shù)組,其元素可以動態(tài)地增加和刪除。它的定位訪問時間是常量時間。ArrayList的構(gòu)造方法如下:ArrayList():創(chuàng)建一個空的數(shù)組列表對象,默認初始容量是10。初始容量指的是列表可以存放多少元素。當(dāng)列表填滿而又需要添加更多元素時,列表大小會自動增大。ArrayList(Collectionc):用集合c中的元素創(chuàng)建一個數(shù)組列表對象。ArrayList(intinitialCapacity):創(chuàng)建一個空的數(shù)組列表對象,并指定初始容量。下列代碼創(chuàng)建一個ArrayList對象向其中插入幾個元素,并使用ArrayList的有關(guān)方法對它操作。varbigCities=newArrayList<String>();bigCities.add("北京");bigCities.add("上海");bigCities.add("廣州");System.out.println(bigCities.size());bigCities.add(2,"倫敦");//插入元素bigCities.set(2,"紐約");//修改元素System.out.println(bigCities.contains("北京"));System.out.println(bigCities);System.out.println(bigCities.indexOf("巴黎"));10.3.3遍歷集合元素在使用集合時,遍歷集合元素是最常見的任務(wù)。遍歷集合中的元素有多種方法:用簡單的for循環(huán)、用增強的for循環(huán)和用Iterator迭代器對象。1.使用簡單的for循環(huán)使用簡單的for循環(huán)可以遍歷集合中的每個元素。for(vari=0;i<bigCities.size();i++){System.out.print(bigCities.get(i)+"");}2.使用增強的for循環(huán)使用增強的for循環(huán)不但可以遍歷數(shù)組的每個元素,還可以遍歷集合中的每個元素。下面的代碼打印集合的每個元素:for(varcity:bigCities)System.out.println(city);上述代碼的含義是:將集合bigCities中的每個對象存儲到city變量中,然后打印輸出。使用這種方法只能按順序訪問集合中的元素,不能修改和刪除集合元素。3.使用迭代器迭代器是一個可以遍歷集合中每個元素的對象。調(diào)用集合對象的iterator()方法可以得到Iterator對象,再調(diào)用Iterator對象的方法就可以遍歷集合中的每個元素。Iterator接口定義了如下3個方法。booleanhasNext():返回迭代器中是否還有對象。Enext():返回迭代器中下一個對象。voidremove():刪除迭代器中的當(dāng)前對象。Iterator使用一個內(nèi)部指針,開始它指向第一個元素的前面。如果在指針的后面還有元素,hasNext()方法返回true。調(diào)用next()方法,指針將移到下一個元素,并返回該元素。remove()方法將刪除指針所指的元素。假設(shè)myList是ArrayList的一個對象,要訪問myList中的每個元素,可以按下列方法實現(xiàn):Iteratoriterator=myList.iterator();//得到迭代器對象while(iterator.hasNext()){System.out.println(iterator.next());}使用Iterator也可以用for循環(huán)訪問集合元素。for(variterator=myList.iterator();iterator.hasNext();){System.out.println(iterator.next());}【程序10-8】ListDemo.java10.3.4數(shù)組轉(zhuǎn)換為List對象java.util.Arrays類提供了一個asList()方法,它將數(shù)組轉(zhuǎn)換成List對象:publicstatic<T>List<T>asList(T…a)該方法提供了一個方便的從多個元素創(chuàng)建List對象的途徑,它的功能與Collection接口的toArray()方法相反。varstr=newString[]{"one","two","three","four"};varlist=Arrays.asList(str);//將數(shù)組轉(zhuǎn)換為列表System.out.println(list);也可以將數(shù)組元素直接作為asList()方法的參數(shù)寫在括號中,例如:varlist=Arrays.asList("one","two","three","four");數(shù)組元素還可以使用基本數(shù)據(jù)類型,如果使用基本數(shù)據(jù)類型,則轉(zhuǎn)換成List對象元素時進行了自動裝箱操作。在Java9中,如果希望使用幾個元素創(chuàng)建一個集合,可以使用集合的工廠方法,從而可以避免調(diào)用add()方法。varints=Set.of(1,2,3);varstrList=List.of("first","second");注意,使用Arrays.asList()方法和集合的of()工廠方法返回的集合對象是不可變的,因此創(chuàng)建后再進行填加、刪除等操作,將拋出UnsupportedOperationException異常。如果要實現(xiàn)對集合對象的操作,可以將其作為一個參數(shù)傳遞給另一個List的構(gòu)造方法,如下所示。List<String>list=newArrayList<>(Arrays.asList(str));采用機房授課邊講邊練,同時用啟發(fā)式、討論式、案例教學(xué)等教學(xué)方法。布置課外學(xué)習(xí)任務(wù)教材課后編程題:1,2教學(xué)反思《面向?qū)ο蟪绦蛟O(shè)計》教案第26講教學(xué)對象計算機科學(xué)技術(shù)專業(yè)授課內(nèi)容10.4Set接口及實現(xiàn)類10.5Queue接口及實現(xiàn)類10.6案例學(xué)習(xí)——用集合存儲、遍歷員工記錄課程標準教學(xué)目標(一)知識目標1.掌握Set接口及實現(xiàn)類的定義和使用2.掌握Queue接口及實現(xiàn)類的定義和使用(二)能力目標1.熟練掌握HashSet和TreeSet集合的基本操作,能夠熟練使用Set集合解決實際問題2.熟練掌握Queue接口的基本操作,能夠熟練使用LinkedList解決實際問題教學(xué)方法采用講授法、演示法、討論法、案例教學(xué)。學(xué)時及分配(第1學(xué)時50分鐘)課堂講授30分鐘課堂練習(xí)20分鐘10.4Set接口及實現(xiàn)類學(xué)時及分配(第2學(xué)時50分鐘)課堂講授20分鐘課堂練習(xí)30分鐘10.5Queue接口及實現(xiàn)類10.6案例學(xué)習(xí)——用集合存儲、遍歷員工記錄知識點分析重點:HashSet和TreeSet集合的基本操作ArrayDeque類和LinkedList類的使用難點:自定義比較器教學(xué)過程設(shè)計內(nèi)容方式問題導(dǎo)入在Connection接口中,有兩個重要接口List和Set,上節(jié)課已經(jīng)講解了List接口及其實現(xiàn)類的使用,本節(jié)課將繼續(xù)講解Connection接口的另一個子接口Set接口及其實現(xiàn)類的使用。內(nèi)容要點10.4Set接口及實現(xiàn)類Set接口對象類似于數(shù)學(xué)上的集合概念,其中不允許有重復(fù)的元素。Set接口沒有定義新的方法,只包含從Collection接口繼承的方法。Set接口的常用實現(xiàn)類有:HashSet類、TreeSet類和LinkedHashSet類。10.4.1HashSet類HashSet類用散列方法存儲元素,具有最好的存取性能,但元素沒有順序。HashSet類的構(gòu)造方法有:HashSet():創(chuàng)建一個空的散列集合,該集合的默認初始容量是16,默認裝填因子(loadfactor)是0.75。裝填因子決定何時對散列表進行再散列。例如,如果裝填因子為0.75(默認值),而表中超過75%的位置已經(jīng)填入元素,這個表就會用雙倍的桶數(shù)自動地進行再散列。對于大多數(shù)應(yīng)用程序來說,裝填因子為75%是比較合理的。HashSet(Collectionc):用指定的集合c的元素創(chuàng)建一個散列集合。HashSet(intinitialCapacity):創(chuàng)建一個散列集合,并指定集合的初始容量。下面代碼演示了HashSet的使用。varwords=newHashSet<>();words.add("one");words.add("two");words.add("three");words.add("four");words.add("one");//不能將重復(fù)的元素添加到集合中for(varw:words)System.out.print(w+"");//fouronetwothree從結(jié)果可以看到,在向Set對象中添加元素時,重復(fù)的元素不能添加到集合中。另外,由于程序中使用的實現(xiàn)類為HashSet,它并不保證集合中元素的順序。10.4.2TreeSet類TreeSet實現(xiàn)一種樹集合,它使用紅-黑樹為元素排序,添加到TreeSet中的元素必須是可比較的,即元素的類必須實現(xiàn)Comparable<T>接口。它的操作要比HashSet慢。TreeSet類的默認構(gòu)造方法創(chuàng)建一個空的樹集合,其他構(gòu)造方法如下。TreeSet(Collectionc):用指定集合c中的元素創(chuàng)建一個新的樹集合,集合中的元素按自然順序排序。TreeSet(Comparatorc):創(chuàng)建一個空的樹集合,元素的排序規(guī)則按給定的比較器c的規(guī)則排序?!境绦?0-9】TreeSetDemo.java10.4.3對象順序創(chuàng)建TreeSet類對象時如果沒有指定比較器對象,集合中的元素按自然順序排列。所謂自然順序(naturalorder)是指集合對象實現(xiàn)了Comparable<T>接口的compareTo()方法,對象則根據(jù)該方法排序。如果試圖對沒有實現(xiàn)Comparable<T>接口的集合元素排序,將拋出ClassCastException異常。另一種排序方法是創(chuàng)建TreeSet對象時指定一個比較器對象,這樣,元素將按比較器的規(guī)則排序。如果需要指定新的比較規(guī)則,可以定義一個類實現(xiàn)Comparator<T>接口,然后為集合提供一個新的比較器。字符串的默認比較規(guī)則是按字母順序比較。假如按反順序比較,可以定義一個類實現(xiàn)Comparator<T>接口,然后用該類對象作為比較器?!境绦?0-10】實現(xiàn)字符串的降序排序DescSortDemo.java10.5Queue接口及實現(xiàn)類Queue接口是Collection的子接口,它是以先進先出(First-In-First-Out,F(xiàn)IFO)的方式排列其元素,稱為隊列(queue)。Queue接口的子接口Deque實現(xiàn)雙端隊列,ArrayDeque和LinkedList是它的兩個實現(xiàn)類。10.5.1Queue接口和Deque接口Queue接口除了提供Collection的操作外,還提供了插入、刪除和檢查操作。Queue接口的常用方法如下:booleanadd(Ee):將指定的元素e插入到隊列中。Eremove():返回隊列頭元素,同時將其刪除。Eelement():返回隊列頭元素,但不將其刪除。Deque接口實現(xiàn)雙端隊列,它支持從兩端插入和刪除元素。Deque接口中定義的基本操作方法,如表10-1所示。表10-1Deque接口常用方法操作類型隊首元素操作隊尾元素操作插入元素addFirst(e)addLast(e)offerFirst(e)offerLast(e)刪除元素removeFirst()removeLast()pollFirstpollLast()返回元素getFirst()getLast()peekFirst()peekLast()10.5.2ArrayDeque類和LinkedList類Deque的常用實現(xiàn)類包括ArrayDeque類和LinkedList類,前者是可變數(shù)組的實現(xiàn),后者是線性表的實現(xiàn)。LinkedList類比ArrayDeque類更靈活,它實現(xiàn)了線性表的所有操作,其中可以存儲null元素,但ArrayDeque對象不能存儲null??梢允褂迷鰪姷膄or循環(huán)和迭代器訪問Deque的元素。varaDeque=newArrayDeque<String>();…for(varstr:aDeque){System.out.println(str);}使用迭代器訪問Deque元素代碼如下:varaDeque=newArrayDeque<String>();…for(variter=aDeque.iterator();iter.hasNext();){System.out.println(iter.next());}【程序10-11】演示了ArrayDeque類的使用DequeDemo.java隊列的實現(xiàn)類一般不允許插入null元素,但LinkedList類是它允許null元素。如果需要經(jīng)常在線性表的頭部添加元素或在內(nèi)部刪除元素,就應(yīng)該使用LinkedList。這些操作在LinkedList中是常量時間,在ArrayList中是線性時間。而對定位訪問LinkedList是線性時間,ArrayList是常量時間。LinkedList的構(gòu)造方法如下:LinkedList():創(chuàng)建一個空的鏈表。LinkedList(Collectionc):用集合c中的元素創(chuàng)建一個鏈表。創(chuàng)建LinkedList對象不需要指定初始容量。LinkedList類除實現(xiàn)List接口中方法外,還定義了addFirst()、getFirst()、removeFirst()、addLast()、getLast()和removeLast()等方法。注意,LinkedList同時實現(xiàn)了List接口和Queue接口?!境绦?0-12】實現(xiàn)一個10秒倒計時器CountDown.java10.5.3集合轉(zhuǎn)換集合實現(xiàn)類的構(gòu)造方法一般都接受一個Collection對象,這使得可以將Collection轉(zhuǎn)換成不同類型的集合。下面是一些實現(xiàn)類的構(gòu)造方法:publicArrayList(Collectionc)publicHashSet(Collectionc)publicLinkedList(Collectionc)下面代碼將一個Queue對象轉(zhuǎn)換成一個List:Queue<String>queue=newLinkedList<>();queue.add("hello");queue.add("world");List<String>myList=newArrayList(queue);以下代碼又可以將一個List對象轉(zhuǎn)換成Set對象:Set<String>set=newHashSet(myList);10.6案例研究:用集合存儲、遍歷學(xué)生信息1.問題描述設(shè)計學(xué)生類Student,屬性:學(xué)號(整型);姓名(字符串),語文成績,數(shù)學(xué)成績,英語成績和總成績,成績均為int型。程序創(chuàng)建多個學(xué)生信息存儲到集合中,學(xué)號相同時視為同一個對象,不重復(fù)存儲,遍歷集合將學(xué)生信息按總成績降序輸出到控制臺。2.設(shè)計思路(1)定義學(xué)生類,重寫方法hashCode()和equals(),用學(xué)號識別是否為重復(fù)的對象。(2)創(chuàng)建HashSet集合對象,使用泛型限定只存儲學(xué)生對象。(3)創(chuàng)建若干學(xué)生對象,把學(xué)生對象添加到集合。(4)遍歷集合,輸出學(xué)生信息到控制臺。(5)修改學(xué)生類使其實現(xiàn)Comparable接口,讓對象擁有自然序。實現(xiàn)接口中的抽象方法compareTo,按總成績降序排序?qū)W生對象。(6)定義TreeSet集合,將HashSet集合中的學(xué)生對象添加到此TreeSet集合中,實現(xiàn)學(xué)生對象按總成績降序存儲。3.代碼實現(xiàn)【程序10-13】Student.java【程序10-14】StudentSet.java采用機房授課邊講邊練,同時用啟發(fā)式、討論式、案例教學(xué)等教學(xué)方法。布置課外學(xué)習(xí)任務(wù)教材課后編程題3,4教學(xué)反思

《面向?qū)ο蟪绦蛟O(shè)計》教案第27講教學(xué)對象計算機科學(xué)技術(shù)專業(yè)授課內(nèi)容10.7Map接口及實現(xiàn)類10.8Collections類課程標準教學(xué)目標(一)知識目標掌握Map接口及實現(xiàn)類的定義和使用掌握Collections工具類的常用方法(二)能力目標1.熟練掌握HashMap和TreeMap集合的基本操作,能夠熟練使用Map集合解決實際問題2.能夠熟練使用Collections類解決實際問題教學(xué)方法采用講授法、演示法、討論法、案例教學(xué)。學(xué)時及分配(第1學(xué)時50分鐘)課堂講授30分鐘課堂練習(xí)20分鐘10.7Map接口及實現(xiàn)類學(xué)時及分配(第2學(xué)時50分鐘)課堂講授20分鐘課堂練習(xí)30分鐘10.8Collections類知識點分析重點:HashMap和TreeMap集合的基本操作Collections類難點:TreeMap集合元素的比較Lambda表達式創(chuàng)建比較器對象教學(xué)過程設(shè)計內(nèi)容方式問題導(dǎo)入集合按照其存儲結(jié)構(gòu)可以分為兩大類,即單列集合Collection和雙列集合Map,在前幾節(jié)課中,已經(jīng)講解了集合中單列集合Collection的使用,接下來本節(jié)中將講解雙列集合Map的使用。內(nèi)容要點10.7Map接口及實現(xiàn)類Map是用來存儲“鍵/值”對的對象,通常稱為映射。在Map中存儲的關(guān)鍵字和值都必須是對象,并要求關(guān)鍵字是唯一的,而值可以重復(fù)。10.7.1Map接口Map接口實現(xiàn)基本操作的方法包括添加“鍵/值”對、返回指定鍵的值、刪除“鍵/值”對等。publicVput(Kkey,Vvalue):向映射對象中添加一個“鍵/值”對。publicVget(Objectkey):返回指定鍵的值。publicVremove(Objectkey):從映射中刪除指定鍵的“鍵/值”對。publicbooleancontainsKey(Objectkey):返回映射中是否包含指定的鍵。publicbooleancontainsValue(Objectvalue):返回映射中是否包含指定的值。publicintsize():返回映射中包含的“鍵/值”對個數(shù)。publicbooleanisEmpty():返回映射是否為空。publicvoidclear():刪除映射中所有“鍵/值”對。publicSet<K>keySet():返回由鍵組成的Set對象。publicCollection<V>values():返回由值組成的Collection對象。publicSet<Map.Entry<K,V>>entrySet():返回包含Map.Entry<K,V>的一個Set對象。Map接口常用的實現(xiàn)類有HashMap類、TreeMap類、Hashtable類和LinkedHashMap類。10.7.2HashMap類HashMap類以散列方法存放“鍵/值”對,它的構(gòu)造方法有:HashMap():創(chuàng)建一個空的映射對象,使用默認的裝填因子(0.75)。HashMap(intinitialCapacity):用指定初始容量和默認裝填因子創(chuàng)建一個映射對象。HashMap(Mapm):用指定的映射對象m創(chuàng)建一個新的映射對象?!景咐?0-13】使用HashMap存放幾個國家名稱和首都名稱對照表,國家名稱作為鍵,首都名作為值,然后對其進行各種操作?!境绦?0-13】MapDemo.java10.7.3TreeMap類TreeMap類實現(xiàn)了SortedMap接口,它保證Map中的“鍵/值”對按關(guān)鍵字升序排序。TreeMap類的構(gòu)造方法如下:TreeMap():創(chuàng)建根據(jù)鍵的自然順序排序的空的映射。TreeMap(Comparatorc):根據(jù)給定的比較器創(chuàng)建一個空的映射。TreeMap(Mapm):用指定的映射m創(chuàng)建一個新的映射,根據(jù)鍵的自然順序排序。將【程序10-13】HashMap改為TreeMap,按國家名的順序輸出Map對象。10.8Collections類java.util.Collections類提供了若干static方法實現(xiàn)集合對象的操作。這些操作大多對List操作,主要包括下面幾個方面:排序、重排、查找、求極值以及常規(guī)操作等。排序使用sort()方法可對列表中元素排序,它有下面兩種格式:publicstatic<T>voidsort(List<T>list)publicstatic<T>voidsort(List<T>list,Comparator<?superT>c)該方法實現(xiàn)對List的元素按升序或指定的比較器順序排序。該方法使用優(yōu)化的歸并排序算法,因此排序是快速的和穩(wěn)定的。在排序時如果沒有提供Comparator對象,則要求List中的對象必須實現(xiàn)Comparable接口。下面代碼對元素為Integer的List排序。varnumbers=Arrays.asList(20,-5,49,8);Collections.sort(numbers);for(varn:numbers){System.out.print(n+"");}下面代碼對字符串List按字符串長度升序排序。varnames=Arrays.asList("this","is","a","string");Collections.sort(names,newComparator<String>(){指定比較器對象publicintcompare(Stringa,Stringb){指定比較器對象returna.length()-b.length();}});for(varname:names){System.out.print(name+"");}查找使用binarySearch()方法可以在已排序的List中查找指定的元素,該方法格式如下:publicstatic<T>intbinarySearch(List<T>list,Tkey)publicstatic<T>intbinarySearch(List<T>list,Tkey,Comparatorc)第一個方法指定List和要查找的元素。該方法要求List已經(jīng)按元素的自然順序的升序排序。第二個方法除了指定查找的List和要查的元素外,還要指定一個比較器,并且假定List已經(jīng)按該比較器升序排序。在執(zhí)行查找算法前必須先執(zhí)行排序算法。如果List包含要查找的元素,方法返回元素的下標,否則返回值為(-插入點-1),插入點為該元素應(yīng)該插入到List中的下標位置。下面的代碼可以實現(xiàn)在List查找指定的元素,如果找不到,將該元素插入到適當(dāng)?shù)奈恢谩arlist=Arrays.asList(5,3,1,7);Collections.sort(list);Integerkey=4;小于0表示沒有找到intpos=Collections.binarySearch(list,key);小于0表示沒有找到if(pos<0){varnlist=newArrayList<Integer>(list);將鍵插到正確位置nlist.add(-pos-1,key);將鍵插到正確位置System.out.println(nlist);//輸出[1,3,4,5,7]}3.打亂元素次序使用shuffle()方法可以打亂List對象中元素的次序,該方法格式為:publicstaticvoidshuffle(List<?>list):使用默認的隨機數(shù)打亂List中元素的次序。publicstaticvoidshuffle(List<?>list,Randomrnd):使用指定的Random對象,打亂List中元素的次序。下面的代碼說明sort()方法和shuffle()方法的使用:varnum=newInteger[]{1,3,5,6,4,2,7,9,8,10};varlist=Arrays.asList(num);System.out.println(list);//按插入順序輸出Collections.sort(list);System.out.println(list);//按排序后順序輸出Collections.shuffle(list,newRandom());System.out.println(list);//打亂順序后再輸出4.其他常用方法publicstatic<T>Tmax(Collection<?extendsT>coll):返回集合中的最大值。publicstatic<T>Tmin(Collection<?extendsT>coll):返回集合中的最小值。publicstaticvoidreverse(List<?>list):該方法用來反轉(zhuǎn)List中元素的順序。publicstaticvoidfill(List<?superT>list,Tobj):用指定的值覆蓋List中原來的每個值,該方法主要用于對List進行重新初始化。publicstaticvoidcopy(List<?superT>dest,List<?extendsT>src):該方法帶有兩個參數(shù),目標List和源List。它實現(xiàn)將源List中的元素復(fù)制到目標List中并覆蓋其中的元素。使用該方法要求目標List的元素個數(shù)不少于源List。如果目標List的元素個數(shù)多于源List,其余元素不受影響。publicstaticvoidswap(List<?>list,inti,intj):交換List中指定位置的兩個元素。publicstaticvoidrotate(List<?>list,intdistance):旋轉(zhuǎn)列表,將i位置的元素移動到(i+distance)%list.size()的位置。publicstatic<T>booleanaddAll(Collection<?superT>c,T…elements):該方法用于將指定的元素添加到集合c中,可以指定單個元素或數(shù)組。publicstaticintfrequency(Collection<?>c,Objecto):返回指定的元素o在集合c中出現(xiàn)的次數(shù)。publicstaticbooleandisjoint(Collection<?>c1,Collection<?>c2):判斷兩個集合是否不相交。如果兩個集合不包含相同的元素,該方法返回true。采用機房授課邊講邊練,同時用啟發(fā)式、討論式、案例教學(xué)等教學(xué)方法。布置課外學(xué)習(xí)任務(wù)教材課后習(xí)題5教學(xué)反思

《面向?qū)ο蟪绦蛟O(shè)計》教案第28講教學(xué)對象計算機科學(xué)技術(shù)專業(yè)授課內(nèi)容11.1I/O概述11.2二進制I/O11.3案例學(xué)習(xí)——文件加密解密課程標準教學(xué)目標(一)知識目標掌握File類及其操作文件的常用方法了解字節(jié)輸入流、輸出流的層次結(jié)構(gòu)和常用方法掌握文件字節(jié)輸入/輸出流、緩存字節(jié)輸入/輸出流、數(shù)據(jù)字節(jié)輸入/輸出流的使用方法(二)能力目標1.能夠應(yīng)用字節(jié)流進行文件讀寫操作2.能夠根據(jù)實際需要正確選擇IO流完成讀寫操作教學(xué)方法采用講授法、演示法、討論法、案例教學(xué)。學(xué)時及分配(第1學(xué)時50分鐘)課堂講授30分鐘課堂練習(xí)20分鐘11.1.1File類11.1.2文本I/O與二進制I/O11.2.2OutputStrream類和InputStream類11.2.2FileOutputStream類和FileInputStream類11.2.3緩沖I/O流學(xué)時及分配(第2學(xué)時50分鐘)課堂講授20分鐘課堂練習(xí)30分鐘11.2.4DataOutputStream類和DataInputStream類11.2.5PrintStream類11.2.6標準輸出輸出流11.3案例學(xué)習(xí)——文件加密解密知識點分析重點:熟悉File類中操作文件的常用方法掌握InputStream類常用子類的層次結(jié)構(gòu)和方法難點:使用文件字節(jié)輸入/輸出流讀寫文件數(shù)據(jù)輸入/輸出流類的使用教學(xué)過程設(shè)計內(nèi)容方式問題導(dǎo)入輸入/輸出(I/O)是任何編程語言都提供的功能,Java語言從一開始就支持I/O,最初是通過java.io包中的類和接口提供支持的。目前Java支持流式I/O和文件I/O。本章我們重點學(xué)習(xí)流式I/O。內(nèi)容要點11.1I/O概述流式I/O分為輸入流和輸出流。程序為了獲得外部數(shù)據(jù),可以在數(shù)據(jù)源(文件、內(nèi)存及網(wǎng)絡(luò)套接字)上創(chuàng)建一個輸入流,然后用read()方法順序讀取數(shù)據(jù)。程序可以在輸出設(shè)備上創(chuàng)建一個輸出流,然后用write()方法將數(shù)據(jù)寫到輸出流中。write(),輸出流read(),輸入流write(),輸出流read(),輸入流程序文件或其他設(shè)備圖11-1輸入/輸出流示意圖按照處理數(shù)據(jù)的類型分,數(shù)據(jù)流又可分為二進制流和文本流,也分別稱為字節(jié)流和字符流,它們處理的信息的基本單位分別是字節(jié)和字符。不管數(shù)據(jù)來自何處或流向何處,也不管是什么類型,順序讀寫數(shù)據(jù)的算法基本上是一樣的。如果需要從外界獲得數(shù)據(jù),首先需要建立輸入流對象,然后從輸入流中讀取數(shù)據(jù);如果需要將數(shù)據(jù)輸出,需要建立輸出流對象,然后向輸出流中寫出數(shù)據(jù)。11.1.1File類java.io.File類表示物理磁盤上的實際文件或目錄,但它不表示文件中數(shù)據(jù)。絕對文件名是由驅(qū)動器字母、完整的路徑以及文件名組成,如D:\study\Hello.txt是Windows系統(tǒng)下的一個絕對文件名。相對文件名是相對于當(dāng)前工作目錄的。對于相對文件名而言,完整目錄被忽略。例如,Hello.txt是一個相對文件名。如果當(dāng)前工作目錄是D:\study,絕對文件名是D:\study\Hello.txt。下面程序通過File類的對象創(chuàng)建一個文件,并演示有關(guān)方法的使用?!境绦?1-1】FileDemo.java11.1.2文本I/O與二進制I/O文件通??梢苑譃槲谋疚募投M制文件。文本文件是包含字符序列的文件,可用文本編輯器查看或通過程序閱讀。而內(nèi)容必須按二進制序列處理的文件稱為二進制文件。實際上所有的文件都是以二進制形式來存儲的,計算機并不區(qū)分二進制文件與文本文件。圖11-3給出了文本I/O的操作過程。字符的編碼保存到文件中001100010011001000110011字符的編碼保存到文件中001100010011001000110011文本I/O程序字符的Unicode碼“123”編碼/解碼編碼/解碼圖11-3文本I/O示意圖對于文本I/O而言,在寫入一個字符時,Java虛擬機會將字符的統(tǒng)一碼轉(zhuǎn)換為文件指定的編碼,在讀取字符時,將文件指定的編碼轉(zhuǎn)換為統(tǒng)一碼。編碼和解碼是自動進行的。圖11-4給出了二進制I/O的操作過程。二進制I/O程序一個字節(jié)被讀/寫123二進制I/O程序一個字節(jié)被讀/寫123字節(jié)寫入文件中01111011圖11-4二進制I/O示意圖由于二進制的I/O不需要編碼和解碼,所以它的優(yōu)點是處理效率比文本文件高。二進制文件與主機的編碼方案無關(guān),因此它是可移植的。11.2二進制I/O流二進制I/O流是以字節(jié)為單位的輸入輸出流,因此也稱為字節(jié)I/O流。11.2.1OutputStream類和InputStream類OutputStream類是二進制輸出流的根類。二進制輸出流OutputStream類定義的方法如下:publicvoidwrite(intb):把指定的整數(shù)b的低8位字節(jié)寫入輸出流。publicvoidwrite(byte[]b):把指定的字節(jié)數(shù)組b的b.length個字節(jié)寫入輸出流。publicvoidflush():刷新輸出流,輸出全部緩存內(nèi)容。publicvoidclose():關(guān)閉輸出流,并釋放系統(tǒng)資源。二進制輸入流InputStream類定義的方法如下:publicintread():從輸入流中讀取下一個字節(jié)并返回它的值,返回值是0到255之間的整數(shù)值。如果讀到輸入流末尾,返回-1。publicintread(byte[]b):從輸入流中讀多個字節(jié),存入字節(jié)數(shù)組b中,如果輸入流結(jié)束,返回-1。publicintavailable():返回輸入流中可讀或可跳過的字節(jié)數(shù)。publicvoidclose():關(guān)閉輸入流,并釋放相關(guān)的系統(tǒng)資源。上述這些方法的定義都拋出了IOException異常,因此使用這些方法時要么使用try-catch結(jié)構(gòu)捕獲異常,要么聲明方法拋出異常。11.2.2FileOutputStream類和FileInputStream類FileOutputStream類和FileInputStream類用來實現(xiàn)文件的輸入輸出處理,由它們所提供的方法可以打開本地機上的文件,并進行順序讀寫。FileOutputStream類的常用構(gòu)造方法如下:FileOutputStream(Stringname):用表示文件的字符串創(chuàng)建文件輸出流對象。若文件不存在,則創(chuàng)建一個新文件,若存在則原文件的內(nèi)容被覆蓋。也可用File對象作為參數(shù)創(chuàng)建文件輸出流對象。FileOutputStream(Stringname,booleanappend):用表示文件的字符串創(chuàng)建文件輸出流對象。如果append參數(shù)為true,則指明打開的文件輸出流不覆蓋原來的內(nèi)容,而是從文件末尾寫入新內(nèi)容,否則覆蓋原來的文件內(nèi)容。使用該構(gòu)造方法生成文件輸出流對象要特別注意,以免不當(dāng)刪除了原文件中的內(nèi)容。FileInputStream類的兩個常用的構(gòu)造方法如下:FileInputStream(Stringname):用表示文件的字符串創(chuàng)建文件輸入流對象。FileInputStream(Filefile):用File對象創(chuàng)建文件輸入流對象。若指定的文件不存在,則產(chǎn)生FileNotFoundException異常,它是檢查異常,必須捕獲或聲明拋出。也可以先創(chuàng)建File對象,然后測試該文件是否存在,若存在再創(chuàng)建文件輸入流。下面程序首先使用FileOutputStream對象向output.dat文件中寫入10個10到99的隨機整數(shù),然后使用FileInputStream對象從output.dat文件中讀出這10個數(shù)并輸出?!境绦?1-2】WriteByteDemo.java下面程序從output.dat文件中讀出這10個數(shù)并輸出?!境绦?1-3】ReadByteDemo.java11.2.3緩沖I/O流BufferedOutputStream為緩沖輸出流,BufferedInputStream為緩沖輸入流,這兩個類用來對流實現(xiàn)緩沖功能。使用緩沖流可以減少讀寫數(shù)據(jù)的次數(shù),加快輸入輸出的速度。BufferedOutputStream類的構(gòu)造方法如下:BufferedOutputStream(OutputStreamout):使用參數(shù)out指定的輸出流對象創(chuàng)建一個緩沖輸出流。BufferedOutputStream(OutputStreamout,intsize):使用參數(shù)out指定的輸出流對象創(chuàng)建一個緩沖輸出流,并且通過size參數(shù)指定緩沖區(qū)大小,默認為512個字節(jié)。BufferedInputStream的構(gòu)造方法如下:BufferedInputStream(InputStreamin):使用參數(shù)in指定的輸入流對象創(chuàng)建一個緩沖輸入流。BufferedInputStream(InputStreamin,intsize):使用參數(shù)in指定的輸入流對象創(chuàng)建一個緩沖輸入流,并且通過size參數(shù)指定緩沖區(qū)大小,默認為512個字節(jié)。使用上面兩個類,可以把輸入輸出流包裝成具有緩沖功能的流,從而提高輸入輸出的效率。11.2.4DataOutputStream類和DataInputStream類DataOutputStream和DataInputStream類分別是數(shù)據(jù)輸出流和數(shù)據(jù)輸入流。使用這兩個類可以實現(xiàn)基本數(shù)據(jù)類型的輸入輸出。這兩個類的構(gòu)造方法如下:DataOutputStream(OutputStreamoutstream):參數(shù)outstream是字節(jié)輸出流對象。DataInputStream(InputStreaminstream):參數(shù)instream是字節(jié)輸入流對象。下面語句分別創(chuàng)建了一個數(shù)據(jù)輸出流和數(shù)據(jù)輸入流:varoutFile=newDataOutputStream(newBufferedOutputStream(newFileOutputStream("output.dat")));varinFile=newDataInputStream(newBufferedInputStream(newFileInputStream("input.dat")));DataOutputStream類和DataInputStream類中定義了讀寫基本類型數(shù)據(jù)和字符串的方法,這兩個類分別實現(xiàn)了DataOutput和DataInput接口中定義的方法。DataOutputStream類定義的常用方法有:publicvoidwriteByte(intv):將v低8位寫入輸出流,忽略高24位。publicvoidwriteShort(intv):向輸出流寫一個16位的整數(shù)。publicvoidwriteInt(intv):向輸出流寫一個4個字節(jié)的整數(shù)。publicvoidwriteLong(longv):向輸出流寫一個8個字節(jié)的長整數(shù)。publicvoidwriteChar(intv):向輸出流寫一個16位的字符。publicvoidwriteBoolean(booleanv):將一個布爾值寫入輸出流。publicvoidwriteFloat(floatv):向輸出流寫一個4個字節(jié)的float型浮點數(shù)。publicvoidwriteDouble(doublev):向輸出流寫一個8個字節(jié)的double型浮點數(shù)。publicvoidwriteBytes(Strings):將參數(shù)字符串每個字符的低位字節(jié)按順序?qū)懙捷敵隽髦?。publicvoidwriteChars(Strings):將參數(shù)字符串每個字符按順序?qū)懙捷敵隽髦?,每個字符占2個字節(jié)。publicvoidwriteUTF(Strings):將參數(shù)字符串字符按UTF-8的格式寫出到輸出流中。UTF-8格式的字符串中每個字符可能是1個、2個或3個字節(jié),另外字符串前要加2個字節(jié)存儲字符數(shù)量。DataInputStream類定義的常用方法有:publicbytereadByte(

溫馨提示

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

評論

0/150

提交評論