《java程序設計(人工智能方向)》課件-項目7多線程與IO文件流_第1頁
《java程序設計(人工智能方向)》課件-項目7多線程與IO文件流_第2頁
《java程序設計(人工智能方向)》課件-項目7多線程與IO文件流_第3頁
《java程序設計(人工智能方向)》課件-項目7多線程與IO文件流_第4頁
《java程序設計(人工智能方向)》課件-項目7多線程與IO文件流_第5頁
已閱讀5頁,還剩99頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

多線程與I/O文件流項目7目

錄CONTENT-I/O(輸入/輸出)流24多線程-13項目導讀現在的操作系統都是多任務操作系統,每個運行的任務就是操作系統所做的一件事情。例如,你在聽歌的同時還在用微信聊天,聽歌和聊天就是兩個任務,這兩個任務是“同時”進行的。Java應用程序通過多線程技術共享系統資源,線程之間的通信與協同通過簡單的方法調用完成。在Java中,常見的I/O文件流的特點是每個連接單位時間內只能為一個線程服務,且在這個時間段內,線程不進行計算或讀/寫內存,線程在使用I/O時,一般不會使用CPU或內存,這個特點是多線程的重要意義之一。在一個線程使用I/O時,將CPU使用權轉移給其他線程,可以更加充分地利用系統資源。學習目標素質目標技能目標知識目標●了解線程與多線程的概念?!裾莆战⒍嗑€程的方法?!窳私饬鞯母拍?。●掌握Java的文件讀/寫機制和輸入/輸出流的使用。●能夠利用Thread類建立多線程方法。●能夠利用Thread接口建立多線程方法?!衲軌蚶肐/O文件流進行輸入/輸出流的應用●激發同學的愛國熱情,開闊眼界,提升學好專業知識的信心及興趣?!衽囵B學生克服畏難情緒,努力掌握編程技術,一步一個腳印,掌握核心技術?!衽囵B學生理論聯系實際,提高學以致用的能力;培養學生國情意識,促進社會責任感?!衽囵B團隊協作和工匠精神。任務1多線程CurriculumDevelopmentTechnology1任務1

多線程小明制作的購物管理系統需要測試通過多線程的方法進行會員支付的效果演示。系統會為10個需要結算的會員分配線程,線程根據執行過程調用支付方法,相當于誰先到了付款臺就可以先付款,沒有按照分配的順序進行有序結算,而是根據線程優先獲得CPU的順序進行結算。完成后的部分效果如圖7-1-1所示。任務描述想一想在生活中有哪些多線程的例子?多線程在現代生活中有許多實際應用,以下是一些常見的例子:1.操作系統:操作系統本身需要處理多任務,比如同時運行多個應用程序,每個應用程序可能在單獨的線程中執行不同的任務。2.Web服務器:Web服務器可以通過多線程處理并發請求,每個請求可以在獨立的線程中進行處理,提高服務器的響應速度和并發能力。3.圖形用戶界面(GUI)應用程序:GUI應用程序需要響應用戶的多個事件和操作,通常會使用多線程來處理用戶界面的更新和后臺任務的執行,以保持界面的響應性。4.游戲開發:現代游戲通常需要處理復雜的圖形渲染、物理模擬和用戶輸入,這些任務可以通過多線程來并行處理,提高游戲的性能和響應速度。拓展—在生活中有哪些多線程的例子?任務1

多線程在本次任務中,要完成通過多線程的方法進行會員支付的效果演示,需要掌握如下技能:●通過對類的學習修改作為線程同步執行的方法?!裢ㄟ^學習線程創建線程數組,分配10個會員線程,并執行線程。●通過學習重寫創建線程的run()方法,調用會員支付類中的同步方法。技術分析任務1

多線程步驟1:利用復制方法創建一個新的會員支付類(1)打開SuperMarketManager項目。(2)找到src包下面的view包中的CustPay會員支付類,復制CustPay類,命名為CustPay1類。任務實施小提示當復制完一個類后,必須雙擊復制好的類,才能進行復制后類的操作,否則還是在原來的類中進行操作。任務1

多線程步驟2:創建線程同步方法將CustPay1類中的main()方法修改為custpay方法(會員支付方法),并利用關鍵字synchronized設置線程同步,代碼如下:多線程任務講解-abgtgb任務1

多線程小提示synchronized關鍵字可以修飾方法和代碼塊,但是不能修飾構造器和屬性。存放線程執行體的run()方法不能用synchronized關鍵字修飾,這樣線程依然不安全,只能修飾另外一個方法,然后在run()方法中調用該方法。當同步代碼塊和同步方法同時維護多線程安全時,必須保證它們持有的同步監視器相同,即this,否則線程不安全。任務1

多線程步驟3:創建PayThread線程類在view包中利用繼承Thread類的方式創建線程PayThread類,并重寫run()方法,代碼如下:小提示線程執行必須先創建線程實例對象。任務1

多線程步驟4:創建PayThreadTest測試類在src包下面的view包中創建類,類名為PayThreadTest,此類主要是為了創建包含10個數組元素的線程數組,并執行線程,代碼如下:任務1

多線程步驟5:運行PayThreadTest測試類,查看測試效果運行PayThreadTest測試類,測試結果見圖7-1-1。任務1

多線程知識點1:多線程概述進程是一個正在執行的程序。每一個進程執行都有一個執行順序。該順序是一個執行路徑,或稱為一個控制單元。線程就是進程中的一個控制單元,其控制著進程的執行。一個進程至少有一個線程。而多線程是指程序中包含多個執行流,即在一個程序中可以同時運行多個不同的線程來執行不同的任務,也就是說允許單個程序創建多個并行執行的線程來完成各自的任務。必備知識多線程概念-rsgvrf任務1

多線程Java語言支持程序并行執行的多線程編程,實現了一般傳統語言難以實現的某些功能,如實時交互能力、多CPU的支持。線程是程序中的一條執行路徑,多線程是指程序中包含多條執行路徑,在一個程序中可以同時運行多個不同的線程來執行不同的任務,即允許單個程序創建多個并行執行的線程來完成各自的任務。瀏覽器程序就是一個多線程的例子,在瀏覽器中可以在下載Java小程序或圖像的同時滾動頁面,在訪問新頁面時播放動畫和聲音、打印文件等。多線程編程的含義是將程序任務分成幾個并行的子任務,在多線程的情況下,可以用兩個獨立的線程去完成這些功能,而不影響正常的顯示或其他功能。單線程在讀網絡數據和等待用戶輸入時有很多時間處于等待狀態,多線程利用這個特點將任務分成多個并發任務后就可以提高系統執行效率。在多線程程序中,多個線程可共享一塊內存區域和資源。Java的多線程運行與操作系統緊密相關,操作系統的線程執行效率越高,程序的執行效率就越高。Java的線程是通過java.lang.Thread類來實現的,在該類中封裝了虛擬的CPU小提示線程實際上是在一個進程的基礎上進一步進行劃分,一個進程啟動之后,里面的若干執行路徑又可以劃分成若干個線程。任務1

多線程進程與線程是包含關系,但是多任務既可以由多線程實現,也可以由單進程內的多線程實現,還可以混合多進程+多線程。具體采用哪種方式,要考慮到進程和線程的特點。多進程穩定性比多線程高,因為在多進程的情況下,一個進程崩潰不會影響其他進程,而在多線程的情況下,任何一個線程崩潰會直接導致整個進程崩潰。除此之外,多進程也有一些缺點,具體如下:創建進程比創建線程開銷大,尤其是在Windows系統上。進程間通信比線程間通信要慢,因為線程間通信就是讀/寫同一個變量,速度很快。任務1

多線程1.常用創建線程的兩種方式在Java中主要提供兩種方式實現線程,分別為繼承java.lang.Thread類與實現java.lang.Runnable接口。(1)繼承Thread類。Thread類是java.lang包中的一個類,從這個類中實例化的對象代表線程,程序員啟動一個新線程需要建立Thread實例。Thread類中常用的兩個構造方法如下:任務1

多線程繼承Thread類創建一個新線程的格式如下:任務1

多線程繼承Thread類創建線程的步驟如下:①定義Thread類的子類,并重寫該類的run()方法,該run()方法的方法體代表了該線程要完成的任務。因此,run()方法又稱為方法執行體。②創建Thread子類的實例,即創建了線程對象。③用線程對象的start()方法來啟動該線程。任務1

多線程例如,創建一個ThreadExample類,利用繼承Thread類的方法創建線程,代碼如下:在Java中,創建線程有兩種主要的方式:一種是繼承Thread類,另一種是實現Runnable接口。繼承Thread類創建線程時,必須重寫Thread類的run()方法,這是因為Thread類本身實現了Runnable接口,并且定義了run()方法的抽象形式。拓展—為什么利用繼承Thread類創建線程時,繼承Thread之后必須寫一個run的重寫方法?任務1

多線程運行測試結果如圖7-1-2所示。小提示完成線程功能的代碼放在類的run()方法中,當一個類繼承Thread類后,就可以在該類中覆蓋run()方法,將實現該線程功能的代碼寫入run()方法中,同時調用Thread類中的start()方法執行線程,也就是調用run()方法。getName()獲取線程的名稱,默認線程的名稱為Thread-編號。任務1

多線程(2)實現Runnable接口。線程都是通過擴展Thread類創建的,如果需要繼承其他類(非Thread類),并實現多線程,則可以通過Runnable接口來實現。實現Runnable接口的格式如下:任務1

多線程這兩個構造方法的參數都存在于Runnable實例,使用上面的構造方法可以將Runnable實例與Thread實例相關聯。使用Runnable接口啟動新線程的步驟如下。①創建Runnable對象。②使用參數為Runnable對象的構造方法創建Thread實例對象。③調用start()方法啟動線程。實現Runnable接口的程序會創建一個Thread對象,將Runnable對象與Thread對象相關聯。Thread類中有如下兩個構造方法:任務1

多線程例如,創建一個RunnableExample類,使用Runnable接口啟動新線程,代碼如下:任務1

多線程運行測試結果如圖7-1-3所示。想一想必須重寫run()方法嗎?任務1

多線程通過Runnable接口創建線程,首先編寫一個實現Runnable接口的類,然后實例化該類的對象,創建一個Runnable對象,然后使用相應的構造方法創建一個Thread實例對象;最后使用該實例對象調用Thread類中的start()方法啟動線程。圖7-1-4所示為通過實現Runnable接口創建線程的流程圖。任務1

多線程2.線程的生命周期一個線程“創建-工作-死亡”的過程稱為線程的生命周期,線程生命周期共有5個狀態:新建狀態(new)、就緒狀態(runnable)、運行狀態(running)、阻塞狀態(blocked)和死亡狀態(dead),如圖7-1-5所示。小提示線程的狀態之間可以相互轉換。比如一個新建狀態的線程可以通過啟動進入可運行狀態,可運行狀態的線程可以被阻塞、等待或計時等待,而處于等待或計時等待狀態的線程也可以通過喚醒或時間到期來轉換回可運行狀態。任務1

多線程(1)新建狀態。新建狀態指創建了一個線程,但它還沒有啟動。處于新建狀態的線程對象只能夠被啟動或終止。例如,以下代碼使線程myThread處于新建狀態:任務1

多線程(2)就緒狀態。就緒狀態是當線程處于新建狀態后,調用了start()方法,線程就處于就緒狀態。就緒狀態線程具備了運行條件,但尚未進入運行狀態。處于就緒狀態的線程可有多個,這些就緒狀態的線程將在就緒隊列中排隊,等待CPU資源。線程通過線程調試獲得CPU資源變成運行狀態。例如,以下代碼使線程myThread進入就緒狀態:任務1

多線程運行狀態是指某個就緒狀態的線程獲得CPU資源正在運行。如果有更高優先級的線程進入就緒狀態,則該線程將被迫放棄對CPU的控制權,進入就緒狀態。使用yield()方法可以使線程主動放棄CPU。線程也可能由于執行結束或執行stop()方法進入死亡狀態。每個線程對象都有一個run()方法,當線程對象開始執行時,系統就調用該對象的run()方法。(3)運行狀態。阻塞狀態是正運行的線程遇到某個特殊情況,如延遲、掛起、等待I/O操作完成等進入的一種狀態。進入阻塞狀態的線程讓出CPU,并暫時停止自己的執行。線程進入阻塞狀態后,就一直等待,直到引起阻塞的原因被消除,線程又轉入就緒狀態,進入就緒隊列排隊。當線程再次變成運行狀態時,將從原來暫停處開始繼續運行。(4)阻塞狀態。任務1

多線程(5)死亡狀態:線程執行完成或因異常退出了run()方法,該線程結束生命周期。三種阻塞狀態-qrijor任務1

