簡介:第7章JAVA輸入輸出流及文件操作,71流的概念72基本輸入輸出流73文件操作,學習要求,理解流的概念掌握在JAVA中進行文件讀、寫操作的方法,思考,程序中數據的存儲方法有單個、臨時的變量多個、同類型、臨時的(退出即消失)數組多個、不同類型、臨時的向量,若JAVA應用程序中需要較多或長久保留的數據,可以用什么方式進行存儲和調用更有效呢,71流的概念,流(STREAM)是對輸入輸出設備的一種抽象表示,指在計算機的輸入與輸出之間運動的數據的序列。輸入流代表從外設流入計算機的數據序列輸出流代表從計算機流向外設的數據序列流的特點數據的獲取和發(fā)送均按數據序列順序進行。JAVA中的流分為兩種(被抽象為四個類)字節(jié)流INPUTSTREAM類和OUTPUTSTREAM類字符流READER類和WRITER類字符流比字節(jié)流更有效。,1字節(jié)流,從抽象類INPUTSTREAM和OUTPUTSTREAM派生出來的一系列類,這類流以字節(jié)BYTE為基本處理單位。,基本輸入流類INPUTSTREAM的常用方法,◇從流中讀取數據INTREAD//讀取一個字節(jié),返回值為所讀的字節(jié)INTREADBYTEB讀取多個字節(jié),放置到字節(jié)數組B中,通常讀取的字節(jié)數量為B的長度,返回值為實際讀取的字節(jié)的數量INTREADBYTEB,INTOFF,INTLEN讀取LEN個字節(jié),放置到以下標OFF開始字節(jié)數組B中,返回值為實際讀取的字節(jié)的數量INTAVAILABLE//返回值為流中尚未讀取的字節(jié)的數量LONGSKIPLONGN;//讀指針跳過N個字節(jié)不讀,返回值為實際跳過的字節(jié)數量◇關閉流CLOSE//流操作完畢后必須關閉,基本輸出流類OUTPUTSTREAM的常用方法,◇輸出數據VOIDWRITEINTB//往流中寫一個字節(jié)BVOIDWRITEBYTEB//往流中寫一個字節(jié)數組BVOIDWRITEBYTEB,INTOFF,INTLEN把字節(jié)數組B中從下標OFF開始、長度為LEN的字節(jié)寫入流中◇FLUSH//刷空輸出流,并輸出所有被緩存的字節(jié)由于某些流支持緩存功能,該方法將把緩存中所有內容強制輸出到流中?!箨P閉流CLOSE//流操作完畢后必須關閉,2字符流,從抽象類READER和WRITER派生出的一系列子類,這類流以16位的UNICODE碼表示的字符(一個字符由兩個字節(jié)組成)為基本處理單位。常用字符流子類和功能,72基本輸入輸出流,1鍵盤輸入和格式化輸出JAVA有3個內置的標準流對象1)標準輸入流SYSTEMIN用來讀取用戶從鍵盤的輸入2)標準輸出流SYSTEMOUT用來在屏幕上顯示信息3)標準輸出流SYSTEMERR用來顯示出錯信息(1)鍵盤輸入使用SYSTEMIN對象的READ()方法例CHARCCHARSYSTEMINREAD使用INPUTSTREAMREADER、BUFFERREADER流類例INPUTSTREAMREADERISRNEWINPUTSTREAMREADERSYSTEMINBUFFERREADERBRNEWBUFFERREADERISR,通過SCANNER類,SCANNER在JAVAUTIL包中SCANNER類主要方法1)NEXTINT提示輸入一個整數2)NEXTDOUBLE提示輸入一個浮點數3)READLINESTRINGPROMPT提示輸入一個字符串,直到行結束。例SCANNERSNEWSCANNERINTASNEXTINTDOUBLEX1SCANNERNEXTDOUBLE,(2)格式化輸出,用JAVA的標準輸出SYSTEMOUT,可以輸出不同類型的對象例INTA20SYSTEMOUTPRINTASYSTEMOUTPRINTLN“大家好”//加換行用JAVATEXT包中的NUMBERFORMAT類可以控制顯示格式,有三種方法NUMBERFORMATGETNUMBERINSTANCE//附加逗號NUMBERFORMATGETCURRENCYINSTANCE//貨幣符號NUMBERFORMATGETPERCENTINSTANCE//百分號,例IMPORTJAVAIOIMPORTJAVATEXTPUBLICCLASSTESTOUTPUT{PUBLICSTATICVOIDMAINSTRINGARGS{DOUBLEX2345123STRINGS1,S2,S3NUMBERFORMATN1NUMBERFORMATGETNUMBERINSTANCENUMBERFORMATC1NUMBERFORMATGETCURRENCYINSTANCENUMBERFORMATP1NUMBERFORMATGETPERCENTINSTANCES1N1FORMATXS2C1FORMATXS3P1FORMATXSYSTEMOUTPRINTLNS1””S2””S3}}結果2,3451232,34512234,512,用戶自定義輸出格式用DECIMALFORMAT類和FORMAT類DECIMALFORMAT類適合貨幣之類的格式化FORMAT類(在附帶的COREJAVA包中,要把它加到CLASSPATH中)適合科技方面格式化,和C語言的PRINTF函數功能類似。DECIMALFORMAT類的范例格式串,,FORMAT的范例格式,首先加IMPORTCOREJAVAFORMATF固定格式的浮點數FORMATPRINTF“X的值是2F\N”,XD,I以十進制表示的整數S字符串C字符G,G以一般格式表示浮點數,對小數用定點格式,對大數用指數格式X,X以十六進制表示的整數O以八進制表示例FORMATPRINTF“你的工資是2F\N”,PAY,73文件操作,1JAVA程序的文件與目錄管理JAVAIO包中的FILE類專門用來管理磁盤文件和目錄。每個FILE類的對象表示一個磁盤文件或目錄,對象屬性中包含名稱、長度、所含文件個數等信息。(1)創(chuàng)建FILE類對象的三種方法FILESTRINGPATH指明磁盤文件或目錄名及其路徑注意目錄分隔符用SYSTEMDIRSEP表示如FILEF1NEWFILE“C”SYSTEMDIRSEP”SJ”FILESTRINGPATH,STRINGNAME,文件或目錄的路徑,文件或目錄名,FILEFILEDIR,STRINGNAME(2)獲取文件或目錄屬性,已經存在的磁盤目錄,(3)文件或目錄的操作,注意由于JAVAAPPLET程序是從網絡上下載到本地機器運行的,不可知也不可控,所以JAVA的安全機制禁止JAVAAPPLET程序訪問和存取本地文件,如果試圖在JAVAAPPLET程序中使用文件操作,則將引發(fā)JAVA的安全性異常。,2寫文本文件,方法一用FILEOUTPUTSTREAM打開文件MYTXT,然后用PRINTSTREAM對象P的PRINTLN方法把字符串寫入文件中。例FILEOUTPUTSTREAMFOUTNEWFILEOUTPUTSTREAM“MYTXT”PRINTSTREAMPNEWPRINTSTREAMFOUTPPRINTLN“要寫入文本文件中的內容”PCLOSE,寫文本例子1,方法二用FILEWRITER打開文件MYFTXT,又創(chuàng)建了文本輸出流OUT,然后用OUT的PRINT(或者PRINTLN)方法把字符串寫入文件中。例FILEWRITERFWNEWFILEWRITER“MYFTXT”PRINTWRITEROUTNEWPRINTWRITERFWOUTPRINT“要寫入文本文件中的內容”O(jiān)UTCLOSE//關于輸出FWCLOSE//關閉文件,寫文本例子2,3讀文本文件,方法一用FILEINPUTSTREAM打開文件MYTXT,然后建立DATAINPUTSTREAM的對象IN(文件流),使用IN的READLINE()方法以一行為單位讀出MYTXT文件中的所有字符串。例FILEINPUTSTREAMFSNEWFILEINPUTSTREAM“MYTXT”DATAINPUTSTREAMINNEWDATAINPUTSTREAMFSWHILEINAVAILABLE0SYSTEMOUTPRINTLNINREADLINEINCLOSE//關閉輸入流,讀文本例子1,方法二用FILEREADER打開文件MYFTXT,然后用BUFFEREDREADER類的對象BR作為文件流,用BR的READLINE()讀取文件中的字符串。例FILEREADERFRNEWFILEREADER“MYFTXT”BUFFEREDREADERBRNEWBUFFEREDREADERFRSTRINGRECORDNEWSTRINGINTRECCOUNT0WHILERECORDBRREADLINENULL{RECCOUNTSYSTEMOUTPRINTLNRECCOUNT””RECORD}BRCLOSE//關于緩存FRCLOSE//關閉文件,讀文本例子2,4程序對文件的隨機訪問,用RANDOMACCESSFILE類可以實現(xiàn)對文件的隨機讀寫操作,即可以在文件的任意位置執(zhí)行數據讀寫;創(chuàng)建RANDOMACCESSFILE的對象例FILEMFNEWFILE“MYFTXT”RANDOMACCESSFILEMYRAFNEWRANDOMACCESSFILEMF,”RW”,訪問模式RW可讀、可寫R只讀,作為數據源的文件,對文件位置指針的操作,利用GETPOINTER方法可以獲得當前文件位置指針從文件頭算起的絕對位置PUBLICLONGGETPOINTER利用SEEK方法可以將指針移動到POS指定的文件位置PUBLICVOIDSEEKLONGPOS利用LENGTH方法可以返回文件的字節(jié)長度PUBLICLONGLENGTH,從文件頭算起的絕對位置,,對文件進行讀寫操作,RANDOMACCESSFILE類實現(xiàn)了DATAINPUT和DATAOUTPUT接口,在讀/寫時具備強大的含類型轉換的輸入/輸出功能;RANDOMACCESSFILE類的所有方法都有可能拋出IOEXCEPTION異常,在利用它實現(xiàn)文件操作時需要將相關語句放在TRY塊中,并配上CATCH塊來處理異常。,
下載積分: 6 賞幣
上傳時間:2024-01-05
頁數: 24
大小: 0.49(MB)
子文件數:
簡介:JAVA程序設計,第8章多線程,81線程及其創(chuàng)建811JAVA中的線程,JAVA程序通過流控制來執(zhí)行程序流,程序中單個順序的流控制稱為線程,多線程則指的是在單個程序中可以同時運行多個不同的線程執(zhí)行不同的任務。單個程序內部也可以在同一時刻進行多種運算。很多程序語言需要利用外部的線程軟件包來實現(xiàn)多線程,而JAVA則內在支持多線程,它的所有類都是在多線程的思想下定義的。,線程,線程就是程序中單獨順序的流控制。JAVA的線程是通過JAVA的軟件包JAVALANG中定義的類THREAD來實現(xiàn)的。,線程體,線程的所有活動都是通過線程體RUN方法來實現(xiàn)的。在一個線程被建立并初始化以后,JAVA的運行時系統(tǒng)就自動調用RUN方法。正是通過RUN方法才使得建立線程的目的得以實現(xiàn)。通常,RUN方法是一個循環(huán),例如一個播放動畫的線程要循環(huán)顯示一系列圖片。有時,RUN方法會執(zhí)行一個時間較長的操作,例如下載并播放一個JPEG格式的電影。,812創(chuàng)建線程對象的兩種方法,1.通過繼承THREAD類創(chuàng)建線程CLASSMYTHREADEXTENDSTHREAD{PUBLICVOIDRUN{FORINTI0I100I{SYSTEMOUTPRINT““I}}2.通過向THREAD構造方法傳遞RUNNABLE對象來創(chuàng)建線程CLASSMYTASKIMPLEMENTSRUNNABLE{PUBLICVOIDRUN{}}THREADTHREADNEWTHREADMYTASKTHREADSTART3可用匿名類來實現(xiàn)RUNNABLE,如TESTTHREAD4ANONYMOUSJAVA,813多線程,TESTTHREAD3JAVA多線程。THREADDRAWJAVA多線程繪圖。,82線程的控制,,821線程的狀態(tài)與生命周期,在一個線程的生命周期中,它總處于某一種狀態(tài)中。線程的狀態(tài)表示了線程正在進行的活動以及在這段時間內線程能完成的任務。,822線程優(yōu)先級,THREAD類有三個有關線程優(yōu)先級的靜態(tài)常量MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY,823對線程的基本控制,結束線程現(xiàn)在一般采取給線程設定一個標記變量的方法來決定線程是否應該終止。設定線程的優(yōu)先級可以使用THREAD對象的SETPRIORITYINTPRIORITY方法,,線程的啟動START暫時阻止線程的執(zhí)行THREADSLEEPLONGMILLISECOND來掛起線程的執(zhí)行TRY{THREADSLEEP1000}CATCHINTERRUPTEDEXCEPTIONE{//}JOIN方法。調用某THREAD對象的JOIN方法,可以將一個線程加入到本線程中,本線程的執(zhí)行會等待另一線程執(zhí)行完畢。THREADT//T是另一線程TRY{TJOIN}CATCHINTERRUPTEDEXCEPTIONE{//},后臺線程,線程有兩種,一類是DAEMON線程,一類是非DAEMON線程。在JAVA程序中,若還有非DEMON線程,則整個程序就不會結束;當正在運行的線程都是守護線程時,JAVA虛擬機退出。使用SETDAEMONTRUE垃圾回收是后臺線程示例TESTTHREADDAEMONJAVA,83線程的同步,,多線程同步,線程都是獨立的,而且異步執(zhí)行,也就是說每個線程都包含了運行時所需要的數據或方法,而不需要外部的資源或方法,也不必關心其它線程的狀態(tài)或行為。但是經常有一些同時運行的線程需要共享數據,例如一個線程向文件寫數據,而同時另一個線程從同一文件中讀取數據,因此就必須考慮其它線程的狀態(tài)與行為,這時就需要實現(xiàn)同步來得到預期結果。示例SYNCCOUNTER1JAVA,在JAVA語言中,引入了對象互斥鎖的概念,來保證共享數據操作的完整性。每個對象都對應于一個可稱為“互斥鎖”的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象。關鍵字SYNCHRONIZED用來與對象的互斥鎖聯(lián)系。當某個對象用SYNCHRONIZED修飾時,表明該對象在任一時刻只能由一個線程訪問。使用WAIT方法可以釋放對象鎖使用NOTIFY或NOTIFYALL可以讓等待的一個或所有線程進入就緒狀態(tài),SYNCHRONIZED除了象上面講的放在對象前面限制一段代碼的執(zhí)行外,還可以放在方法聲明中,表示整個方法為同步方法。PUBLICSYNCHRONIZEDVOIDPUSHCHARC{}如果SYNCHRONIZED用在類聲明中,則表明該類中的所有方法都是SYNCHRONIZED的。示例SYNCCOUNTER2JAVA,生產者消費者問題,示例PRODUCERCONSUMERSTACKJAVACLASSCUBBYHOLE{PRIVATEINTINDEX0PRIVATEINTDATANEWINT3PUBLICSYNCHRONIZEDVOIDPUTINTVALUE{WHILEINDEXDATALENGTH{TRY{THISWAIT}CATCHINTERRUPTEDEXCEPTIONE{}}DATAINDEXVALUEINDEXTHISNOTIFY},PUBLICSYNCHRONIZEDINTGET{WHILEINDEX0{TRY{THISWAIT}CATCHINTERRUPTEDEXCEPTIONE{}}INDEXINTVALDATAINDEXTHISNOTIFYRETURNVAL}},84并行API,JAVAUTILCONCURRENT包LOCK、REENTRANTLOCKLOCKTRYLOCKUNLOCK例NODEADLOCKDEMOJAVAREADWRITELOCK、REENTRANTREADWRITELOCKWRITELOCKLOCK,READLOCKUNLOCK例ARRAYLIST2JAVA,并行的集合類,產生一個線程安全的集合對象COLLECTIONSSYNCHRONIZEDARRAYLISTLISTCOPYONWRITEARRAYLIST、COPYONWRITEARRAYSET適合于很少寫入而迭代頻繁的對象ARRAYBLOCKINGQUEUE生產者與消費者,使用PUT及TAKECONCURRENTHASHMAPPUTIFABSENT,REMOVE,REPLACE,線程相關的其他問題,使用JAVAUTILTIMER/TIMERTASK類示例TIMERTESTJAVA在線程中更新圖形化界面,要調用INVOKELATER示例THREADDRAWJJAVA,
下載積分: 6 賞幣
上傳時間:2024-01-05
頁數: 21
大小: 0.27(MB)
子文件數: