Java高級(jí)編程.ppt_第1頁(yè)
Java高級(jí)編程.ppt_第2頁(yè)
Java高級(jí)編程.ppt_第3頁(yè)
Java高級(jí)編程.ppt_第4頁(yè)
Java高級(jí)編程.ppt_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余77頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、第五章 Java高級(jí)編程,5.1 Java多線程機(jī)制 5.2 輸入輸出流類 5.3 網(wǎng)絡(luò)編程,5.1 Java多線程機(jī)制,Java語(yǔ)言從設(shè)計(jì)之初,就考慮到對(duì)多線程的支持,因而在系統(tǒng)級(jí)和語(yǔ)言級(jí)均提供了對(duì)多線程的支持。 使用多線程的優(yōu)點(diǎn)就是:當(dāng)程序中有多個(gè)可執(zhí)行線程時(shí),能夠充分利用系統(tǒng)資源,提高程序執(zhí)行效率。 本小結(jié)介紹多線程應(yīng)用程序的設(shè)計(jì)方法。,5.1.1基本概念 (一),1線程 線程是比進(jìn)程更小的單位,是應(yīng)用程序中的一個(gè)可執(zhí)行線索,多線程就是同一個(gè)應(yīng)用程序中有多個(gè)可執(zhí)行線索,它們可以并發(fā)執(zhí)行。 前面介紹的所有例程都是單線程的,即一個(gè)應(yīng)用程序只存在一個(gè)可執(zhí)行線索。在執(zhí)行過(guò)程中,如果某部份代碼因?yàn)?/p>

2、等待某個(gè)I/O操作而受阻,則程序的其他部分即使與此無(wú)關(guān)也不能執(zhí)行,這樣就嚴(yán)重地浪費(fèi)了CPU資源。多線程機(jī)制的提出就是為了解決這個(gè)問(wèn)題。,5.1.1基本概念 (二),回憶一下多進(jìn)程并行執(zhí)行的情況,在CPU上執(zhí)行的某個(gè)進(jìn)程因?yàn)榈却撤N資源而受阻時(shí),多任務(wù)操作系統(tǒng)可以使該進(jìn)程掛起,而根據(jù)某種調(diào)度原則啟動(dòng)另外一個(gè)不同的進(jìn)程執(zhí)行,直到前一進(jìn)程獲得其所需資源,才喚醒該進(jìn)程,讓它繼續(xù)執(zhí)行。 這樣,在多任務(wù)操作系統(tǒng)的調(diào)度下,可以讓多個(gè)進(jìn)程并行執(zhí)行,能夠較好地利用CPU資源,但仍然難以滿足現(xiàn)代應(yīng)用程序的需要。 例如,需要在同一應(yīng)用程序中完成聲音播放、圖像顯示、網(wǎng)絡(luò)文件下載等多項(xiàng)工作,如果使用傳統(tǒng)的單線程程序,就

3、只能順序的逐一實(shí)現(xiàn),而使用多線程方法則可以并發(fā)實(shí)現(xiàn)。,5.1.1基本概念 (三),多線程就是同一程序中多個(gè)任務(wù)的并發(fā)實(shí)現(xiàn)。它與進(jìn)程有相似之處,可以動(dòng)態(tài)的生成或銷毀等,它們之間的差別主要體現(xiàn)在如下兩個(gè)方面: 作為基本的執(zhí)行單元,線程的劃分比進(jìn)程小,因此,支持多線程的系統(tǒng)要比只支持多進(jìn)程的系統(tǒng)并發(fā)程度高。 進(jìn)程把內(nèi)存空間作為自己的資源之一,每個(gè)進(jìn)程均有自己的內(nèi)存單元。線程卻共享內(nèi)存單元,通過(guò)共享的內(nèi)存空間來(lái)交換信息,從而有利于提高執(zhí)行效率。 由于線程劃分更小,涉及的資源更少,因而使用更加靈活、方便。,5.1.1基本概念 (四),2線程調(diào)度與優(yōu)先級(jí) 應(yīng)用程序中的多個(gè)線程能夠并發(fā)執(zhí)行,但從系統(tǒng)的內(nèi)部來(lái)

4、看,所有線程仍然是串行的一個(gè)一個(gè)地執(zhí)行,那么如何來(lái)決定哪一個(gè)線程先執(zhí)行,哪一個(gè)線程后執(zhí)行呢? Java引入了優(yōu)先級(jí)的概念,優(yōu)先級(jí)就是線程獲得CPU而執(zhí)行的優(yōu)先程度,優(yōu)先級(jí)越高,獲得CPU的權(quán)力越大,執(zhí)行的機(jī)會(huì)越多,執(zhí)行的時(shí)間也越長(zhǎng)。,5.1.1基本概念 (五),Java把優(yōu)先級(jí)劃分為10級(jí),用1至10的整數(shù)表示,數(shù)值越大,優(yōu)先級(jí)越高。在創(chuàng)建線程時(shí),可以為線程分配優(yōu)先級(jí)。 在Thread類中定義了三個(gè)優(yōu)先級(jí)常量:MIN_PRIORITY, MAX_PRIORITY和NORM_PRIORITY,其值分別為1, 10, 5。 在為線程分配優(yōu)先級(jí)時(shí),其值應(yīng)該在1至10之間,否則將出錯(cuò)。 如果應(yīng)用程序沒(méi)