多線程3.多線程控制(1)操作線程。如果創建線程正常,可在線程的run()方法中控制線程,一旦進入run()方法,便可執行其中的任何程序,run()好像main()一樣,一旦run()執行完,這個線程也就結束了。若想推遲一個線程的執行,應使用sleep(delay)休眠方法,參數delay是休眠的時間(毫秒),當線程休眠時并不占用系統資源,其他線程可繼續工作。多線程的調度和優先級-f3fxaq任務1

多線程(2)暫停一個線程。經常需要掛起一個線程而不指定多少時間。例如,若創建了一個含有動畫線程的小程序,讓用戶暫停動畫直到想恢復為止,若不想將動畫線程扔掉但想讓它停止,可用suspend()方法掛起。用suspend()方法掛起線程并不永久地停止線程,可用resume()方法重新激活線程。(3)停止一個線程。線程的最后一個控制是stop()方法,其可以停止線程的執行。注意這并沒有消滅這個線程,但它停止了線程的執行,并且這個線程不能用start()方法重新啟動。一般不用stop()停止一個線程,只簡單地讓線程執行完而已。很多復雜的線程程序將需要控制每一個線程,在這種情況下會用到stop()方法,如果需要,可以測試線程是否被激活。一個線程已經啟動而且沒有停止即被認為是激活的,如果線程t1是激活的,則t1.isAlive()將返回true。任務1

多線程(4)join線程。Thread類提供了讓一個線程等待另一個線程完成的方法join()。當在某個線程執行流中調用其他線程的join()方法時,調用者線程將被阻塞,直到被join()方法加入的join線程執行完成為止。方法如下:通過join()方法可以臨時加入線程執行,join()方法通常由使用線程的程序調用(如main線程),將大問題劃分成許多小問題,每個小問題分配一個線程。當所有小問題都得到處理后,再調用主線程來進一步操作。任務1

多線程4.多線程的互斥與同步(1)多線程互斥。程序中的多個線程一般是各自獨立運行的,各個線程有自己的數據和方法,但有時需要在多個線程之間共享一些資源對象,這些資源對象的操作在某些時候必須在線程間很好地協調以保證它們的正確使用,不考慮協調性就可能產生錯誤。多線程的互斥與同步-3dw5dy任務1

多線程在Java語言中,為保證線程對共享資源操作的完整性,用關鍵字synchronized為共享資源加鎖來解決這個問題,這個鎖使得共享資源對線程是互斥操作的,稱為互斥鎖。synchronized可修飾一個代碼塊或一個方法,使修飾對象在任一時刻只能有一個線程訪問,從而提供了程序的異步執行功能。使用synchronized的格式如下:明德樹人乘坐高鐵需要在網上或人工窗口進行購票,購買車票正常情況下是一座一人,不能同時多個人擁有同一個票,但是如果出現特殊情況(如機器故障),則會出現多線程共享導致資源擁堵與沖突,那么可能會出現一座兩人的情況。在資源共享中要遵循一定的規則,合理安排,完美協作,使雙方達到全局最優的狀態。任務1

多線程(2)多線程同步。因為多線程提供了程序的異步執行功能,所以在必要時還必須提供一種同步機制,同步也是一種各線程間對共享資源使用的協調。例如,對異步操作中所用的堆棧操作的情況來說,設線程A和B分別對堆棧進行進棧和出棧的操作,若線程A鎖住共享堆棧一直進棧,將導致堆棧溢出;若線程B鎖住共享堆棧一直出棧,將導致棧空。因此,必須考慮遇到堆棧滿或空時怎樣使線程能夠自動避免錯誤操作的問題。所以在多線程編程中Java提供了線程同步機制來防止資源訪問沖突。兩個線程共享一個堆棧-ustb33任務1

多線程為了實現同步,Java語言提供wait()、notify()和notifyAll()三個方法供線程在臨界段中使用。在臨界段中使用wait()方法,使執行該方法的線程等待,并允許其他線程使用這個臨界段。wait()方法常用以下兩種格式:wait():讓線程一直等待,直到被notify()或notifyAll()方法喚醒。wait(longtimeout):讓線程等待到被喚醒,或經過指定時間后結束等待。任務1

多線程當線程使用完臨界段后,用notify()方法通知由于想使用這個臨界段而處于等待的線程結束等待。notify()方法只是通知第一個處于等待的線程。如果某個線程在使用完臨界段方法后,其他早先等待的線程都可結束等待,重新競爭CPU,則可以用notifyAll()方法。①同步代碼塊的格式如下:任務1

