




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第5章
面向對象高級程序設計
教學導航教學目標了解Java多繼承的實現方法了解Java的多線程技術及其應用熟悉Java的泛型和泛型方法的正確使用方法掌握Java抽象類的定義與使用方法掌握Java接口的定義與使用方法掌握Java的內部類和枚舉類的定義與使用方法掌握Java集合的接口和類的應用教學重點Java抽象類的定義與使用方法Java接口的定義與使用方法Java的泛型和泛型方法的正確使用
身臨其境
華為Mate60手機的參數如圖5-1所示,格力KFR-72LW/NhGm1BAj空調的參數如圖5-2所示,某教材的參數如圖5-3所示。手機、空調、筆記本電腦、音箱、教材都是購物網站待出售的商品,具有一般商品的通用參數,如商品名稱、商品編碼、品牌等。手機隸屬于數碼產品子類,空調隸屬于電器子類,教材隸屬于圖書子類,這些商品子類之間可能會有相同的參數,但大部分參數不同。圖5-1
華為Mate60手機的參數圖5-2
格力KFR-72LW/NhGm1BAj空調的參數圖5-3
某教材的參數圖5-4
手機顏色類型
前導知識【知識1-1】認知Java面向對象的高級特性
抽象類和接口是Java面向對象的重要特性,可以實現面向對象的多態機制。內部類定義在其他類的內部,并隱藏在外部類之內,同時,不允許同一個包中的其他類訪問內部類,從而對內部類提供了更好的封裝。枚舉類提供了對枚舉類型更好的描述和支持。泛型可以在存取對象時明確地指明對象的類型,并將問題暴露在編譯階段,由編譯器進行檢測,避免在運行時出現轉型異常,從而增加程序的可讀性和穩定性,提高程序的運行效率。集合是能夠容納其他對象的對象,如模塊2中介紹的數組就是一種基本的集合對象。集合內的元素與元素之間具有一定的數據結構,并提供了一些有用的算法,從而為程序組織和操縱批量數據提供強有力的支持。Java的一個重要特性就是在語言級層面支持多線程程序設計。多線程是指一個程序中包含多個執行流,是實現并發的一種有效手段。5.1定義并使用Java的抽象類5.2定義并使用Java的接口5.4探析Java多繼承的實現方法學習要點5.3定義并使用Java的內部類5.5定義并使用Java的枚舉類5.6探析Java的泛型5.7探析Java的集合應用Java的多線程技術編程5.8任務5-1
定義并繼承商品抽象類
【任務描述】創建package5包。創建商品抽象類GoodsAbstractClass5_1,并在其中定義多個成員變量(包括商品編碼、商品名稱、商品數量、商品價格和貨幣單位等)、多個構造方法和成員方法。在商品抽象類中定義2個抽象方法displayBaseInfo()、displaySizeInfo(),分別用于輸出商品基本信息和商品的尺寸。創建商品抽象類GoodsAbstractClass5_1的抽象子類GoodsAbstractClassSub1,該子類只實現父類的1個抽象方法displayBaseInfo()。創建商品抽象類GoodsAbstractClass5_1的其他3個子類BooksClassSub2、DigitalClassSub3、ElectricalClassSub4,這3個子類實現其父類所有的抽象方法,區別是構造方法的參數個數不同。創建測試類Test5_1和類AbstractTest。分別調用類GoodsAbstractClass5_1的displayAmount()方法,輸出商品總金額;調用類GoodsAbstractClass5_1的displayBaseInfo()、displaySizeInfo()方法,輸出商品基本信息和商品的尺寸。任務5-1
定義并繼承商品抽象類
【知識5-2】定義Java的抽象類和抽象方法1.定義抽象類定義類時,在class關鍵詞前面加上一個關鍵詞abstract,這樣的類被定義為抽象類。定義抽象類的語法格式如下。[訪問控制修飾符]abstractclass類名其中,訪問控制修飾符可以為public,或者沒有訪問控制修飾符。如果訪問控制修飾符為public,則要求類的名稱與文件名完全相同。abstract表示定義的類為抽象類,類名必須是合法的Java標識符。2.定義抽象方法在抽象類中可以定義抽象方法,抽象方法也使用關鍵詞abstract來標識。定義抽象方法的語法格式如下。[訪問控制修飾符]abstract返回類型
方法名([參數列表]);在抽象方法中只包含方法的聲明部分,不包含方法的實現部分,并直接以“;”結束。如果把抽象類作為父類,則在父類中聲明的抽象方法將在子類中具體實現。因為抽象類(父類)的引用可以指向具體的子類對象,所以會執行不同子類重寫后的方法,從而形成多態。5.1定義并使用Java的抽象類5.2定義并使用Java的接口5.4探析Java多繼承的實現方法學習要點5.3定義并使用Java的內部類5.5定義并使用Java的枚舉類5.6探析Java的泛型5.7探析Java的集合應用Java的多線程技術編程5.8任務5-2
定義并實現商品接口【任務描述】創建商品接口GoodsInterface5_2,在該接口中定義兩個靜態常量currencyUnit1和currencyUnit2,用來存儲兩種不同的貨幣單位。另外,在該接口中定義兩個抽象方法displayBaseInfo()、displayAmount(),分別用于輸出商品基本信息和商品總金額。創建實現GoodsInterface5_2的類GoodsAbstractClass1和GoodsClass2,其中類GoodsAbstractClass1定義成抽象類,只實現接口的displayAmount()方法;類GoodsClass2定義成普通類,實現接口所有的抽象方法。創建測試類Test5_2,在該類中分別通過類對象和接口對象訪問類的成員方法。任務5-2
定義并實現商品接口【知識5-3】定義并實現Java接口Java中的接口是一種引用數據類型。通過接口可以實現不相關類的相同行為,且無須考慮這些類的關系。接口只包含終態變量和方法的聲明,而沒有值可以變化的變量和方法的實現,且其方法都是抽象方法。通過接口指明多個類需要實現的方法,可以使得設計與實現相分離。1.定義接口定義接口的語法格式如下。[訪問控制修飾符][abstract]interface接口名[extends父接口名,……]{[成員變量定義][成員方法定義]}(1)訪問控制修飾符可以為public或默認值。如果接口聲明為public,則接口名與文件名必須相同。因為接口本身是抽象的,所以接口不能用final修飾。(2)關鍵詞abstract是可選項,可以省略。(3)接口名必須符合Java標識符命名規則。(4)接口與接口之間可以繼承,并且一個接口可以同時繼承多個接口,多個接口之間用逗號分隔。(5)在接口中可以定義成員變量和成員方法,但接口中的變量和方法有特定的要求。接口中定義的成員變量默認具有public、static、final屬性,也就是說接口中定義的變量為常量,即使沒有加final關鍵詞,也默認為常量,這些常量在定義時必須賦值,賦值后其值不能改變。接口中定義的成員方法默認具有public、abstract屬性,接口中的所有方法都是抽象的,抽象方法不能用static修飾。(6)如果沒有指定接口成員方法和成員變量的public訪問權限,則Java將其隱式地聲明為public。任務5-2
定義并實現商品接口
【知識5-3】定義并實現Java接口Java中的接口是一種引用數據類型。通過接口可以實現不相關類的相同行為,且無須考慮這些類的關系。接口只包含終態變量和方法的聲明,而沒有值可以變化的變量和方法的實現,且其方法都是抽象方法。通過接口指明多個類需要實現的方法,可以使得設計與實現相分離。1.定義接口定義接口的語法格式如下。[訪問控制修飾符][abstract]interface接口名[extends父接口名,……]{[成員變量定義][成員方法定義]}(1)訪問控制修飾符可以為public或默認值。如果接口聲明為public,則接口名與文件名必須相同。因為接口本身是抽象的,所以接口不能用final修飾。(2)關鍵詞abstract是可選項,可以省略。(3)接口名必須符合Java標識符命名規則。(4)接口與接口之間可以繼承,并且一個接口可以同時繼承多個接口,多個接口之間用逗號分隔。(5)在接口中可以定義成員變量和成員方法,但接口中的變量和方法有特定的要求。接口中定義的成員變量默認具有public、static、final屬性,也就是說接口中定義的變量為常量,即使沒有加final關鍵詞,也默認為常量,這些常量在定義時必須賦值,賦值后其值不能改變。接口中定義的成員方法默認具有public、abstract屬性,接口中的所有方法都是抽象的,抽象方法不能用static修飾。(6)如果沒有指定接口成員方法和成員變量的public訪問權限,則Java將其隱式地聲明為public。任務5-2
定義并實現商品接口
【知識5-3】定義并實現Java接口2.實現接口接口與接口之間可以有繼承關系,而類與接口之間是實現(Implements)關系,即類實現了接口。實現接口的語法格式如下。訪問控制修飾符class類名[extends父類名][implements接口1,[接口2]……]{//類體}實現接口的類定義與一般類定義基本相似,但存在以下方面的區別。(1)接口列表中可以有多個接口,多個接口之間用逗號分隔。(2)一個類實現接口時,要實現接口中所有的抽象方法,否則這個類必須定義為抽象類。(3)因為接口中抽象方法的訪問權限默認為public,在類中實現抽象方法時其訪問權限不能降低,所以這些抽象方法在類中重寫后訪問權限只能為public。任務5-2
定義并實現商品接口
【知識5-4】區分Java接口與抽象類接口與抽象類在本質上是不同的。當類繼承抽象類時,子類與抽象類之間有繼承關系;當類實現接口時,類與接口之間沒有繼承關系。(1)接口與抽象類的共同點①
兩者都包含抽象方法,且多個類共用方法的參數列表和返回值。②
兩者都不能被實例化。③
兩者都是引用數據類型,其變量可被賦值為子類或實現接口類的對象。(2)接口與抽象類的區別①
接口使用interface來聲明,抽象類使用abstractclass來聲明。②
類只能繼承一個抽象類,但可以同時實現多個接口。③
抽象類中的成員變量定義與非抽象類中的成員變量定義相同,子類可以對成員變量賦值;但接口中的成員變量的默認屬性為public、static、final,只能聲明為常量。④
抽象類中可以定義抽象方法,也可以定義非抽象方法,還可以定義構造方法;但接口中只能定義抽象方法,不能定義非抽象方法和構造方法。⑤
抽象類中的抽象方法前必須使用abstract來修飾,且訪問控制修飾符可以是public、protected和默認值這3種中的任意一種;而接口中的成員方法的默認屬性為abstract和public。5.1定義并使用Java的抽象類5.2定義并使用Java的接口5.4探析Java多繼承的實現方法學習要點5.3定義并使用Java的內部類5.5定義并使用Java的枚舉類5.6探析Java的泛型5.7探析Java的集合應用Java的多線程技術編程5.8任務5-3
實現商品類多繼承并訪問成員方法【任務描述】(1)創建1個抽象類AbstractClass5_3,在該類中定義1個抽象方法displayBaseInfo(),用于輸出商品的基本信息。(2)創建2個接口Interface1和Interface2。在接口Interface1中定義1個抽象方法displayResolution(),用于輸出商品的分辨率;在接口Interface2中定義1個抽象方法displaySize(),用于輸出商品的機身尺寸。(3)創建繼承自AbstractClass5_3的子類GoodsClassSub1。在該子類中聲明3個成員變量(包括商品編碼、商品名稱和商品價格)、1個構造方法,以及1個成員方法displayGoodsType(),該成員方法用于輸出商品的類別,實現其父類的抽象方法displayBaseInfo()。(4)創建類GoodsClassSub2,實現接口Interface1。在該類中實現接口的抽象方法displayResolution(),并且聲明1個成員方法displayGoodsType(),用于輸出商品的類別。(5)創建類GoodsClassSub3,實現接口Interface2。在該類中實現接口的抽象方法displaySize(),并且聲明1個成員方法displayGoodsType(),用于輸出商品的類別。(6)創建繼承自抽象類AbstractClass5_3的子類GoodsMultiInherit5_3,該類要求同時實現2個接口,并實現抽象類和接口中所有的抽象方法。(7)創建測試類Test5_3_1,測試類AbstractClass5_3的對象對其自身的成員方法以及子類的成員方法的可訪問性;測試接口類型的變量對其自身的成員方法以及實現類的成員方法的可訪問性;測試接口類型引用強制轉換成具體對象類型的引用后,接口類型的變量對其實現類的成員方法的可訪問性。(8)創建測試類Test5_3_2,測試多繼承的可訪問性。通過子類對象訪問父類的成員方法和接口的成員方法。通過接口類型的變量引用類對象,訪問接口的成員方法,將接口類型的引用強制轉換為具體對象類型后訪問類AbstractClass5_3的成員方法。任務5-3
實現商品類多繼承并訪問成員方法由于接口中的所有方法都是抽象方法,當類實現多個接口時,多個接口中的同名抽象方法在類中只有一個實現,從而避免了多繼承后語義上的復雜性。當類實現多個接口時,該類的對象可以被多個接口類型的變量引用。通過接口類型的變量引用類對象時,只能訪問接口中定義的方法,如果要訪問實現接口的類中定義的方法,則需要將接口類型引用強制轉換為類對象的引用。在轉換之前可以使用instanceof測試引用指向對象的實際類型。【知識5-5】認知Java多繼承與訪問成員方法5.1定義并使用Java的抽象類5.2定義并使用Java的接口5.4探析Java多繼承的實現方法學習要點5.3定義并使用Java的內部類5.5定義并使用Java的枚舉類5.6探析Java的泛型5.7探析Java的集合應用Java的多線程技術編程5.8任務5-4
定義并使用商品內部類
【任務描述】創建外部類GoodsOuterClass5_4,在該外部類中定義3個成員變量(商品編碼、商品名稱、商品數量)、2個構造方法、2個成員方法(displayBaseInfo()方法用于輸出商品基本信息,printOut()方法用于創建內部類的對象,并調用內部類對象的成員方法)。在外部類的內部定義內部類GoodsInnerClass,在該內部類方法中定義3個變量(商品數量、商品價格、貨幣單位)、2個構造方法、3個成員方法(calAmount()方法用于計算商品總金額,displayAmount()方法用于輸出商品總金額,printVariable()方法用于訪問局部變量、內部類和外部類的同名私有成員變量)。創建測試類Test5_4,在該測試類中創建外部類的對象,再通過外部類對象創建內部類的對象,通過外部類的構造方法創建非靜態內部類對象,并調用內部類對象的方法。在測試類Test5_4中創建外部類的對象,測試是否可以通過內部類的成員方法printVariable()訪問內部類成員方法的局部變量、外部類和內部類的同名私有成員變量。任務5-4
定義并使用商品內部類
【知識5-6】定義并使用Java內部類內部類的定義有兩種:作為外部類的一個成員來定義;在外部類的方法中定義。外部類的成員可以是變量和方法,也可以是一個類。作為外部類成員的內部類與其他外部類成員一樣,訪問控制修飾符可以為public、protected、private或默認值。非靜態內部類與外部類中的其他非靜態成員一樣依賴外部類對象,要在創建外部類對象之后才能創建內部類對象。內部類對象既可以在外部類的成員方法中創建,又可以在外部類之外創建。在外部類的成員方法中創建內部類對象的語法格式與創建外部類對象的語法格式相同。在外部類之外創建內部類對象的語法格式有以下兩種形式。外部類類名.內部類類名引用變量=外部類對象引用.new內部類構造方法名();外部類類名.內部類類名引用變量=new外部類構造方法名.new內部類構造方法名();假設外部類類名為OutClass,內部類類名為InClass,則在外部類之外創建內部類對象的代碼如下。第一種方法:先創建外部類對象,代碼為OutClassout=newOutClass();;再通過外部類對象out創建內部類對象,代碼為OutClass.InClassin=out.newInClass();。第二種方法:直接創建非靜態內部類對象,代碼為OutClass.InClassin=newOutClass().newInClass();。非靜態內部類作為外部類的一個成員,可以訪問外部類中的所有成員,包括外部類中的private成員。在外部類的成員也可以訪問內部類的所有成員(包括private成員),但訪問之前要創建內部類對象。在定義內部類時,內部類的類名不能與外部類的類名相同,但內部類成員的名稱可以與外部類成員的名稱相同。當內部類成員方法中的局部變量、內部類成員變量、外部類成員變量的名稱相同時,有效的是局部變量名。內部類成員變量的訪問形式:this.內部類成員變量名。外部類成員變量的訪問形式:外部類類名.this.外部類成員變量名。5.1定義并使用Java的抽象類5.2定義并使用Java的接口5.4探析Java多繼承的實現方法學習要點5.3定義并使用Java的內部類5.5定義并使用Java的枚舉類5.6探析Java的泛型5.7探析Java的集合應用Java的多線程技術編程5.8任務5-5
定義并使用商品顏色枚舉類【任務描述】創建枚舉類GoodsColor,該枚舉類包括6個枚舉值:白色、黑色、紫色、藍色、灰色、紅色。創建類GoodsColorEnum5_5,在該類的main()方法中定義枚舉類型變量并正確賦值,然后輸出枚舉類型變量的值。在類GoodsColorEnum5_5的main()方法中創建枚舉類型的一維數組,并通過枚舉類中的靜態方法values()為數組賦值,然后通過for語句輸出全部枚舉值,最后使用switch語句判斷商品顏色。任務5-4
定義并使用商品內部類
【知識5-7】定義并使用Java枚舉類定義枚舉類的語法格式如下。訪問控制修飾符enum枚舉類型名稱{枚舉選項列表}枚舉類本質上就是類,使用關鍵詞enum定義的枚舉類型繼承自Enum類,而不是Object類,通過枚舉類型對象可以調用其繼承的方法。定義枚舉類型以后,枚舉類型變量的取值只能為相應枚舉類中定義的值。Enum類中的方法publicStringtoString()可以返回枚舉常量的名稱,靜態方法values()可以返回包含全部枚舉值的一維數組。5.1定義并使用Java的抽象類5.2定義并使用Java的接口5.4探析Java多繼承的實現方法學習要點5.3定義并使用Java的內部類5.5定義并使用Java的枚舉類5.6探析Java的泛型5.7探析Java的集合應用Java的多線程技術編程5.8任務5-6
定義泛型商品類【任務描述】創建泛型類GenericClass5_6,聲明類型參數U,使用U定義泛型類GenericClass5_6的成員變量、方法的參數及方法返回值的類型。在該類中,聲明setUnit()方法用于設置成員變量的值,聲明getUnit()方法用于返回成員變量的值。創建受限泛型類GoodsGenericClass,聲明類型參數N、P、U,并且N和P必須為類Number的子類。在該類中聲明printAmount()方法,用于計算并輸出商品總金額。在main()方法中聲明泛型類GenericClass5_6的第1個對象currencyUnit1,U的類型為Character;聲明泛型類GenericClass5_6的第2個對象currencyUnit2,U的類型為String;調用泛型類GenericClass5_6的方法輸出相應的值。在main()方法中聲明受限泛型類的第1個對象objGeneric1,N、P、U的類型分別為Integer、Double和Character;聲明受限泛型類的第2個對象objGeneric2,N、P、U的類型分別為Integer、Double和String;調用受限泛型類GoodsGenericClass的方法輸出相應的值。任務5-4
定義并使用商品內部類
【知識5-8】Java的泛型Java泛型的本質是類型參數化,也就是說操作的數據類型被指定為一個參數。定義泛型類或接口時,通過類型參數來抽象數據類型,而不是將變量的類型聲明為Object,這樣做的好處是使泛型類或接口的類型安全檢查在編譯階段進行,并且所有的類型轉換都是自動和隱式的,從而保證了類型的安全性。1.定義泛型類定義泛型類的語法格式如下。類的訪問控制修飾符class類名<類型參數>{
類體}在泛型類的定義中,類型參數的定義寫在類名后面,并用尖括號“<>”括起來,類型參數可以使用任何符合Java命名規則的標識符,但為了方便通常采用單個大寫字母。例如,使用E表示集合元素類型,使用K與V分別表示鍵值對中的鍵類型與值類型,使用T、U、S表示任意類型等。使用泛型類可以使程序具有更強的靈活性,通過定義泛型類,可以將變量的類型看作參數來定義,而變量的具體類型是在創建泛型類的對象時確定的。泛型類的類型參數可以用來定義類的成員變量、方法的參數以及方法返回值的類型。當創建泛型類的對象時,類型參數只能為引用類型(如Integer、Character、Double),而不能為基本類型(如int、char、double)。任務5-4
定義并使用商品內部類
【知識5-8】Java的泛型2.定義泛型接口定義泛型接口的語法格式如下。接口的訪問控制修飾符interface接口名<類型參數>{
接口體}3.定義受限泛型在定義泛型類或泛型接口時,類名和接口名后面的類型參數可以為任意類型。如果要限制類型參數為某個子類型,則把這種泛型稱為受限泛型。在受限泛型中,類型參數的定義如下。類型參數extends父類型例如,NextendsNumber表示類型參數N繼承了抽象類Number,則在創建泛型類的對象時,N必須為抽象類Number的子類,如Integer,否則會出現編譯錯誤。使用受限泛型有以下優點:編譯時的類型檢查可以保證類型參數的每次實例化都符合所設定的標準;因為類型參數的每次實例化都是受限父類型或其子類型,所以通過類型參數可以調用受限父類型中的方法。任務5-4
定義并使用商品內部類
【知識5-8】Java的泛型4.泛型類的擴充Java中,類通過繼承可以實現類的擴充,泛型類也可以通過繼承實現泛型類的擴充。在泛型類的子類中可以保留父類的類型參數,還可以增加新的類型參數。如果在定義子類時沒有保留父類中的類型參數,則父類中的類型參數的類型為Object。5.定義泛型方法與類和接口一樣,方法的聲明也可以被泛型化,即在定義方法時帶有一個或多個類型參數。定義泛型方法的語法格式如下。<類型參數>方法返回值類型
方法名(參數列表){
方法體代碼}使用泛型方法可以將方法的參數以及返回值的類型參數化,在實際調用該方法時再確定其具體類型。5.1定義并使用Java的抽象類5.2定義并使用Java的接口5.4探析Java多繼承的實現方法學習要點5.3定義并使用Java的內部類5.5定義并使用Java的枚舉類5.6探析Java的泛型5.7探析Java的集合應用Java的多線程技術編程5.8任務5-7
應用ArrayList類及其方法創建手機品牌集合并遍歷輸出集合中的元素
【任務描述】創建ArrayList類的集合對象實現List接口,向該集合中添加5個手機品牌元素,并隨機改變集合中元素的排列順序。輸出手機品牌集合中的所有元素。逐個輸出手機品牌集合中的元素。【知識5-9】探析Java的集合類在Java中,集合類和接口共同構成了Java集合框架的基礎。Java集合框架主要用于處理對象的集合,這些集合可以是有序的、無序的,允許或不允許重復元素,或者是基于鍵值對的數據結構。Java的集合類都定義在java.util包中,該包及其子包為Java編程提供了一系列有用的工具。Java集合類分為兩種:一種稱為集合類型(Collection),使用接口Collection描述其操作,其存放的基本單位是單個對象,以List和集合(Set)為代表;另一種稱為映射類型(Map),用接口Map描述其操作,其存放的基本單位是鍵值對,映射中存儲的每個對象都是通過一個鍵(Key)對象來獲取一個值(Value)對象,鍵的作用相當于數組中的索引,即每個鍵都是唯一的,可以利用鍵存取數據結構中指定位置的數據。Java集合框架定義了一系列接口,如Collection、Set、List、Iterator、Map,具體介紹如下。publicinterfaceSetextendsCollectionpublicinterfaceListextendsCollectionpublicinterfaceMappublicinterfaceIterator任務5-7
應用ArrayList類及其方法創建手機品牌集合并遍歷輸出集合中的元素
【知識5-9】探析Java的集合類(1)Collection接口Collection接口定義了一些通用方法,通過它們可以實現集合元素的添加、刪除等基本操作,是Set接口和List接口的父接口,通常情況下不直接使用。JDK沒有提供Collection接口的任何直接實現,而是通過專門的子接口實現,如Set接口和List接口。Collection接口中定義的常用方法如表5-23所示。(2)Set接口Set集合包括Set接口及其所有實現類,是一種不包含重復元素的、無序的集合。Set接口繼承自Collection接口,其擁有Collection接口提供的所有方法。Set集合中的對象是無序的,但這種無序并非完全無序,只是不像列表那樣按照對象的插入順序保存對象。JDK提供了實現Set接口的多個類,包括HashSet類和TreeSet類。方法名稱功能說明add(Eobj)將指定對象添加到集合中remove(Objectobj)將指定對象從集合中刪除,返回值為boolean型contains(Objectobj)判斷在集合中是否存在指定對象,返回值為boolean型isEmpty()判斷集合是否為空,返回值為boolean型size()獲取集合中存儲對象的個數,返回值為int型clear()移除集合中的所有對象,即清空該集合iterator()序列化集合中的所有對象,返回值為Iterator<E>型toArray()獲取一個包含所有對象的指定類型的數組equals(Objectobj)判斷指定對象與該對象是否為同一個對象,返回值為boolean型表5-23
Collection接口中定義的常用方法任務5-7
應用ArrayList類及其方法創建手機品牌集合并遍歷輸出集合中的元素
【知識5-9】探析Java的集合類(3)List接口List接口繼承了Collection接口,除繼承了Collection接口聲明的方法外,還增加了一些按位置存取元素、查找元素、建立List視圖等操作的方法,它是一種可含有重復元素的、有序的集合,也稱為列表或序列。List接口可以控制向列表中插入元素的位置,并可以按元素的插入順序(從0開始)來訪問元素。java.util包提供了實現List接口的ArrayList類(向量表)、Vector類(向量)和LinkedList類。ArrayList類用可變大小的數組實現List接口,它的對象會隨著元素的增多而自動擴大容量。ArrayList類是非同步的,當有多個線程對它的同一個對象并發訪問時,為保證數據的一致性,必須通過synchronized關鍵詞進行同步控制。List接口中定義的常用方法如表5-24所示。方法名稱功能說明voidadd(intindex,Objectobj)向集合的指定索引位置添加對象,其他對象的索引位置相對后移一位,索引位置從0開始abstractbooleanaddAll(intindex,Collectionc)向集合的指定索引位置添加指定集合中的所有對象Objectremove(intindex)刪除集合中指定索引位置的對象Objectset(intindex,Objectobj)將集合中指定索引位置的對象修改為指定的對象Objectget(intindex)獲得指定索引位置的對象方法名稱功能說明intindexOf(Objectobj)獲得指定對象的索引位置。當存在多個索引位置時,返回第一個索引位置intlastIndexOf(Objectobj)獲得指定對象的索引位置。當存在多個索引位置時,返回最后一個索引位置ListIteratorlistIterator()獲得一個包含所有對象的ListIterator型實例對象ListIteratorlistIterator(intindex)獲得一個包含從指定索引位置到最后的ListIterator型實例對象ListsubList(intformIndex,inttoIndex通過截取從起始位置fromIndex(包含)到終止位置toIndex(不包含)的對象,重新生成并返回一個列表表5-24
List接口中定義的常用方法任務5-7
應用ArrayList類及其方法創建手機品牌集合并遍歷輸出集合中的元素
【知識5-9】探析Java的集合類(4)Iterator接口JavaCollectionAPI為集合對象提供了重復器(Iterator)接口,該接口用來遍歷集合中的元素。Set接口實現類對象對元素的遍歷順序是不確定的,List接口實現類對象對元素的遍歷順序是從前往后。(5)Map接口Map接口以鍵值對的形式存放對象,實現鍵到值的映射,其中鍵對象不可以重復,值對象可以重復,即每個鍵只能映射到一個值上,并按照自身內部的排序規則進行排列。Map接口的實現類有HashMap、TreeMap、Hashtable等。Java的集合類中定義的方法很多,限于本書篇幅,這里只列出了一些常用方法,未列出的方法請讀者參考相關書籍或網絡資源。由ArrayList類實現的列表使用數組結構保存對象。數組結構的優點是便于對集合進行快速地隨機訪問,如果經常根據索引位置訪問集合中的對象,那么它的效率就較高。數組結構的缺點是向指定索引位置插入對象和刪除對象的效率較低,且插入或刪除對象的索引越小效率就越低,原因是向指定的索引插入對象時,會同時將指定索引位置以及后面的所有對象向后移動。5.1定義并使用Java的抽象類5.2定義并使用Java的接口5.4探析Java多繼承的實現方法學習要點5.3定義并使用Java的內部類5.5定義并使用Java的枚舉類5.6探析Java的泛型5.7探析Java的集合應用Java的多線程技術編程5.8任務5-8
應用Java的多線程技術模擬購物過程
【任務描述】開啟多個購物線程,保證多個購物頁面能夠并行購買同一種商品。創建一個類GoodsSale,實現Runnable接口,在類GoodsSale中定義2個成員變量(商品數量和商品名稱),定義2個構造方法(無參構造方法和包含2個參數的構造方法),重寫Runnable接口的run()方法,在該方法中輸出商品庫存數量。創建另一個類TestThread5_8,在該類的main()方法中定義類GoodsSale的對象objSale,創建Thread類的3個對象t1、t2和t3,即3個線程,并將對象objSale作為參數傳遞給Thread類的構造方法,分別啟動這3個線程,模擬購物過程中商品庫存數量的變化。任務5-8
應用Java的多線程技術模擬購物過程
【知識5-10】認知Java的多線程多任務操作系統能同時運行多個進程,在【Windows任務管理器】窗口的“進程”選項卡中可以看到Windows操作系統同時運行的多個進程。人們在一邊欣賞美妙的音樂、一邊安裝圖像處理軟件的同時,可以使用Word編輯文本,這里同時運行了多個應用程序,在【Windows任務管理器】窗口的【應用程序】選項卡中可以看到這些“正在運行”的應用程序。多進程實際是中央處理器(CentralProcessingUnit,CPU)的分時機制,使得每個進程都能循環獲得自己的CPU時間片,由于這種機制的輪換速度非??欤虼怂谐绦蚓秃孟袷窃谕瑫r運行一樣。1.程序、進程與線程的關系程序是一段靜態代碼,是軟件執行的對象。進程是程序的一次動態執行過程,每一個進程都擁有自己的系統資源、內存空間和地址空間,它對應了代碼從加載、執行到執行完畢的一個完整過程,這個過程也是進程的生命周期。線程是進程的基本執行單位,是比進程更小的執行單位,一個進程在執行過程中可以產生多個線程,形成多個執行流,每個線程有自身的生命周期,可以負責不同的任務而互不干擾,線程是一個動態的概念。多線程是實現并發和提高系統資源利用率的一種有效手段,Java支持多線程,允許多個線程同時處于運行狀態,每個線程執行自己的任務。任務5-8
應用Java的多線程技術模擬購物過程
【知識5-10】認知Java的多線程2.線程的生命周期及其狀態轉換線程在創建之后,就開始了它的生命周期,一個線程在其整個生命周期中可處于不同的狀態,線程在生命周期中有5種狀態:新建(New)、就緒(Ready)、運行(Running)、阻塞(Blocked)和終止(Terminated)。Java程序可以控制線程在這5種狀態之間轉換,線程狀態及狀態轉換說明如下。(1)調用線程類的構造方法創建線程后,線程處于新建狀態。(2)線程調用start()方法后處于就緒狀態。此時,如果CPU在運行其他線程,則線程必須排隊等待,如果CPU空閑,則線程立即占用CPU并開始運行。(3)線程獲得CPU后處于運行狀態。(4)運行中的線程如果遇到讀寫數據、調用sleep()方法或其他阻塞事件,則狀態轉換為阻塞狀態。(5)如果引起阻塞的事件結束,如數據讀寫完畢或sleep()方法設定的時間已到,則處于阻塞狀態的線程回到就緒狀態。(6)線程遇到異?;蚓€程代碼運行完畢,不能繼續運行時,線程處于終止狀態。任務5-8
應用Java的多線程技術模擬購物過程
【知識5-10】認知Java的多線程3.Java的線程接口和線程類Java應用程序中可以定義線程類。要使用Runnable接口或Thread類定義線程類,它們都位于java.lang包中。在java.lang包中,Runnable接口定義如下。publicinterfaceRunnable{publicvoidrun();}Runnable接口提供了一種無須擴展Thread類就可以創建一個新線程的方式,從而克服了Java單繼承方式所帶來的各種限制。Runnable接口中只有一個方法run()。一個類要實現Runnable接口,就必須重寫run()方法。該方法負責完成線程所需執行的任務。線程運行后自動執行run()方法中的代碼,run()方法不需要調用。在java.lang包中,Thread類定義如下。publicclassThreadextendsObjectimplementsRunnable{…privateRunnabletarget;…publicThread(){…}publicThread(Runnabletarget){…}…publicvoidrun(){…}}任務5-8
應用Java的多線程技術模擬購物過程
【知識5-10】認知Java的多線程Thread類本身實現了Runnable接口,但僅以空的方法體覆蓋了run()方法。繼承Thread類定義線程時,需要重寫run()方法,并在run()方法的方法體中編寫線程執行的代碼。Thread類常用的構造方法如下。①Thread()。②Thread(Stringname)。③Thread(Runnabletarget)。④Thread(Runnabletarget,Stringname)。Thread類常用的成員方法如下。繼承Thread類也就繼承了這些方法,線程對象可以調用這些方法控制線程的行為。①publicvoidstart():使線程變為就緒狀態,占用CPU后運行run()方法。②voidsetName(Stringname):設置線程名。③StringgetName():獲取線程名。④voidsetPriority(intnewPriority):設置線程優先級。⑤intgetPriority():獲取線程優先級。⑥staticvoidsleep(longmills):線程睡眠的毫秒數。⑦staticThreadcurrentThread():返回正在運行的線程對象。任務5-8
應用Java的多線程技術模擬購物過程
【知識5-10】認知Java的多線程4.創建線程對象創建線程對象有兩種方法:繼承Thread類和實現Runnable接口。這兩種方法都要用到Thread類,不同點在于通過不同的途徑覆蓋run()方法。(1)通過繼承Thread類創建線程對象①
創建繼承自Thread類的線程類,并重寫run()方法,在run()方法中編寫線程執行的代碼。②
使用new調用線程類的構造方法創建線程對象。③
調用線程對象的start()方法,使線程對象處于就緒狀態,如果獲得CPU資源,則線程自動執行run()方法。當多個線程對象同時處于就緒狀態時,這些線程將交替使用CPU。線程運行完畢后進入終止狀態。(2)實現Runnable接口創建線程對象①
定義一個類實現Runnable接口,在該類中重寫run()方法,編寫線程執行的代碼。②
創建類的對象,并以該對象為參數,調用Thread類的構造方法創建Thread對象。③
使用Thread對象調用start()方法。任務5-8
應用Java的多線程技術模擬購物過程
【知識5-10】認知Java的多線程5.Thread類的sleep()方法Thread類的sleep()方法是將當前運行的線程睡眠一段時間,讓出CPU資源,線程的狀態轉換為阻塞狀態。當睡眠時間結束后,線程的狀態轉換為就緒狀態并等待運行。當一個線程處于阻塞狀態時,其不會爭奪CPU資源,以便其他線程運行,這就為低優先級的線程提供了運行的機會,可以實現線程的同步。sleep()方法的定義格式如下。staticvoidsleep(longmilliseconds)throwsInterruptedExceptionsleep()方法有一個參數longmilliseconds,指定了當前運行線程的睡眠時間(單位是ms),該參數不能為負數,且取值范圍為0~999999,否則會拋出InterruptedException異常。sleep()方法是靜態方法,既可以通過對象調用,又可以通過類名調用。6.控制線程間的同步線程在運行過程中,必須考慮的一個重要問題是與其他線程之間的數據共享或協調運行狀態的問題。例如,A和B為共享同一個賬戶的客戶,如果開始時銀行的賬戶余額是500元,A存入200元,同時B取出100元。此時顯示給A的余額是600元,而不是700元,這里的錯誤是由線程的并發引起的。如果將兩個線程同步,則不會出現上述錯誤。解決方法如下:A在存款時先做一個標記(即鎖定該賬號),表示該賬號正在被操作,然后開始進行計算,修改賬戶余額;此時B來取款,發現該賬號上有正在被操作的標記(即被鎖定),B只能等待;等待A完成存款操作之后,B才能對該賬號進行取款操作。這樣A和B的操作就同步了。這個過程就是線程間的同步(Synchronize),這種標記就是鎖(Lock)。任務5-8
應用Java的多線程技術模擬購物過程
【知識5-10】認知Java的多線程Java提供了一種能夠同步代碼和數據的機制,這種機制可以保證類在一個線程安全的環境中運行。Java提供了關鍵詞synchronized來實現線程間的同步。(1)定義同步方法同步方法是使用關鍵詞synchronized修飾的方法。編寫線程同步程序,就是把同步執行的代碼放在同步方法中。定義同步方法的語法格式如下。publicsynchronizedvoid方法名(){}一個類的任何方法都可以設計為synchronized類型的方法,以防止多線程的數據崩潰。當某個對象用synchronized修飾時,表明該對象在任意時刻只能由一個線程訪問。當一個線程進入synchronized方法后,能保證在任何其他線程訪問這個方法之前完成操作。如果某個線程試圖訪問一個已經啟動的synchronized方法,則該線程必須等待,直到已啟動的線程運行完畢,再啟動這個synchronized方法。(2)定義同步代碼塊使用synchronized修飾方法中的語句塊時,可以利用花括號將語句括起來,并加入需要同步的對象。定義同步代碼塊的語法格式如下。synchronized(object){
同步語句塊}同步代碼塊可以控制線程同步訪問一個類的沒有使用synchronized修飾的方法。object是對象名,同步語句塊是訪問該方法的代碼。線程執行同步語句塊后,對象會被鎖住,其他線程無法訪問該語句塊。當一個線程執行對象的同步代碼塊結束后,線程將自動釋放對象鎖,并允許下一個線程執行。如果線程在同步代碼塊中遇到異常或執行了break、return語句,則線程將自動釋放對象鎖。學習進步!人民郵電出版社
第6章
文件操作程序設計6.1應用File類設計Java程序6.2應用字節流設計Java程序6.4應用字符流設計Java程序學習要點6.3應用RandomAccessFile類設計Java程序
教學導航教學目標熟悉Java中流的分類,了解常用的字節流和字符流,了解常用的I/O流類學會應用File類設計Java程序學會應用字節流設計Java程序學會應用字符流設計Java程序學會應用RandomAccessFile類設計Java程序教學重點常用的I/O流類File類及其應用編程字節流和字符流及其應用編程RandomAccessFile類及其應用編程
身臨其境Windows操作系統自帶的【記事本】軟件如圖6-1所示,在【記事本】的編輯區域中可以實現輸入與修改文本內容、設置格式、保存文件、打開文件等操作?!百徺I京東自營商品,發票什么時候能送到?”的回答內容如圖6-2所示,可以將不同問題的回答內容存放在文本文件中,并根據需要動態展示在網頁中。圖6-1
Windows操作系統自帶的【記事本】軟件圖6-2“購買京東自營商品,發票什么時候能送到?”的回答內容
前導知識【知識6-1】認知Java流
為了讀取或輸出數據,Java程序與數據發送者或接收者之間會建立一個數據通道,這個數據通道被抽象為流。輸入時通過流讀取數據源,可以打開一個通向程序的流,這個程序可以是文件、內存或網絡連接。類似地,輸出時通過流將數據寫入目的地,可以打開一個通向目的地的流。此時數據好像在流中流動一樣,流的示意如圖6-3所示,讀取數據時,對于程序來說是輸入,對應輸入流,將數據從數據源傳遞給程序;寫入數據時,對于程序來說是輸出,對應輸出流,將數據從程序傳遞到目的地,如內存或文件。輸入流只能讀,不能寫;而輸出流只能寫,不能讀。輸入流可以從鍵盤或文件中獲取數據,此時鍵盤或文件是數據源;輸出流可以向顯示器屏幕、打印機或文件中傳輸數據,此時顯示器屏幕、打印機和文件是目的地。從圖6-3可以看出,流是傳遞數據的載體,是數據經歷的路徑。通過流,程序可以把數據從一個地方帶到另一個地方。流可以視為程序在數據發送者和數據接收者之間建立的數據通道。Java程序對各種流的處理基本相同,都包括打開流、讀取/寫入數據、關閉流等操作。就像水龍頭,需要水時,打開水龍頭,不需要水時,關閉水龍頭。流的設計使Java程序在處理不同I/O設備時非常方便。Java程序不直接操縱I/O設備,而是在程序和設備之間加入一個介質流。采用流的目的是使程序的輸入輸出操作獨立于具體設備,程序一旦建立了流,就可以不用考慮起點或終點的設備種類,而只關心使用的流。圖6-3
流的示意
前導知識【知識6-1】認知Java流
分類依據分類名稱說明常用類示例流的方向輸入流從數據源到程序的流,只能從該流中讀取數據,不能向該流中寫數據,如從鍵盤輸入數據InputStream、Reader輸出流從程序到目的地的流,只能把數據寫到該流中,不能從該流中讀取數據,如在屏幕中輸出數據OutputStream、Writer所關聯的是否為最終數據源或目的地節點流直接與最終數據源或目的地關聯的流,該流只提供一些基本的讀寫方法FileInputStream、FileOutputStream、StringReader、StringWriter處理流不直接連接到最終數據源或目的地,而是對其他I/O流進行連接和封裝的流,該流提供一些功能比較強大的方法DataInputStream、BufferedInputStream、DataOutputStream、BufferedOutputStream流操作的數據基本單元字節流以字節為基本單位進行數據的I/O,可用于二進制數據的讀寫InputStream、OutputStream字符流以字符為基本單位進行數據的I/O,可用于文本數據的讀寫Reader、Writer表6-1Java中流的各種分類方式1.Java中流的分類Java中的流有多種分類方式,各種分類方式如表6-1所示。
前導知識【知識6-1】認知Java流2.字節流字節流以字節為基本單位處理數據,InputStream類和OutputStream類是字節流的兩個頂層父類,提供了輸入流類和輸出流類的通用應用程序接口(ApplicationProgramInterface,API),輸入流類和輸出流類提供的方法都以字節為單位讀寫數據。抽象類InputStream是所有字節輸入流的父類,該類中定義了讀取字節數據的基本方法,InputStream類中常用的方法如表6-2所示。抽象類OutputStream是所有字節輸出流的父類,該類中定義了輸出字節數據的基本方法,OutputStream類中常用的方法如表6-3所示。方法功能說明publicabstractintread()從輸入流中讀取一個字節作為方法的返回值,如果返回值為-1,則表示到達流的末尾publicintread(byte[]b)將讀取的數據保存在一個字節數組中,并返回讀取的字節數publiclongskip(longn)在輸入流中最多跳過n個字節,返回跳過的字節數publicintavailable()返回輸入流中可以不受阻塞地讀取的字節數publicvoidmark(intbMax)標記當前位置,參數用于設置從標記位置開始可以讀取的最大字節數publicvoidreset()將輸入流重新定位到最后一次mark()方法標記的位置publicvoidclose()關閉輸入流,釋放與該流關聯的所有系統資源方法功能說明publicabstractvoidwrite(intb)將指定長度的數據寫入輸出流publicvoidwrite(byte[]b)將字節數組的內容寫入輸出流publicvoidwrite(byte[]b,intoff,intlen)將字節數組b中從off位置開始的len個字節寫入輸出流publicvoidflush()刷新輸出流,并強制將緩沖區的全部字節寫入輸出流publicvoidclose()關閉輸出流,并釋放與該流關聯的所有系統資源表6-2
InputStream類中常用的方法表6-3
OutputStream類中常用的方法
前導知識【知識6-1】認知Java流3.字符流字符流以字符為基本單位處理數據,Reader類和Writer類是字符的兩個頂層抽象父類,其定義了在I/O流中讀寫字符數據的通用API。字符流能夠處理Unicode字符集中的所有字符。抽象類Reader是所有字符輸入流的父類,該類中定義了讀取字符數據的基本方法,Reader類中常用的方法如表6-4所示。抽象類Writer是所有字符輸出流的父類,該類中定義了寫入字符數據的基本方法,Writer類中常用的方法如表6-5所示。表6-4Reader類中常用的方法方法功能說明publicintread()讀取一個字符作為方法的返回值,如果返回值為-1,則表示到達流的末尾publicintread(char[]c)將讀取的數據保存在一個字符數組中,并返回讀取的字符數publiclongskip(longn)在輸入流中最多跳過n個字符,返回跳過的字符數publicvoidmark(intcMax)標記當前位置,參數用于設置從標記位置開始可以讀取的最大字符數publicvoidreset()將輸入流重新定位到最后一次mark()方法標記的位置publicvoidclose()關閉輸入流,釋放與該流關聯的所有系統資源方法功能說明publicvoidwrite(intc)將指定長度的數據寫入輸出流publicvoidwrite(char[]c)將字符數組的內容寫入輸出流publicabstractvoidwrite(char[]c,intoff,intlen)將字符數組c中從偏移量off開始的len個字符寫入輸出流publicvoidwrite(Stringstr)將字符串str中的全部字符寫入輸出流publicvoidwrite(Stringstr,intoff,intlen)將字符串str中從偏移量off開始的len個字符寫入輸出流publicvoidflush()刷新輸出流,并強制將緩沖區的全部字符寫入輸出流publicvoidclose()關閉輸出流,并釋放與該流關聯的所有系統資源表6-5
Writer類中常用的方法
前導知識【知識6-1】認知Java流4.I/O流的套接在Java程序中,通過節點流可以直接讀取數據源中的數據,或者將數據直接寫到目的地中。節點流可以直接與數據源或目的地關聯,它提供了基本的數據讀寫方法。在使用節點流FileInputStream和FileOutputStream對文件進行讀寫時,每次讀寫字節數據都要對文件進行操作。為了提高讀寫效率,避免多次對文件進行操作,Java提供了讀寫字節數據的節點流BufferedInputStream和BufferedOutputStream。使用節點流FileInputStream和FileOutputStream讀寫數據時,只能以字節為單位。為了增強讀寫功能,Java提供了DataInputStream類和DataOutputStream類來實現按數據類型讀寫數據。因此,根據系統的實際需求選擇合適的處理流可以提高讀寫效率并增強讀寫能力。在Java程序中,通常將節點流與處理流有機結合起來使用。因為處理流不直接與數據源或目的地關聯,所以可以將節點流作為參數來構造處理流,即處理流對節點流進行了一次封裝。處理流還可以作為參數來構造其他處理流,從而形成了處理流對節點流或其他處理流的進一步封裝,這就是I/O流的套接。以下代碼是I/O流套接的示例。InputStreamReaderisr=newInputStreamReader(System.in);BufferedReaderbr=newBufferedReader(isr);在System類中,靜態成員in是系統輸入流,類型為InputStream,在Java程序運行時系統會自動提供。默認情況下,系統輸入流會連接鍵盤,所以通過System.in可以讀取鍵盤輸入。System.in的類型為InputStream,可以直接讀取鍵盤輸入,屬于節點流,以上示例中第1條語句將其作為參數封裝在處理流InputStreamReader中,從而形成I/O流的套接,并將InputStream由字節流轉換成字符流;第2條語句將轉換后的字符流作為參數封裝在處理流BufferedReader中,從而形成I/O流的再次套接,并將字符流轉換為緩沖字符流。節點流是以物理I/O節點作為構造方法的參數,處理流構造方法的參數不是物理節點而是已經存在的節點流或處理流。通過處理流來封裝節點流可以隱藏底層設備節點的差異,使節點流完成與硬件設備的交互,處理流則提供更加方便的I/O方法。
前導知識【知識6-1】認知Java流5.常用的I/O流java.io包中常用的節點流如表6-6所示,java.io包中常用的處理流如表6-7所示。訪問對象字節輸入流字節輸出流字符輸入流字符輸出流文件FileInputStreamFileOutputStreamFileReaderFileWriter字符串--StringReaderStringWriter內存數組ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter流的類型字節輸入流字節輸出流字符輸入流字符輸出流頂層父類InputStreamOutputStreamReaderWriter緩沖流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter過濾流FilterInputStreamFilterOutputStreamFilterReaderFilterWriter數據流DataInputStreamDataOutputStream--對象流ObjectInputStreamObjectOutputStream--轉換流--InputStreamReaderOutputStreamWriter打印流-PrintStream-PrintWriter表6-6
java.io包中常用的節點流表6-7
java.io包中常用的處理流
前導知識【知識6-1】認知Java流5.常用的I/O流InputStream、OutputStream、Reader、Writer這4個類都是抽象類,無法用來創建對象,必須使用它們的子類覆蓋其抽象方法,從而創建對象。(1)文件流文件流是一種節點流,包括FileInputStream類、FileOutputStream類、FileReader類和FileWriter類,是對文件進行讀或寫的類。文件流的構造方法經常以字符串形式的文件名或者一個File類的對象作為參數。(2)緩沖流硬盤、鍵盤、打印機等硬件設備讀寫數據的速度遠遠小于內存讀寫數據的速度,為了減少硬件設備的讀寫次數,通常利用緩沖流從硬件設備中一次性讀寫一定長度的數據,以提高系統的讀寫性能和傳輸效率。緩沖流實現了對基本I/O流的封裝并創建了內部緩沖區。緩沖區是專門用于存儲數據的一塊內存空間,用于硬件設備與內存之間讀/寫數據,以提高系統讀寫數據的性能。輸入時,輸入流一次性讀取一定長度的數據到緩沖區,緩沖流通過緩沖區來讀取數據。當從一個緩沖流讀取數據時,實際是從緩沖區中讀取數據,當緩沖區為空時,系統將從相應設備自動讀取數據,并讀取盡可能多的數據充滿緩沖區。輸出時,緩沖流將數據寫入緩沖區,輸出流將緩沖區的數據一次性輸出。向一個緩沖流寫入數據時,系統將數據發送到緩沖區,而不是直接發送到外部設備,緩沖區自動記錄數據,當緩沖區滿時,系統將數據全部發送到外部設備。
前導知識【知識6-1】認知Java流5.常用的I/O流緩沖流包括BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter這4個類,它們的功能都是對輸入輸出流進行緩沖,把數據從原始流成塊地讀入或者把數據積累成一個大數據塊后再成批寫出,通過減少系統資源的讀寫次數來加快程序的執行。創建緩沖流時就創建了一個內部緩沖數組,緩沖流的4個類的構造方法如表6-8所示。BufferedInputStream和BufferedOutputStream實現了對InputStream和OutputStream的封裝,并創建了內部緩沖數組,其讀寫數據的基本單位為字節;BufferedReader和BufferedWriter實現了對Reader和Writer的封裝,并創建了內部緩沖數組,其讀寫數據的基本單位為字符。緩沖流類型構造方法字節輸入流publicBufferedInputStream(InputStreamis)publicBufferedInputStream(InputStreamis,intsize)字節輸出流publicBufferedOutputStream(OutputStreamos)publicBufferedOutputStream(OutputStreamos,intsize)字符輸入流publicBufferedReader(Readerread)publicBufferedReader(Readerread,intsize)字符輸出流publicBufferedWriter(Writerwrite)publicBufferedWriter(Writerwrite,intsize)表6-8
緩沖流的4個類的構造方法
前導知識【知識6-1】認知Java流5.常用的I/O流緩沖流包括BufferedInputStream、BufferedOutputStream、Buffer
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 班助培訓內容
- 橋梁冬季施工安全教育
- 度獨家代理合同書:獨家經營權授權
- 2024珠海藝術職業學院中職部工作人員招聘考試及答案
- 2024溫州華僑職業中等專業學校工作人員招聘考試及答案
- 2024濟南電子機械工程學校工作人員招聘考試及答案
- 企業數據共享與保密合同
- 貨物運輸居間合同范本
- 腔鏡器械清洗規范
- 短期倉儲租賃合同模板
- 滬教版小學五年級數學下冊全冊單元試卷
- 中俄技術創新合作的必要性和領域選擇
- 表B旅游民宿一般要求評分表
- 河北省中等職業學校專業設置管理辦法實施細則
- 醫院物業運送服務專項方案
- 氯化銨安全技術說明書MSDS
- 河海大學材料力學第五章彎曲應力
- 關于建立涉農貸款專項統計制的通知銀發號
- 螺桿設計說明書
- 國家開放大學《理工英語3》章節測試參考答案
- 常用螺電批扭力選用對照表
評論
0/150
提交評論