5、有為線程分配優(yōu)先級(jí),則Java系統(tǒng)為其賦值為NORM_PRIORITY。,5.1.1基本概念 (六),調(diào)度就是分配CPU資源,確定線程的執(zhí)行順序。 Java采用搶占式調(diào)度方式,即高優(yōu)先級(jí)線程具有剝奪低優(yōu)先級(jí)線程執(zhí)行的權(quán)力。 如果一個(gè)低優(yōu)先線程正在執(zhí)行,這時(shí)出現(xiàn)一個(gè)高優(yōu)先級(jí)線程,那么低優(yōu)先級(jí)線程就只能停止執(zhí)行,放棄CPU,推回到等待隊(duì)列中,等待下一輪執(zhí)行,而讓高優(yōu)先級(jí)線程立即執(zhí)行。 如果線程具有相同的優(yōu)先級(jí),則按先來(lái)先服務(wù)的原則調(diào)度。,5.1.1基本概念 (七),理解了Java的搶占式調(diào)度策略后,在設(shè)計(jì)程序時(shí),應(yīng)該讓高優(yōu)先級(jí)線程執(zhí)行一段時(shí)間后,能夠交出使用權(quán),放棄CPU。 有兩個(gè)方法可以達(dá)到這一

6、目的: 一是調(diào)用sleep()方法,暫時(shí)進(jìn)入睡眠狀態(tài),從而讓出CPU,使有相同優(yōu)先級(jí)線程和低優(yōu)先級(jí)線程有執(zhí)行的機(jī)會(huì)。 二是調(diào)用yield()而放棄CPU,這時(shí)和它有相同優(yōu)先級(jí)的線程就有執(zhí)行的機(jī)會(huì)。,5.1.1基本概念 (八),3線程的狀態(tài)與生命周期 每個(gè)Java程序都有一個(gè)缺省的主線程: 對(duì)于Application,主線程是main方法執(zhí)行的線索; 對(duì)于Applet,主線程指揮瀏覽器加載并執(zhí)行Java小程序。 要想實(shí)現(xiàn)多線程,必須在主線程中創(chuàng)建新的線程對(duì)象。Java語(yǔ)言使用Thread類及其子類的對(duì)象來(lái)表示線程。,5.1.1基本概念 (九),新建線程的生命周期如下: 1新建: 當(dāng)一個(gè)Threa

7、d類或其子類的對(duì)象被創(chuàng)建后,進(jìn)入這個(gè)狀態(tài)。 這時(shí),線程對(duì)象已被分配內(nèi)存空間,其私有數(shù)據(jù)已被初始化,但該線程還未被調(diào)度,可用start()方法調(diào)度,或用stop()方法中止。 新生線程一旦被調(diào)度,就將切換到可執(zhí)行狀態(tài)。,5.1.1基本概念 (十),2可運(yùn)行: 處于可執(zhí)行環(huán)境中,隨時(shí)可以被調(diào)度而執(zhí)行。它可細(xì)分為兩個(gè)子狀態(tài): 運(yùn)行狀態(tài),已獲得CPU,正在執(zhí)行; 就緒狀態(tài),只等待處理器資源。 這兩個(gè)子狀態(tài)的過(guò)渡由執(zhí)行調(diào)度器來(lái)控制。 3阻塞: 由某種原因引起線程暫停執(zhí)行的狀態(tài)。,5.1.1基本概念 (十一),4死亡: 線程執(zhí)行完畢或另一線程調(diào)用stop()方法使其停止時(shí),進(jìn)入這種停止?fàn)顟B(tài)。 它表示線程已

8、退出可運(yùn)行狀態(tài),并且不再進(jìn)入可運(yùn)行狀態(tài)。,5.1.1基本概念 (十二),5.1.1基本概念 (十三),線程控制方法 Thread類定義了許多控制線程執(zhí)行的方法。 程序中經(jīng)常使用下面的方法,對(duì)線程進(jìn)行控制: start():用于調(diào)用run()方法使線程開(kāi)始執(zhí)行。 stop(): 立即停止線程執(zhí)行,其內(nèi)部狀態(tài)清零,放棄占用資源。 suspend():暫停線程執(zhí)行。線程的所有狀態(tài)和資源保持不變,以后可以通過(guò)另一線程調(diào)用resume()方法來(lái)重新啟動(dòng)這個(gè)線程。,5.1.1基本概念 (十四),resume():恢復(fù)暫停的線程,安排暫停線程執(zhí)行。 sleep(): 調(diào)整Java執(zhí)行時(shí)間,所需參數(shù)是指定線程

9、的睡眠時(shí)間,以毫秒為單位。 join():調(diào)用線程等待本線程執(zhí)行結(jié)束。 yield():暫停調(diào)度線程并將其放在等待隊(duì)列末尾,等待下一輪執(zhí)行,使同優(yōu)先級(jí)的 其它線程有機(jī)會(huì)執(zhí)行 。,5.1.多線程實(shí)現(xiàn)方法 (一),創(chuàng)建新線程有兩種方法: 生成Thread子類 生成一個(gè)類,聲明實(shí)現(xiàn)Runnable接口 無(wú)論采用那種途徑,程序員可以控制的關(guān)鍵性操作有兩個(gè): 定義用戶線程的操作,即定義用戶線程的run方法; 在適當(dāng)時(shí)候建立用戶線程實(shí)例。,5.1.多線程實(shí)現(xiàn)方法 (二),1創(chuàng)建Thread類的子類 用這種方法生成新線程,可以按以下步驟進(jìn)行: 生成Thread類的子類。 在子類中覆蓋run()方法。 生成子