多線程對象如同鎖,持有鎖的線程可以在同步中執行。沒有持有鎖的線程即使獲得了CPU的執行權,也進不去,因為沒有獲取鎖。任何時刻只能有一條線程可以獲得對同步監視器的鎖定,當同步代碼塊執行結束后,該線程自然釋放了對該同步監視器的鎖定。②同步方法的格式如下:同步方法就是使用synchronized關鍵字來修飾的某個方法。對于同步方法而言,無須顯示指定同步監視器,同步方法的同步監視器是this,也就是對象本身。同步的前提是必須有兩個或兩個以上的線程,必須是多個線程使用同一個鎖,必須保證同步中只能有一個線程在運行。拓展—同步的前提任務1

多線程(3)舉例:模擬一群顧客購買紀念品。設紀念品5元錢一個,顧客有人持5元、有人持10元購買紀念品。持5元的顧客能立即買到紀念品。持10元的顧客,如果銷售員有可找的小面額錢,則也能立即購買;如果銷售員沒有可找的小面額錢,則這位顧客就得等待。通過同步方法模擬這群顧客購買紀念品的過程。主要代碼介紹如下:①定義SalesLady類,定義其三個屬性:紀念幣個數、5元幣個數、10元幣個數,并定義同步方法ruleForSale(),當紀念品個數為0時,返回“對不起,已售完!”。當紀念幣還存在時,需要查看顧客支付的是5元幣還是10元幣,如果為5元幣,則可以直接購買,并輸出“給你一個紀念品,你的錢正好!”;如果為10元幣,則根據5元幣是否存在來判斷10元幣是否需要等待。任務1

多線程任務1

多線程②通過Runnable結構創建CustomerClass類,定義屬性,重寫run()方法。在方法中先假定顧客購買前做一些其他事情,使當前線程暫停一下,然后調用帶參的ruleForSale()方法并進行輸出。任務1

多線程③創建CustomerSyn類,實現main()方法,定義一個包含10個元素的線程數組,然后執行線程。任務1

多線程④運行測試結果如圖7-1-6所示。測試題-1bzjtw線程的互斥(Mutex)和同步(Synchronization)在現實生活中有很多類比和應用場景,尤其是在處理資源共享和并發訪問時。以下是一些常見的例子:1.交通信號燈同步:交通信號燈控制交通流向,確保交通各方向的車輛有序地通過路口,避免交通混亂和事故?;コ猓和粋€方向的車輛綠燈時可以通行,其他方向的車輛處于紅燈狀態,互斥地阻止了不同方向的車輛同時通行。2.銀行取款機:同步:當多個人同時想要使用同一個取款機時,系統需要同步操作,確保每次只有一個人能夠正確地進行取款操作,避免沖突和數據錯誤?;コ猓和粫r刻只允許一個用戶訪問取款機,其他用戶必須等待,以避免同時修改賬戶余額或發生數據混亂。拓展—在現實生活中還有哪些線程的互斥和同步?每課寄語黨的二十大報告指出:推動共建“一帶一路”高質量發展。優化區域開放布局,鞏固東部沿海地區開放先導地位,提高中西部和東北地區開放水平。加快建設西部陸海新通道。加快建設海南自由貿易港,實施自由貿易試驗區提升戰略,擴大面向全球的高標準自由貿易區網絡。有序推進人民幣國際化。深度參與全球產業分工和合作,維護多元穩定的國際經濟格局和經貿關系。本任務通過學習多線程,培養學生在共享資源時要遵循一定的規則,面臨個人利益與國家利益相沖突問題時,勇于戰勝自我,以國家利益為重的素養,培養學生樹立正確的技能觀,在潛移默化中培育社會主義核心價值觀,提高綜合職業素養,樹立社會主義職業工匠精神。任務2

I/O(輸入/輸出)流CurriculumDevelopmentTechnology1任務2I/O(輸入/輸出)流小明制作了一個購物管理系統,在購物管理系統中要求針對節假日設置一個真情回饋抽獎環節,經過具體分析,可以通過文件的輸入/輸出流來實現關于購物系統中真情回饋的內容。輸入5個抽獎會員卡號,進行隨機抽獎,最終將抽獎結果進行公布。完成后的效果如圖7-2-1所示。任務描述任務2I/O(輸入/輸出)流在本次任務中,要完成利用文件的輸入/輸出流實現關于真情回饋的內容。本次任務需要掌握如下技能:●通過類和方法的使用進行Cust類、set/get方法的創建?!裢ㄟ^學習文件流掌握Cust.DAT存儲文件的設計。技術分析I/O(輸入/輸出)流-m3fkeb想一想在Cust會員類中,為會員類創建了集中構造方法?任務2I/O(輸入/輸出)流步驟1:利用封裝方法創建會員類(1)打開SuperMarketManager項目。(2)找到data中的Cust會員類,為會員屬性添加構造相關的set/get方法,并添加只有會員卡號的構造方法和無參數的構造方法,代碼如下:任務實施任務2I/O(輸入/輸出)流構造方法默認為無參構造方法,一旦創建了有參構造方法,則必須在類中創建無參構造方法才可以使用無參構造方法創建類的對象。拓展—無參構造方法任務2I/O(輸入/輸出)流步驟2:創建CustInfo類在view包中創建一個CustInfo類,在類中創建custinforshow方法,輸入會員信息,并將其存儲在cust.DAT文件中,然后讀取其中的內容,隨機取值抽取獲獎卡號,并將中獎會員信息輸出。代碼如下:任務2I/O(輸入/輸出)流想一想對于所創建的文件,如果已經存在,會出現什么操作?任務2I/O(輸入/輸出)流步驟3:制作利用文件輸入/輸出進行抽獎的方法找到view包中的CustOperation類,找到supermainshow()方法并修改,創建一個CustInfo對象,調用利用文件輸入/輸出進行抽獎的方法,代碼如下:任務2I/O(輸入/輸出)流任務2I/O(輸入/輸出)流步驟4:運行測試結果運行測試結果如圖7-2-1所示。任務2I/O(輸入/輸出)流知識點1:File類File類是I/O包中唯一代表磁盤文件本身的對象,File類定義了一些與平臺無關的方法來操縱文件,通過調用File類提供的各種方法,人們能夠創建、刪除、重命名文件,判斷文件的讀寫權限及是否存在,設置和查詢文件的最近修改時間等。(1)File類創建文件對象的構造方法有三種,格式分別如下?!駊ublicFile(Stringpathname)。該構造方法通過將給定路徑名字符串轉換為抽象路徑名來創建一個新File實例,pathname指路徑名稱(包含文件名)。例如:必備知識任務2I/O(輸入/輸出)流File類-a1vtwk任務2I/O(輸入/輸出)流●publicFile(Filef,Stringchild)。該構造方法根據parent抽象路徑名和child路徑字符串(包含文件名)創建一個新的File對象。例如:●publicFile(Filepatent,Stringchile)。該構造方法通過定義的父路徑和子路徑字符串(包含文件名)創建一個新的File對象。例如:在Windows下路徑分隔符可以為“/”,也可以為“\”;但在Linux下只能為“/”。拓展—分隔符的使用任務2I/O(輸入/輸出)流如果目錄中沒有test.txt文件,文件對象則調用createNewFile()方法創建一個test.txt文件,例如:(2)文件的創建與刪除。當使用File類創建一個文件對象后,例如:任務2I/O(輸入/輸出)流若存在test.txt這個文件,則可以通過文件對象的delet()方法刪除,例如:小提示New一個File對象只會在內存中生成一個對象,而不會產生文件。要創建文件,需要調用fle.createNewFile()。任務2I/O(輸入/輸出)流(3)文件的屬性。經常使用File類的一些方法獲取文件本身的一些信息,方法如表7-2-1所示。任務2I/O(輸入/輸出)流(4)舉例:進行文件的創建與刪除,并測試文件信息,代碼如下:任務2I/O(輸入/輸出)流運行測試結果會因為文件test.txt的不存在和存在而出現兩種結果,如圖7-2-2和圖7-2-3所示。任務2I/O(輸入/輸出)流知識點2:輸入/輸出流(1)數據流的概念。數據流是一串連續不斷的數據的集合,就像水管中的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續不斷的水流。數據寫入程序可以是一段一段地向數據流管道中寫入數據,這些數據段會按先后順序形成一個長的數據流。對數據讀取程序來說,看不到數據流在寫入時的分段情況,每次可以讀取其中任意長度的數據,但只能先讀取前面的數據后再讀取后面的數據。不管是將數據分多次寫入,還是作為一個整體一次寫入,讀取時的效果都是完全相同的。(2)InputStream與OutputStream。輸入/輸出是相對于程序來說的。程序在使用數據時所扮演的角色有兩個,一個是源,另一個是目的。若程序是數據流的源,即數據的提供者,這個數據流對程序來說就是一個輸出數據流,數據從程序流出。若程序是數據流的終點,這個數據流對程序而言就是一個輸入數據流,數據從程序外流向程序。delete()方法刪除由File對象的路徑所表示的磁盤文件。它只能刪除普通文件,而不能刪除目錄,即使是空目錄也不行。File類不能訪問文件的內容,即不能從文件中讀取數據或向文件中寫數據,只能對文件本身的屬性進行操作。拓展—delete()方法的使用任務2I/O(輸入/輸出)流①InputStream類。程序可以從中連續讀取字節的對象稱為輸入流,用InputStream類完成,程序能向其中連續寫入字節的對象稱為輸出流,用OutputStream類完成。InputStream與OutputStream對象是兩個抽象類,還不能表明具體對應哪種I/O設備。它們下面有許多子類,包括網絡、管道、內存、文件等具體的I/O設備,如FileInputStream類對應的就是文件輸入流,是一個節點流類,將這些節點流類所對應的I/O源和目標稱為流節點(Node)。數據流其他理解-jljeyh任務2I/O(輸入/輸出)流InputStream定義了Java的輸入流模型。該類中的所有方法在遇到錯誤時都會引發IOException異常,表7-2-2所示為InputStream類主要方法說明。任務2I/O(輸入/輸出)流輸入/輸出流-hm5tmbInputStream是一個抽象類,程序中實際使用的是它的各種子類對象。并不是所有的子類都會支持InputStream中定義的某些方法,如skip、mark、reset等,這些方法只對某些子類有用。拓展—InputStream的介紹任務2I/O(輸入/輸出)流②OutputStream類。OutputStream是一個定義了輸出流的抽象類,這個類中的所有方法均返回void,并在遇到錯誤時引發IOException異常。表7-2-3所示為OutputStream類主要方法說明。任務2I/O(輸入/輸出)流(3)FileInputStream與FileOutputStream。這兩個流節點用來操作磁盤文件,在創建一個FileInputStream對象時通過構造函數指定文件的路徑和名字,當然這個文件應當是存在的和可讀的。在創建一個FileOutputStream對象時如果指定文件存在,那么該文件將會被覆蓋。FileInputStream類常用的構造方法有FileInputStream(Stringname)和FileInputStream(Filefile)兩種,其用法如下所示:任務2I/O(輸入/輸出)流盡管第一個構造函數更簡單,但第二個構造函數允許在把文件連接到輸入流之前對文件做進一步分析。FileOutputStream對象也有兩個和FileInputStream對象具有相同參數的構造函數,創建一個FileOutputStream對象時,可以為其指定還不存在的文件名,但不能是存在的目錄名,也不能是一個已被其他程序打開的文件。FileOutputStream先創建輸出對象,然后準備輸出。例如,用FileOutputStream類向文件中寫入一串字符,并用FileInputStream讀出,代碼如下:任務2I/O(輸入/輸出)流任務2I/O(輸入/輸出)流運行測試結果如圖7-2-4所示。注意編譯運行上面的程序,能夠看到在d盤目錄下產生了一個名為hello.txt的文件,用記事本程序打開這個文件,能看到我們寫入的內容。隨后,程序開始讀取文件中的內容,并將讀取到的內容通過控制臺輸出。這個例子演示了如何用FileOutputStream向一個文件中寫東西和如何用FileInputStream從一個文件中將內容讀出來,但是這兩個類都只提供了對字節或字節數組讀取的方法,對于字符串的讀/寫,還需要進行轉換。任務2I/O(輸入/輸出)流(4)FileWriter與FileReader類。Java中的字符是Unicode編碼,是雙字節的,而InputStream與OutputStream是用來處理字節的,在處理字符文本時不太方便,如果使用字節流則會出現亂碼現象,需要編寫額外的程序代碼。Java為字符文本的輸入/輸出專門提供了一套單獨的類,Reader、Writer兩個抽象類與InputStream、OutputStream兩個類相對應,同樣地,Reader、Writer下面也有許多子類,對具體I/O設備進行字符輸入/輸出。FileReader與FileWriter字符流對應了FileInputStream與FileOutp

溫馨提示

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

評論

0/150

提交評論