10、類的對(duì)象,并且調(diào)用start()方法啟動(dòng)新線程。,5.1.多線程實(shí)現(xiàn)方法 (三),這三個(gè)步驟可以用Java語(yǔ)言表述為 class NewThread extends Thread . public void run() . ,5.1.多線程實(shí)現(xiàn)方法 (四),在需要?jiǎng)?chuàng)建NewThread這個(gè)線程的類或方法中,生成NewThread對(duì)象。 即 NewThread thread = new NewThread(); thread.start();,5.1.多線程實(shí)現(xiàn)方法 (五),經(jīng)過(guò)這三步后新線程處于可執(zhí)行狀態(tài)。 start()方法將調(diào)用run()方法執(zhí)行線程。 run()方法就是新線程完成具體工作

11、的地方。 run()方法是Java執(zhí)行時(shí)為了啟動(dòng)線程而調(diào)用的第一個(gè)用戶定義方法,就好象main()是Java執(zhí)行時(shí)為了啟動(dòng)Application程序而調(diào)用的第一個(gè)用戶定義方法一樣。 ,5.1.多線程實(shí)現(xiàn)方法 (六),2實(shí)現(xiàn)Runnable接口 使用這種方法創(chuàng)建新線程,要完成以下幾步: 程序中某個(gè)類聲明實(shí)現(xiàn)Runnable接口,并且在這個(gè)類中實(shí)現(xiàn)run()方法。 生成這個(gè)類的對(duì)象。 用Thread(Runnable target)構(gòu)造函數(shù)生成Thread對(duì)象,其中target是聲明實(shí)現(xiàn)了Runnable接口的對(duì)象并且用start()方法啟動(dòng)線程。,5.1.多線程實(shí)現(xiàn)方法 (七),這三個(gè)步驟用Ja

12、va語(yǔ)言表述為: class NewThreadRun implements Runnable . public void run() . ,5.1.多線程實(shí)現(xiàn)方法 (八),用下面的代碼創(chuàng)建并執(zhí)行新線程 NewThreadRun n = new NewThreadRun(); Thread thread = new Thread(n); thread.start(); Runnable是java.long包中的一個(gè)接口。任何一個(gè)類都可以實(shí)現(xiàn)這個(gè)接口,從而實(shí)現(xiàn)創(chuàng)建和執(zhí)行線程的功能。實(shí)現(xiàn)Runnable接口的類必須覆蓋接口中定義的run()方法,它仍然是完成具體任務(wù)的地方。,5.1.多線程實(shí)現(xiàn)方法

13、 (九),以上兩種方法都可以創(chuàng)建和執(zhí)行線程,前一種方法要求一定是Thread類的子類,后一種方法可以不是Thread類的子類,但必須實(shí)現(xiàn)Runnable接口,這種方法使用更加靈活。 有時(shí)還只能使用后一種方法,如某類已經(jīng)定義為Applet類的子類,由于Java不允許多重繼承,這時(shí)不能再定義它為T(mén)hread類的子類,此時(shí)只有聲明其實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建和執(zhí)行新線程。,5.2 輸入輸出流類(一),計(jì)算機(jī)不僅對(duì)各類信息具有強(qiáng)大的處理能力,而且還能管理各種外部設(shè)備,如鍵盤(pán)、串行口、顯示器等,它們都是通過(guò)I/O端口與計(jì)算機(jī)相連。 計(jì)算機(jī)要對(duì)外設(shè)進(jìn)行有效控制,必須編寫(xiě)相應(yīng)的外設(shè)驅(qū)動(dòng)程序,由于I/O設(shè)

14、備性質(zhì)各不相同,且不斷更新?lián)Q代,增加了計(jì)算機(jī)管理外設(shè)的難度,5.2 輸入輸出流類(二),為了實(shí)現(xiàn)對(duì)外設(shè)的統(tǒng)一管理,屏蔽不同外設(shè)的差異,Java用java.io包實(shí)現(xiàn)上層軟件與硬件的隔離,引入流的概念,抽象地把產(chǎn)生數(shù)據(jù)的源和使用數(shù)據(jù)的目的聯(lián)系起來(lái)。 實(shí)際應(yīng)用時(shí),把流分為輸入流和輸出流,輸入流連在某個(gè)產(chǎn)生數(shù)據(jù)的設(shè)備上,輸出流連在某個(gè)接收數(shù)據(jù)的設(shè)備上,這樣計(jì)算機(jī)在處理輸入輸出時(shí),只是從輸入流中讀取數(shù)據(jù),把結(jié)果寫(xiě)出到輸出流中,而不必過(guò)問(wèn)與流相連的具體設(shè)備。,5.2 輸入輸出流類(三),流是一種抽象的數(shù)據(jù)類型,具有長(zhǎng)度(元素的個(gè)數(shù))、當(dāng)前位置(任意時(shí)刻的唯一存取點(diǎn))和存取方式(只讀、只寫(xiě)或讀寫(xiě))。 用戶

15、非常熟悉的一種流是傳統(tǒng)的磁盤(pán)文件,但是流的概念已經(jīng)擴(kuò)展為包括內(nèi)存中的流、來(lái)自于鍵盤(pán)的字符流、送往屏幕的字符流以及出入串行口(或其它設(shè)備)的字符流。 流的這些概念絕大多數(shù)都來(lái)自UNIX系統(tǒng),即“任何事物都是文件”的思想,結(jié)構(gòu)圖,5.2.1 File類(一),操作系統(tǒng)的文件管理是向應(yīng)用程序提供的最基本服務(wù)之一,但在計(jì)算機(jī)的發(fā)展過(guò)程中,形成了眾多的文件管理系統(tǒng),它們互不兼容,給用戶編程留下了相當(dāng)大的困難,Java消除了這種不兼容性。 File類能夠處理由本地文件系統(tǒng)維護(hù)的具體文件,它提供獨(dú)立于平臺(tái)的文件處理方法。 File類的構(gòu)造函數(shù): public File(Sting path) ; publi

16、c File(Sting path , String name) ; public File(File dir , String name) ;,5.2.1 File類(二),1文件路徑和屬性 。 getPath()方法返回File對(duì)象的路徑。 getAbsolutePath()方法返回File對(duì)象的絕對(duì)路徑 。 getName()方法返回File對(duì)象的文件名或目錄名。 與getPath()的含義不同,getName()方法要檢查給定字符串中是否含有路徑分隔符: 如果包含路徑分隔符,則取最后一個(gè)分隔符后的字符串作為文件名返回給調(diào)用者, 如果不包含路徑分隔符,則getName()和getPath

17、()返回相同的字符串。 getParent()返回File對(duì)象的父目錄。,5.2.1 File類(三),另外,F(xiàn)ile類還有幾個(gè)方法說(shuō)明文件的屬性或狀態(tài): exist(),canWrite(),canRead(),isFile(), isDirectory(), isAbsolute() 都返回boolean型數(shù)據(jù),分別表示文件是否存在,是否寫(xiě)保護(hù),是否讀保護(hù),是文件還是目錄,是否使用絕對(duì)路徑。 Java只能查詢上述文件屬性,其它屬性則不能查詢,如隱藏、系統(tǒng)、歸檔等屬性則無(wú)法查詢。File類的平臺(tái)獨(dú)立性,以放棄某些系統(tǒng)的個(gè)性為代價(jià)。 ,5.2.1 File類(四),2創(chuàng)建目錄和刪除文件 mkd

18、ir()和mkdirs()用于創(chuàng)建目錄。創(chuàng)建目錄的位置完全取決于File對(duì)象的路徑。 delete()用于刪除文件或目錄,刪除目錄時(shí),應(yīng)該保證所刪目錄是一個(gè)空目錄,否則刪除操作失敗。 3文件更名 renameTo()方法不但可以給文件更名,而且可以給目錄更名。 equals()判斷兩個(gè)File對(duì)象是否相等,程序用它來(lái)判斷用戶給定的原文件名和新文件名是否相等,如果相等則不能進(jìn)行更名操作。 ,5.2.1 File類(五),4目錄清單 list()方法產(chǎn)生目錄清單,它只返回指定目錄中包含的文件名或子目錄名,沒(méi)有文件長(zhǎng)度、修改時(shí)間、文件屬性等信息。 lastModified()返回文件最后一次被修改的

19、時(shí)間,其值是相對(duì)于1970年1月1日的時(shí)間毫秒數(shù),為了便于閱讀,必須變成java.util.Date對(duì)象。 說(shuō)明: File類不允許訪問(wèn)文件內(nèi)容,即讀寫(xiě)文件;也不能改變文件的屬性。 ,5.2.2 RandomAccessFile類(一),File類具有查詢文件屬性、狀態(tài)和文件名等功能,但不能訪問(wèn)文件內(nèi)容。 在java.io包中RandomAccessFile類和輸入輸出流類具有讀寫(xiě)文件的功能。 RandomAccessFile類只能進(jìn)行文件的輸入輸出,而流類功能更加強(qiáng)大,它可以進(jìn)行包括文件的一切輸入輸出操作。 RandomAccessFile類的定義如下: ,5.2.2 RandomAcces

20、sFile類(二),它提供了兩個(gè)構(gòu)造函數(shù): public RandomAccessFile(String name, String mode) throws IOException; public RandomAccessFile(File file, String mode) throws IOException; 其使用參數(shù)的含義是: name 是一個(gè)String對(duì)象,表示被訪問(wèn)的文件名。 file 是一個(gè)File對(duì)象,表示被訪問(wèn)的文件名,用這種方式提供文件名,應(yīng)用程序獨(dú)立于平臺(tái)。 mode 用字符串表示被訪問(wèn)文件的讀寫(xiě)模式:r表示文件以只讀方式打開(kāi),rw表示文件以讀寫(xiě)方式打開(kāi)。,5.2.

21、2 RandomAccessFile類(三),以讀寫(xiě)方式生成RandomAccessFile對(duì)象時(shí), 如果該文件不存在,則創(chuàng)建該文件,供程序進(jìn)行讀寫(xiě)操作; 如果該文件已經(jīng)存在,則以覆蓋方式(不是改寫(xiě)方式)把輸出數(shù)據(jù)寫(xiě)入到文件中,原文件中沒(méi)有被覆蓋的部分,仍然保留在文件之中。 在RandomAccessFile類中沒(méi)有專門(mén)打開(kāi)文件的方法,在生成RandomAccessFile對(duì)象時(shí),文件即被打開(kāi),可供程序訪問(wèn),這時(shí)文件讀寫(xiě)指針為0,即讀寫(xiě)位于文件的開(kāi)頭。,5.2.2 RandomAccessFile類(四),RadomAccessFile類實(shí)現(xiàn)了DataInput和DataOutput兩個(gè)接口,

22、這兩個(gè)接口分別定義了讀入和寫(xiě)出的方法。 DataInput和DataOutput中定義的方法基本上是相對(duì)應(yīng)的,即在DataInput中定義了一個(gè)讀入數(shù)據(jù)的方法,則在DataOutput中就有一個(gè)結(jié)構(gòu)相似的寫(xiě)出方法。 但DataInput接口多出幾個(gè)與寫(xiě)出操作無(wú)關(guān)的方法: skipBytes() 在輸入流中跳過(guò)n個(gè)字節(jié) readUnsignedByte() 讀入一個(gè)無(wú)符號(hào)字節(jié)數(shù)據(jù) readLine() 讀入一行字符。有四種行結(jié)束符:回車符r,新行符n,回車符后緊跟新行符,或者文件結(jié)束。讀入的一行字符中包含行結(jié)束符。,5.2.2 RandomAccessFile類(五),由于讀入和寫(xiě)出方法的含義相

23、似,因此我們用寫(xiě)出方法來(lái)說(shuō)明不同格式的含義。 有的寫(xiě)出方法帶有不同的后綴,分別為Byte, Short,Int,Long, Float,Double, Char,Boolean,這些方法表示寫(xiě)出Java基本數(shù)據(jù)類型的數(shù)據(jù),如writeInt()表示寫(xiě)出一個(gè)int型整數(shù)。 對(duì)于用這些方法寫(xiě)出的數(shù)據(jù),應(yīng)該用帶有相同后綴的讀入方法來(lái)讀取數(shù)據(jù),否則可能出錯(cuò)。 這些方法中writeBoolean()比較特殊,寫(xiě)出數(shù)據(jù)時(shí)用0表示false,用1表示true; 而用readBoolean()讀入數(shù)據(jù)時(shí),如果是0,則返回false,非0返回true。,5.2.2 RandomAccessFile類(六),有三

24、個(gè)方法與字符串的寫(xiě)出有關(guān),它們是: writeBytes() 寫(xiě)出字符串時(shí),每個(gè)字符占一個(gè)字節(jié),即8位。 writeChars() 在支持Unicode碼的機(jī)器上寫(xiě)出字符串,每個(gè)字符占2個(gè)字節(jié),即16位。 writeUTF() 以8位編碼的方式寫(xiě)出字符串。 其中的前兩個(gè)字節(jié),表示以后將要寫(xiě)出數(shù)據(jù)的字節(jié)總數(shù),其值由系統(tǒng)統(tǒng)計(jì)。從第三個(gè)字節(jié)開(kāi)始寫(xiě)出字符串?dāng)?shù)據(jù),每個(gè)字符占一個(gè)字節(jié)。 例如:writeUTF(abc),則其結(jié)果用十六進(jìn)制表示為:00h,03h, 61h, 62h, 63h,共寫(xiě)出5個(gè)字節(jié),前兩個(gè)字節(jié)的值表示其后還將寫(xiě)出3個(gè)字節(jié)。,5.2.2 RandomAccessFile類(七),另外

25、有三個(gè)不帶任何后綴的寫(xiě)出方法,都是按字節(jié)寫(xiě)數(shù)據(jù)。 write(int b); write(byte b); write(byte b, int off, int len); 其參數(shù)的含義為: b 一個(gè)字節(jié)數(shù)據(jù)或字節(jié)數(shù)組。 off 表示從數(shù)組中第幾個(gè)字節(jié)開(kāi)始寫(xiě)出數(shù)據(jù)。 len 表示寫(xiě)出字節(jié)的總數(shù)。 ,5.2.2 RandomAccessFile類(八),RandomAccessFile類除具有讀寫(xiě)文件的方法外,還定義了與文件操作相關(guān)的一些方法: seek() 支持隨機(jī)訪問(wèn)文件,它通過(guò)移動(dòng)文件的讀寫(xiě)指針實(shí)現(xiàn)文件的隨機(jī)讀寫(xiě)。其參數(shù)表示讀寫(xiě)指針相對(duì)于文件起始位置的偏移量。 getFilePoint()

26、 返回當(dāng)前文件指針的位置。 close() 關(guān)閉文件和釋放與打開(kāi)文件有關(guān)的資源。在使用完文件或使用中出現(xiàn)異常后,都應(yīng)該關(guān)閉文件。在處理異常的try-catch-finally結(jié)構(gòu)中,無(wú)論是try內(nèi)程序段正常結(jié)束,還是發(fā)生異常后,都要執(zhí)行finally中的程序段,所以,close()語(yǔ)句可以安排在finally中。 ,5.2.3抽象流類 (一),流具有處理輸入輸出的功能,java.io包中的類以流類為主。 Java定義了兩個(gè)抽象類InputStream類和OutputStream類,還派生了很多與流有關(guān)的子類。 InputStream類提供了有關(guān)讀入數(shù)據(jù)的方法,讀入數(shù)據(jù)時(shí)都是以字節(jié)為單位,可以一

27、個(gè)字節(jié)一個(gè)字節(jié)的讀入數(shù)據(jù),也可以讀入任意長(zhǎng)度的字節(jié)塊。 OutputStream類輸出流寫(xiě)出數(shù)據(jù)也是以字節(jié)為單位,即可以一個(gè)字節(jié)一個(gè)字節(jié)地寫(xiě)出數(shù)據(jù),也可以一次寫(xiě)出任意長(zhǎng)度的字節(jié)塊。,5.2.3抽象流類 (二),1InputStream類 類中mark(), reset(), makeSupported()三個(gè)方法與標(biāo)記復(fù)位操作有關(guān),它們的作用是: mark()在輸入流(如文件)中任意位置作一標(biāo)記,從標(biāo)記位置開(kāi)始,以后讀入的字節(jié)數(shù)據(jù)可以用reset()方法取消,使輸入流的讀入位置復(fù)位到標(biāo)記處。 完成這種標(biāo)記復(fù)位功能的前提條件是markSupported()方法返回值必須為true。如果返回為fa

28、lse,則表示不支持這種功能。,5.2.3抽象流類 (三),在使用這種標(biāo)記復(fù)位功能時(shí),mark()所需readlimit參數(shù)代表一個(gè)極限值,它表示從標(biāo)記位置開(kāi)始,到用reset()取消讀入數(shù)據(jù)時(shí),最多能讀入的字節(jié)數(shù)。如果讀入的字節(jié)數(shù)已經(jīng)超過(guò)了readlimit限制,再使用reset(),則復(fù)位的位置不確定。 所以,在編程中需要使用標(biāo)記復(fù)位功能時(shí),應(yīng)該小心謹(jǐn)慎。,5.2.3抽象流類 (四),所有InputStream的子類都是針對(duì)不同的輸入數(shù)據(jù)源,其類名的前綴清楚地表示出輸入的數(shù)據(jù)源: FileInputStream類的數(shù)據(jù)源是文件。 PipedInputStream類的數(shù)據(jù)源是管道。 Filt

29、erInputStream類及其子類是加強(qiáng)流,它的功能更加強(qiáng)大,使用更加靈活。,5.2.3抽象流類 (五),2OutputStream類 OutputStream類的子類: ByteArrayOutputStream類 FileOutputStream類 PipedOutputStream類 FilterOutputStream類和它的子類加強(qiáng)輸出流的功能。,5.2.4文件輸入輸出流類 (一),1FileInputStream類 它有三個(gè)構(gòu)造函數(shù),各自使用不同的參數(shù): name 用String對(duì)象表示文件名。 file 用File對(duì)象表示文件名,使應(yīng)用程序獨(dú)立于平臺(tái)。 fdObj 用FileD

30、escriptor對(duì)象表示文件名,F(xiàn)ileDescriptor類定義一個(gè)本地文件系統(tǒng)。在生成FileInputStream對(duì)象時(shí)同時(shí)打開(kāi)文件以供應(yīng)用程序讀入數(shù)據(jù)。,5.2.4文件輸入輸出流類 (二),FileInputStream類覆蓋了InputStream類的read()方法,它們都是按字節(jié)讀入數(shù)據(jù): 不帶參數(shù)的read()一次只能讀入一個(gè)字節(jié), 另外兩個(gè)read()一次可以讀入任意多個(gè)字節(jié)。 在讀入數(shù)據(jù)后,前一個(gè)read()方法返回讀入的字節(jié)數(shù)據(jù),后兩個(gè)方法返回讀入的字節(jié)數(shù),如果遇到文件結(jié)束符,則返回-1。 ,5.2.4文件輸入輸出流類 (三),2FileOutputStream類 Fi

31、leOutputStream類和FileInputStream類在構(gòu)造函數(shù)和方法的參數(shù)定義上都十分相似,只是一個(gè)針對(duì)輸入,另一個(gè)針對(duì)輸出。 生成FileOutputStream對(duì)象時(shí),如果文件不存在,則創(chuàng)建該文件供程序輸出數(shù)據(jù),如果文件已經(jīng)存在,則有改寫(xiě)和附加兩種輸出數(shù)據(jù)的方式: 改寫(xiě)的含義是先把原文件長(zhǎng)度截為零,原文件數(shù)據(jù)被丟棄,然后再輸出數(shù)據(jù); 附加的含義是在原文件末尾追加輸出數(shù)據(jù),原文件數(shù)據(jù)仍然存在。,5.2.4文件輸入輸出流類 (四),除使用第二個(gè)構(gòu)造函數(shù)生成對(duì)象外,其余都是以改寫(xiě)方式輸出數(shù)據(jù)。第二個(gè)構(gòu)造函數(shù)中增加了append參數(shù),可以選擇輸出數(shù)據(jù)的方式,該參數(shù)為true表示附加方式

32、,false表示改寫(xiě)方式。 說(shuō)明:FileInputStream類和FileOutputStream類具有讀寫(xiě)文件的方法,但它們讀寫(xiě)數(shù)據(jù)的效率并不高,Java鼓勵(lì)程序員用更有效的方法覆蓋有關(guān)讀寫(xiě)方法,以提高應(yīng)用程序的性能。,5.2.5加強(qiáng)輸入輸出流類 (一),我們把FilterInputStream類和FilterOutputStream類以及它們的子類,稱為加強(qiáng)輸入輸出流類,因?yàn)椋眠@些流類不但可以改進(jìn)程序的輸入輸出性能,而且功能更加強(qiáng)大。 FilterInputStream類的子類: BufferedInputStream類 DataInputStream類 FilterOutputSt

33、ream類的子類 BufferedOutputStream類 DataOutputStream類,5.2.5加強(qiáng)輸入輸出流類 (二),1FilterInputStream類和FilterOutputStream類 FilterInputStream類和FilterOutputStream類與InputStream類和OutputStream類相比,并沒(méi)有增加任何新的方法,只是分別覆蓋InputStream類和OutputStream類的所有方法。,5.2.5加強(qiáng)輸入輸出流類 (二),它們真正的改變是在其構(gòu)造函數(shù)上: protected FilterInputStream(InputStream

34、 in) protected FilterOutputStream(OutputStream out) 它們要求的參數(shù)分別是一個(gè)InputStream對(duì)象、OutputStream對(duì)象,即是任意一個(gè)輸入流或輸出流對(duì)象,而不是InputStream類和OutputStream類要求的String或File對(duì)象。,5.2.5加強(qiáng)輸入輸出流類 (三),2. BufferedInputStream類和BufferedOutputStream類 這兩個(gè)類都在標(biāo)準(zhǔn)讀寫(xiě)功能和應(yīng)用程序之間,增加輸入輸出緩沖機(jī)制,從而顯著地提高輸入輸出的速度。 BufferedInputStream類用于提高讀入數(shù)據(jù)的速度,構(gòu)

35、造函數(shù)如下: public BufferedInputStream(InputStream in); public BufferedInputStream(InputStream in, int size);,5.2.5加強(qiáng)輸入輸出流類 (四),它的構(gòu)造函數(shù)使用輸入流對(duì)象,在生成BufferedInputStream對(duì)象時(shí)可以設(shè)置輸入緩沖區(qū)的大小,也可以使用缺省值,其值是2048字節(jié)。生成BufferedInputStream對(duì)象后,應(yīng)用程序在讀入數(shù)據(jù)時(shí),直接取自于緩存區(qū),從而提高讀入數(shù)據(jù)的速度。 BufferedOutputStream類用于提高寫(xiě)出數(shù)據(jù)的速度,它與BufferedInput

36、Stream類相似,使用輸出緩沖區(qū)來(lái)提高輸出數(shù)據(jù)的速度,輸出緩沖區(qū)的缺省大小為512字節(jié)。,5.2.5加強(qiáng)輸入輸出流類 (五),3DataInputStream類和DataOutputStream類 結(jié)合RandomAccessFile類就很容易理解這兩個(gè)類,因?yàn)椋琑andomAccessFile類同時(shí)實(shí)現(xiàn)了兩個(gè)接口:DataInput接口和DataOutput接口,而DataInputStream類和DataOutputStream類分別實(shí)現(xiàn)了這兩個(gè)接口。 所以,DataInputStream類中讀數(shù)據(jù)的方法和DataOutputStream類中寫(xiě)數(shù)據(jù)的方法,與RandomAccessFil

37、e類中的讀寫(xiě)方法含義完全一致,在此不再贅述。,5.2.6其它輸入輸出流類(一),本節(jié)將介紹的輸入流類有: SequenceInputStream類 PipedInputStream類 輸出流類有: PipedOutputStream類 1SequenceInputStream類 SequenceInputStream類可以將兩個(gè)或幾個(gè)輸入流不露痕跡地接合在一起,生成一個(gè)長(zhǎng)長(zhǎng)的接合流,在讀入數(shù)據(jù)時(shí),它忽略前面幾個(gè)輸入流的結(jié)束符EOF,直到最后一個(gè)流的結(jié)束符EOF時(shí),才完成流的輸入,其定義如下: ,5.2.6其它輸入輸出流類(二),2管道輸入輸出流類 管道是UNIX的發(fā)明,它大大增強(qiáng)了流的概念。其

38、含義如下面的命令串所示: c:dir|sort|more 這里使用了兩個(gè)管道(用|表示)把三個(gè)命令連在一起,第一個(gè)管道把dir命令的輸出連接到sort命令的輸入,第二個(gè)管道將sort命令的輸出連到more命令的輸入,從而實(shí)現(xiàn)生成目錄清單,進(jìn)行排序后,一頁(yè)一頁(yè)地顯示。 Java使用了管道技術(shù),用PipedInputStream類和PipedOutputStream類實(shí)現(xiàn)管道操作,這兩個(gè)類必須同時(shí)使用 。 ,5.2.6其它輸入輸出流類(三),管道技術(shù)在多線程系統(tǒng)中使用較多,它可以解決不同線程之間同步通訊的問(wèn)題,從而保證大量數(shù)據(jù)交換順利進(jìn)行。 要實(shí)現(xiàn)多線程的同步通訊,必須把管道連接起來(lái),這里有兩種方

39、法實(shí)現(xiàn)管道的連接: 使用帶參數(shù)的構(gòu)造函數(shù)。 使用不帶參數(shù)的構(gòu)造函數(shù),再調(diào)用任何一個(gè)類的connect()方法,實(shí)現(xiàn)輸入管道和輸出管道的連接。 ,運(yùn)行結(jié)果,Reader和Writer,InputStream類和OutputStream類及其子類,讀寫(xiě)流內(nèi)數(shù)據(jù)時(shí)以字節(jié)為單位。 Reader類和Writer類及其子類,讀寫(xiě)流內(nèi)數(shù)據(jù)時(shí)以字符為單位。 兩種流類中定義的方法的種類和參數(shù)大致相同。 例如: public int read(byte b, int off, int len); public int read(char b, int off, int len);,結(jié)構(gòu)圖,5.3 網(wǎng)絡(luò)編程,jav

40、a .net包按功能分組,Internet尋址 InetAddress類和URL類 UDP/IP無(wú)連接服務(wù)類 DatagramPacket類和DatagramSocket類 TCP/IP Socket類和ServerSocket類 WWW URL類和URLConnection類,5.3.1 InetAddress類,InetAddress類提供有關(guān)從域命地址查詢IP地址的方法。 Public final class InetAddress implements Serializable pulic static InetAddress getByName(String host) throws

41、 UnknownHostException; pulic static InetAddress getAllByName(String host) throws UnknownHostException; pulic static InetAddress getLocalHost(String host) throws UnknownHostException;,5.3.1 InetAddress類,public String getHostName();/獲取主機(jī)名 public byte getAdress(); /獲取整數(shù)IP地址需轉(zhuǎn)換才可正確顯示 public String getHo

42、stAddress(); /獲取IP地址 public boolean equals(Object obj); public int hashCode(); public boolean isMulticastAddress(); public String toString(); /獲取主機(jī)名/IP地址 ,例子:運(yùn)行結(jié)果,5.3.2 Socket類和ServerSocket類,一通信機(jī)制 1Server端 創(chuàng)建ServerSocket對(duì)象,在某個(gè)端口提供監(jiān)聽(tīng)服務(wù)。 等待來(lái)自Client端的請(qǐng)求服務(wù)。 接收Client端的請(qǐng)求,用返回的Socket建立連接。 通過(guò)向Socket讀寫(xiě)數(shù)據(jù)與Cli

43、ent端通信。 關(guān)閉Socket,結(jié)束當(dāng)前通信,等待其它請(qǐng)求。 關(guān)閉ServerSocket對(duì)象結(jié)束監(jiān)聽(tīng)服務(wù)。,一通信機(jī)制:Client端,創(chuàng)建Socket對(duì)象,向Server的監(jiān)聽(tīng)端口發(fā)出請(qǐng)求。 通過(guò)向Socket讀寫(xiě)數(shù)據(jù)與Server端通信。 關(guān)閉Socket,結(jié)束與Socket通信。,二Socket類,構(gòu)造函數(shù) public Socket(String host, int port); public Socket(InetAddress addresst, int port) throws IOException; public Socket(String host, int port,

44、 InetAddress localAddr, int localPort) throws IOException; public Socket(InetAddress addresst, int port, InetAddress localAddr, int localPort) throws IOException; /主機(jī),端口號(hào),客戶地址,客戶端口號(hào),二Socket類,常用方法 public InputStream getInputStream() throws IOException; /獲得從服務(wù)器到客戶機(jī)的數(shù)據(jù)輸入流 public OutputStream getOutputS

45、tream() throws IOException; /獲得從客戶機(jī)到服務(wù)器的數(shù)據(jù)輸出流 public synchronized void close() thows IOException;,三ServerSocket類,構(gòu)造函數(shù) public ServerSocket(int port) throws IOException; public ServerSocket(int port, int backlog) throws IOException; public ServerSocket(int port, int backlog, InetAddress bindAddr) thro

46、ws IOException; port:服務(wù)器守候的端口號(hào)。 backlog:允許同時(shí)聯(lián)入服務(wù)器的客戶機(jī)數(shù)目,缺省值位50。 bindAddr:指該端口捆綁的IP地址,常用于多地址的主機(jī)。,三ServerSocket類,創(chuàng)建一個(gè)ServerSocket類 ServerSocket myServer = new ServerSocket(port); 為了監(jiān)聽(tīng)可能的Client請(qǐng)求: Socket linkSocket = myServer.accept(); 監(jiān)聽(tīng)端口,使Server端口的程序處于等待狀態(tài); 程序?qū)⒁恢弊栀愔钡讲蹲降紺lient端的請(qǐng)求,并返回一個(gè)與該Client通信的Socket對(duì)象; 以后Server程序只要向這個(gè)Socket對(duì)象讀寫(xiě)數(shù)據(jù),就可實(shí)現(xiàn)向遠(yuǎn)端的Client讀寫(xiě)數(shù)據(jù)。 結(jié)束監(jiān)聽(tīng): myServer.close(); ,5.3.3 DatagramPacket類和DatagramSocket類,DatagramPacket類的構(gòu)造函數(shù) public DatagramPacket(byte ibuf, in

溫馨提示

  • 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)論