




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《Java語言程序設(shè)計(jì)基礎(chǔ)教程》練習(xí)思考題參考答案第7章多線程7.1單項(xiàng)選擇題1、Java語言具有許多優(yōu)點(diǎn)和特點(diǎn),下列選項(xiàng)中,哪個(gè)反映了Java程序并行機(jī)制的特點(diǎn)?()A、安全性B、多線程C、跨平臺(tái)D、可移植解答:B2、Runnable接中的抽象方法是()。A、startB、stopC、yieldD、run解答:D3、有以下程序段(很難)classMyThreadextendsThread{publicstaticvoidmain(Stringargs[]){MyThreadt=newMyThread();MyThreads=newMyThread();t.start();System.out.print("one.");s.start();System.out.print("two.");}publicvoidrun(){System.out.print("Thread");}}則下面正確的選項(xiàng)是()A、編譯失敗B、程序運(yùn)行結(jié)果為:one.Threadtwo.ThreadC、程序運(yùn)行結(jié)果是:one.two.ThreaThreadD、程序運(yùn)行結(jié)果不確定解答:D5、作為類中新線程的開始點(diǎn),線程的執(zhí)行是從下面哪個(gè)方法開始的。()A、publicvoidstart()B、publicvoidrun()C、publicvoidint()D、publicstaticvoidmain(Stringargs[])解答:A6、Java中用于給對(duì)象加“互斥鎖”標(biāo)記的關(guān)鍵字是。()A、synchronizedB、serializeC、transientD、static解答:A以下哪個(gè)方法用于定義線程的執(zhí)行體?(C)A、start()B、init()C、run()D、synchronized。以下哪個(gè)關(guān)鍵字可以用來為對(duì)象加互斥鎖?(D)A、transientB、staticC、serializeD、synchronized7.2填空題7.3簡答題1、多線程有幾種實(shí)現(xiàn)方法,都是什么?同步有幾種實(shí)現(xiàn)方法,都是什么?多線程有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable接。用Thread類的子類創(chuàng)建線程對(duì)象,也就是從Thread類繼承。實(shí)現(xiàn)Runnable接,用Thread類直接創(chuàng)建線程對(duì)象。同步的實(shí)現(xiàn)方面有兩種,分別是synchronizedwait與notify2、創(chuàng)建一個(gè)新線程的方法,可以使用下面哪2種(A、繼承java.lang.ThreO!,并且重載run方法。B、繼承java.lang.Runnab糞,并且重載star方法。C、實(shí)現(xiàn)java.lang.thre類d實(shí)現(xiàn)run方法。D、實(shí)現(xiàn)java.lang.Runnab接,實(shí)現(xiàn)run方法。E、實(shí)現(xiàn)java.lang.ThreOd,實(shí)現(xiàn)star方法。解答:A,D3、線程在它的一個(gè)完整的生命周期中有哪4種狀態(tài)?解答1:線程在它的一個(gè)完整的生命周期中通常要經(jīng)歷如下的4種狀態(tài):1.創(chuàng)建狀態(tài)(newThread)2.可運(yùn)行狀態(tài)(Runnable)不可運(yùn)行狀態(tài)(NotRunnabl)4.死亡狀態(tài)(Dead)解答2:第一是創(chuàng)建狀態(tài)。在生成線程對(duì)象,并沒有調(diào)用該對(duì)象的star方法,這是線程處于創(chuàng)建狀態(tài)。第二是就緒狀態(tài)。當(dāng)調(diào)用了線程對(duì)象的star方法之后,該線程就進(jìn)入了就緒狀態(tài),但是此時(shí)線程調(diào)度程序還沒有把該線程設(shè)置為當(dāng)前線程,此時(shí)處于就緒狀態(tài)。在線程運(yùn)行之后,從等待或者睡眠中回來之后,也會(huì)處于就緒狀態(tài)。第三是運(yùn)行狀態(tài)。線程調(diào)度程序?qū)⑻幱诰途w狀態(tài)的線程設(shè)置為當(dāng)前線程,此時(shí)線程就進(jìn)入了運(yùn)行狀態(tài),開始運(yùn)行run函數(shù)當(dāng)中的代碼。第四是阻塞狀態(tài)。線程正在運(yùn)行的時(shí)候,被暫停,通常是為了等待某個(gè)時(shí)間的發(fā)生(比如說某項(xiàng)資源就緒)之后再繼續(xù)運(yùn)行。sleep,suspendwait等方法都可以導(dǎo)致線程阻塞。第五是死亡狀態(tài)。如果一個(gè)線程的run方法執(zhí)行結(jié)束或者調(diào)用stop方法后,該線程就會(huì)死亡。對(duì)于已經(jīng)死亡的線程,無法再使用star方法令其進(jìn)入就緒。4、線程在什么狀態(tài)時(shí),調(diào)用isAlive方法返回的值是false5、建立線程有哪兩種方法?解答:多線程有兩種實(shí)現(xiàn)方法,分別是繼承Thread類與實(shí)現(xiàn)Runnable接。6、怎樣設(shè)置線程的優(yōu)先級(jí)?7、調(diào)用Thread類的什么方法可以啟動(dòng)一個(gè)線程?直接調(diào)用Thread類的run(方法可以啟動(dòng)一個(gè)線程嗎?解答:線程調(diào)用start方法將啟動(dòng)線程,從新建狀態(tài)進(jìn)入就緒隊(duì)列排隊(duì)。不能直接調(diào)用Thread類的run(方法可以啟動(dòng)一個(gè)線程,我們調(diào)用了Thread的run(方法,它的行為就會(huì)和普通的方法調(diào)用一樣。8、Thread類中的start(和run()方法有什么區(qū)別?解答:這個(gè)問題經(jīng)常被問到,但還是能從此區(qū)分出面試者對(duì)Java線程模型的理解程度。start方法被用來啟動(dòng)新創(chuàng)建的線程,而且start內(nèi)部調(diào)用了run(方法,這和直接調(diào)用run()方法的效果不一樣。當(dāng)你調(diào)用run(方法的時(shí)候,只會(huì)是在原來的線程中調(diào)用,沒有新的線程啟動(dòng),start方法才會(huì)啟動(dòng)新線程。9、進(jìn)程和線程的區(qū)別?解答:進(jìn)程=執(zhí)行中的程序,每個(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存、一組系統(tǒng)資源。每一個(gè)進(jìn)程的內(nèi)部數(shù)據(jù)和狀態(tài)都是完全獨(dú)立的。線程=進(jìn)程中單個(gè)順序的流控制,同類的多個(gè)線程共享一塊內(nèi)存、一組系統(tǒng)資源。線程的運(yùn)行開銷很小。一個(gè)線程是進(jìn)程的一個(gè)執(zhí)行流程,一個(gè)進(jìn)程可以同時(shí)包含多個(gè)線程。10、現(xiàn)在有T1、T2、T3三個(gè)線程,你怎樣保證T2在T1執(zhí)行完后執(zhí)行,T3在T2執(zhí)行完后執(zhí)行?解答:在T2線程的run(方法中加入代碼T1.join在T3線程的run(方法中加入代碼T2.join或者在主線程main(方法中,t1.start();try{t1.join();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}t2.start();try{t2.join();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}t3.start();11、Thread.start()Thread.run有什么區(qū)別?解答:通過調(diào)用Thead類的start方法來啟動(dòng)一個(gè)線程,使之進(jìn)入就緒狀態(tài),當(dāng)cpu分配時(shí)間該線程時(shí),由JVM調(diào)度執(zhí)行run(方法。直接使用run(方法叫做方法調(diào)用,不能啟動(dòng)線程。12、在一個(gè)對(duì)象上兩個(gè)線程可以調(diào)用兩個(gè)不同的同步實(shí)例方法嗎?解答:不能,因?yàn)橐粋€(gè)對(duì)象已經(jīng)同步了實(shí)例方法,線程獲取了對(duì)象的對(duì)象鎖。所以只有執(zhí)行完該方法釋放對(duì)象鎖后才能執(zhí)行其它同步方法。13、當(dāng)一個(gè)同步方法已經(jīng)執(zhí)行,線程能夠調(diào)用對(duì)象上的非同步實(shí)例方法嗎?解答:可以,一個(gè)非同步方法總是可以被調(diào)用而不會(huì)有任何問題。實(shí)際上,Java沒有為非同步方法做任何檢查,鎖對(duì)象僅僅在同步方法或者同步代碼塊中檢查。如果一個(gè)方法沒有聲明為同步,即使你在使用共享數(shù)據(jù)Java照樣會(huì)調(diào)用,而不會(huì)做檢查是否安全,所以在這種情況下要特別小心。一個(gè)方法是否聲明為同步取決于臨界區(qū)訪問(critia^ctionaccess如果方法不訪問臨界區(qū)共享資源或者數(shù)據(jù)結(jié)構(gòu))就沒必要聲明為同步的。14、wait方法的作用?解答:wait方法用在synchronized方法或者synchronize塊中。一般在判斷語句中,如果某條件被觸發(fā),讓當(dāng)前線程wait并釋放對(duì)象的鎖。此時(shí)可以讓其他線程可以對(duì)用以對(duì)象調(diào)用synchronize方法。直到調(diào)用notif或者notifyAl后wait的線程才有可能執(zhí)行。所以一般wait和notify是成對(duì)出現(xiàn)的。15、啟動(dòng)一個(gè)線程是用run(還是start,()調(diào)用的時(shí)候有什么區(qū)別?(同第8題)解答:當(dāng)然是start了),當(dāng)調(diào)用線程的start方法的時(shí)候,線程就會(huì)進(jìn)入到就緒狀態(tài)。run(方法是線程的執(zhí)行入,當(dāng)線程從就緒狀態(tài)進(jìn)入到執(zhí)行狀態(tài)時(shí)首先要從run(方法開始執(zhí)行。當(dāng)然,我們也是可以直接通過線程對(duì)象調(diào)用該對(duì)象的run(方法的,只是這只是一次普通的調(diào)用,并沒有啟動(dòng)任何一個(gè)線程。當(dāng)我們調(diào)用start方法時(shí),是另外啟動(dòng)了一個(gè)線程去執(zhí)行線程類的代碼,并不影響主程序的執(zhí)行,但是調(diào)用run(方法的時(shí)候要等待run(方法內(nèi)的代碼執(zhí)行完主程序才可以向下執(zhí)行16、sleep(和wait()有什么區(qū)別?解答:sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖。wait是Object類的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAl)l后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。7.4綜合題14、編寫一個(gè)死鎖程序?15、在下面的代碼區(qū)填入相應(yīng)的代碼,實(shí)現(xiàn)以下功能:通過繼承Thread類的子類Threadl,來創(chuàng)建和啟動(dòng)一個(gè)線程tl;通過實(shí)現(xiàn)Runnable接的具體類Runner1,來創(chuàng)建和啟動(dòng)一個(gè)線程t2;publicclassTestThread1{publicstaticvoidmain(String[]args){/創(chuàng)建和啟動(dòng)一個(gè)線程t1,在下面寫出相應(yīng)代碼Thread1t1=newThread1();t1.start();/創(chuàng)建和啟動(dòng)一個(gè)線程t2在下面寫出相應(yīng)代碼Runner1r1=newRunner1();Threadt2=newThread(r1);t2.start();for(inti=0;i<1;i++){System.out.println("MainThread:"+i);}}}classRunner1implementsRunnable{publicvoidrun(){for(inti=0;i<1;i++){System.out.println("Runner1:"+i);}}}classThread1extendsThread{publicvoidrun(){for(inti=0;i<1;i++){System.out.println("Thread1:"+i);}}}16、現(xiàn)在有T1T2T3三個(gè)線程,怎樣保證T2在T1執(zhí)行完之后執(zhí)行T3在T2執(zhí)行完之后執(zhí)行。請(qǐng)?jiān)谙鄳?yīng)區(qū)域?qū)懗鰧?shí)現(xiàn)該功能的代碼。publicclassJoinDemo{publicstaticvoidmain(String[]args){T1t1=newT1("T1");T2t2=newT2("T2");T3t3=newT3("T3");t1.start();try{t1.join();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}t2.start();try{t2.join();}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}t3.start();}}classT1extendThread{privateStringname;publicT1(Stringname){=name;}publicvoidrun()(for(inti=0;i<5;i++){try{sleep(5);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}System.out.println(this.n循環(huán)"+i);}classT2extendThread{privateStringname;publicT2(Stringname){=name;}publicvoidrun()(for(inti=0;i<5;i++){try{sleep(5);}catch(InterruptedExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}System.out.println(this.n循環(huán)"+i);}}}classT3extendThread(privateStringname;publicT3(Stringname){=name;}publicvoidrun()(for(inti=0;i<5;i++){System.out.println(this.n循環(huán)"+i);}}}第8章文件和流8.1單項(xiàng)選擇題1、創(chuàng)建一個(gè)向文件“file.”x追加內(nèi)容的輸出流對(duì)象的語句是()。OutputStreamout=newFileOutputStream("file.txt”);OutputStreamout=newFileOutputStream("file.txt”,“append”);FileOutputStreamout=newFileOutputStream("fiUe)txt”,trFileOutputStreamout=newFileOutputStream(newfile("file.txt”));解答:C2、下面哪個(gè)流類屬于面向字符的輸入流()ABufferedWriterBFileInputStreamCObjectInputStreamDInputStreamReader答案:D3、以下關(guān)于File類說法錯(cuò)誤的是(D)一個(gè)File對(duì)象代表了操作系統(tǒng)中的一個(gè)文件或者文件夾可以使用File對(duì)象創(chuàng)建和刪除一個(gè)文件可以使用File對(duì)象創(chuàng)建和刪除一個(gè)文件夾當(dāng)一個(gè)File對(duì)象被垃圾回收時(shí),系統(tǒng)上對(duì)應(yīng)的文件或文件夾也被刪除4、為了提高讀寫性能,可以采用什么流?(D)AInputStreamBDataInputStreamCOutputStreamDBufferedInputStream5、File類型中定義了什么方法來判斷一個(gè)文件是否存在?(D)AcreateNewFileBrenameToCdeleteDexists6、File類型中定義了什么方法來創(chuàng)建多級(jí)目錄?(C)AcreateNewFileBexistsCmkdirsDmkdir7、(Buffered流,緩沖區(qū))有下面代碼importjava.io.*;publicclassTestBufferedWriter{publicstaticvoidmain(Stringargs[])throwsException(FileWriterfw=newFileWriter("test.txt”);BufferedWriterbw=newBufferedWriter(fw);Stringstr=“HelloWorld”;bw.write(str))}在處放入什么代碼,能夠使得test.tx文件被正確寫入?A.bw.close()B.bw.flush();C.fw.close();8.2填空題1、對(duì)于FileInputStrea來說,從方向上來分,它是輸入流,從數(shù)據(jù)單位上分,它是―一字節(jié)___流。2、創(chuàng)建FileOutputStreai對(duì)象時(shí),如果對(duì)應(yīng)的文件在硬盤上不存在,則會(huì)_自動(dòng)創(chuàng)建___;如果對(duì)應(yīng)的文件在硬盤上已經(jīng)存在,則―覆蓋8.3簡答題1、java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請(qǐng)說出他們分別是哪些類?解答:字節(jié)輸入流:InputStrean字節(jié)輸出流:OutputStream字符輸入流:Reader,字符輸出流:Writer2、什么是java序列化,如何實(shí)現(xiàn)java序列化?解答:Java對(duì)象的序列化指將一個(gè)java對(duì)象寫入OI流中,與此對(duì)應(yīng)的是,對(duì)象的反序列化則從IO流中恢復(fù)該java對(duì)象。如果要讓某個(gè)對(duì)象支持序列化機(jī)制,則必須讓它的類是可序列化的,為了讓某個(gè)類是可序列化的,該類必須實(shí)現(xiàn)Serializable或Externalizab接。8.4綜合題3、FileInputStrea流的read方法和FileRead流的read方法有何不同?4、BufferedReade疏能直接指向一個(gè)文件對(duì)象嗎?1、(FileInputStrea和FileOutputStrea)n利用FileInputStrea和FileOutputStream完成下面的要求:)用FileOutputStrean在當(dāng)前目錄下創(chuàng)建一個(gè)文件“test.txt并向文件輸出“HelloWorld”,如果文件已存在,則在原有文件內(nèi)容后面追加。)用FileInputStrea讀入test.txt件,并在控制臺(tái)上打印出test.tx中的內(nèi)容。)要求用try-catch-fina處理異常,并且關(guān)閉流應(yīng)放在finally中。FileInputStreamfin;FileOutputStreamfon;try(fin=newFileInputStream("hello.txt");on=newFileOutputStream("test.txt",true);fon.write("HelloWorld”);System.out.println(fin.read());fin.close();}catch(Exceptione){}finally{fin.close();}1、使用FileInputStrea類,編寫一個(gè)程序,順序讀取d:/text.的文件里的內(nèi)容,并顯示在控制臺(tái)上面,直到文件結(jié)束為止。?importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;publicclassep8_2{publicstaticvoidmain(String[]args){FileInputStreamfis;try{fis=newFileInputStream("text.txt");System.out.print("contentoftextis:");intb;while((b=fis.read())3/順)序讀取文件textM的內(nèi)容{System.out.print((char)b);}fis.close();}catch(FileNotFoundExceptione){System.out.println(e);}catch(IOExceptione){System.out.println(e);}2、使用FileInputStre磷和FileOutputStrea類,編寫一個(gè)程序,順序讀取d:/text.txt的文件里的內(nèi)容,并將內(nèi)容拷貝到d:/text.bak件?importjava.io.*;publicclassTestFileOutputStream{publicstaticvoidmain(String[]args){intb=0;FileInputStreamin=null;FileOutputStreamout=null;try{in=newFileInputStream("d:/text.txt");out=newFileOutputStream("d:/text.bak");while((b=in.read())!=-1){out.write(b);}in.close();out.close();}catch(FileNotFoundExceptione2){System.out.print找不到文件");System.exit(T);}catch(IOExceptione1){System.out.printtil件復(fù)制錯(cuò)誤");System.exit(T);}System.out.print^文件已經(jīng)復(fù)制");}}3、遞歸列出d:/jav目錄下的所有子目錄和文件,再顯示到控制臺(tái)importjava.io.*;publicclassFileList{publicstaticvoidmain(String[]args){Filef=newFile("d:/java");System.out.println(f.getName());tree(f,1);}privatestaticvoidtree(Filef,intlevel){for(inti=0;i<level;i++){preStr+="";}File[]childs=f.listFiles();for(inti=0;i<childs.length;i++){System.out.println(preStr+childs[i].getName());if(childs[i].isDirectory()){tree(childs[i],level+1);}}}}4、首先列出當(dāng)前工作目錄,然后將當(dāng)前目錄下面的所有文件取出,根據(jù)過濾器設(shè)置,顯示后綴為java的所有文件。importjava.io.*;入//java.i包中所有的類publicclassep8_1{publicstaticvoidmain(Stringargs[]){Filedir=newFile("c://java_work用8F)le對(duì)象表示一個(gè)目錄Filterfilter=newFilter("j生喊一;個(gè)名為java的過濾器System.out.println("listjavafilesindirectory"+dir);Stringfiles[]=dir.list(歹小毗融錄dM下,文件后綴名為java的所有文件for(inti=0;i<files.length;i++){Filef=newFile(dir,file為[劇錄d//下的文件或目錄創(chuàng)建一個(gè)File對(duì)象if(f.isFile伽果該對(duì)象為后綴為java的文件,則打印文件名System.out.println("file"+f);elseSystem.out.println("subdirectory"如如果是目/錄則打印目錄名}}}classFilterimplementsFilenameFilter{Stringextent;this.extent=extent;publicbooleanaccept(Filedir,Stringname){returnname.endsWith("."+extent)回文件的后綴名}}5、請(qǐng)編寫一個(gè)程序,開啟一個(gè)文本文件,一次讀取其內(nèi)的一行文本,令每行形成一個(gè)String并將讀出的Strin對(duì)象置于LinkedLis中,以反相次序顯示出LinkedList內(nèi)的所有內(nèi)容。importjava.io.*;importjava.util.*;classexA4_2(publicstaticvoidmain(Stringargs[])throwsException(LinkedListlines=newLinkedList();BufferedReaderin=newBufferedReader(newFileReader("exA4_2.java"));Strings;while((s=in.readLine())!=null)lines.add(s);in.close();Listiteratorit=lines.listIterator(lines.size());while(it.hasPrevious())System.out.println(it.previous());}}6、在程序中寫一個(gè)"HelloJavaWorlc#好世界"輸出到操作系統(tǒng)文件Hello.tx文件中importjava.io.File;importjava.io.FileOutputStream;publicclassTest5{/***在程序中寫一個(gè)"HelloJavaWorld你好世界"輸出到操作系統(tǒng)文件Hello.tx文件中**程序分析:文件寫入,要用到輸出流FileOutputStream**/publicstaticvoidmain(String[]args){//向文件D:/Hello.txt寫入內(nèi)容Filefile=newFile("D:/Hello.txt");try{//創(chuàng)建輸出流FileOutputStreamfos=newFileOutputStream(file);/把String類型的字符串轉(zhuǎn)化為byte數(shù)組的數(shù)據(jù)保存在輸出流中fos.write("HelloJavaWo你好世界".getBytes());fos.flush(刷//輸出流fos.closeQ關(guān)閉輸出流}catch(Exceptione){e.printStackTrace();}}}7、統(tǒng)計(jì)一個(gè)文件calcCharNum.txt(見附件)中字母'A'和'a出現(xiàn)的總次數(shù)importjava.io.File;importjava.io.FileInputStream;publicclassTest7{/***統(tǒng)計(jì)一個(gè)文件calcCharNum.txtt見附件)中字母'A和與出現(xiàn)的總次數(shù)**程序分析:讀取文件用FileInputStream一次只讀一個(gè)字節(jié)(一個(gè)字母就是一個(gè)字節(jié)),當(dāng)字節(jié)內(nèi)容和A或a相等時(shí),相應(yīng)的數(shù)量加1*/publicstaticvoidmain(String[]args){try{/添加文件路徑Filefile=newFile("D:/java/calcCharNum.txt");//創(chuàng)建文件讀取流FileInputStreamfis=newFileInputStream(file);intnumA=0;字母A的數(shù)量intnuma=0制母a的數(shù)量intlen=每次讀取的字節(jié)數(shù)量while((len=fis.read())!=-1){/統(tǒng)計(jì)字母a的數(shù)量if(newString((char)len+"").equals("a")){numa++;}/統(tǒng)計(jì)字母A的數(shù)量if(newString((char)len+"").equals("A")){numA++;}}/打印出文件內(nèi)字母的數(shù)量System.out.println的'數(shù)量是:"+numa);System.out.println的數(shù)量是:"+numA);System.out.println和"A出現(xiàn)的總次數(shù):"+(numA+numa));fis.close關(guān)閉輸入流}catch(Exceptione){e.printStackTrace();}}}8、輸入兩個(gè)文件夾名稱,將A文件夾內(nèi)容全部拷貝到B文件夾,要求使用多線程來操作。importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.List;importjava.util.Scanner;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importcom.xykj.lesson2.FileUtils;publicclassTest12{/**輸入兩個(gè)文件夾名稱,將A文件夾內(nèi)容全部拷貝到B文件夾,要求使用多線程來操作。**程序分析:1.拷貝文件里面的東西,要分析的東西還是蠻多的,要先建文件夾再拷貝里面的東西,而且要一層層的來搞2這里也需要文件遍歷工具,直接調(diào)用第二題的工具類,不再重寫3多線程的使用,可以直接在方法里面直接新建線程4對(duì)整個(gè)文件夾進(jìn)行復(fù)制文件夾分隔符可以用\或/,其他的都是不對(duì)的*所有其中還對(duì)輸入的分割符進(jìn)行了替換*這題看起來比較長,分開看其實(shí)也不長*/publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.printinj"制的文件夾:");StringfromDir=scanner.nex接收輸入System.out.printinj"制到哪里去:");StringtoDir=scanner.nex接;收輸入〃把輸入的地址轉(zhuǎn)化為File類型FilefromFile=newFile(fromDir);FiletoFile=newFile(toDir);//新建線程newThread(){/里面做實(shí)際操作publicvoidrun(){//判斷如果要復(fù)制的是文件,直接復(fù)制就可以了if(fromFile.isFile()){System.out.printlJ復(fù)制單個(gè)文件");copy(fromFile,toFile);}else{//要復(fù)制文件夾〃要防止一種無法進(jìn)行的復(fù)制:比如說,要把復(fù)制的文件復(fù)制到自己的子文件夾里面〃舉個(gè)例子:把D:/java/j文件夾復(fù)制到D:/java/jsp文件夾里面,//這會(huì)導(dǎo)致子文件不斷增加的同時(shí),而父文件也要不斷增加,的一個(gè)死循環(huán)〃如果反過來,就沒事,相當(dāng)于只是簡單的覆蓋而已〃具體實(shí)現(xiàn)就是看:目的地地址包含復(fù)制的文件夾地址,就不允許操作if(toDir.replace("/","\\").toLowerCase().startsWith(fromDir.replace("/","\\").toLowerCase())){return;}〃復(fù)制文件(包括文件和文件夾)操作〃先獲取所有的文件(包括文件和文件夾)List<File>list=FileUtils.getAllFiles(fromDir);〃創(chuàng)建一個(gè)線程池,加快復(fù)制的速度ExecutorServicethreadPool=Executors.newFixedThreadPool(20);//需要對(duì)每一個(gè)文件的路徑進(jìn)行處理for(Filefile:list){〃復(fù)制文件名Stringname=file.getAbsolutePath();〃把原來的文件路徑換成新的文件路徑StringtoName=name.replace(fromFile.getParenoDir+"/");System.out.println(name變+成"了"+toName);//如果是文件夾,直接創(chuàng)建if(file.isDirectory()){newFile(toName).mkdirs();}else{〃如果是文件,在線程里面復(fù)制threadPool.execute(newRunnable(){^Overridepublicvoidrun(){FilecopyFile=newFile(toName);〃先要有父文件夾copyFile.getParentFile().mkdirs();//開始復(fù)制文件copy(file,copyFile);}});}scanner.close(););}.start(開始線程}/復(fù)制文件的操作publicstaticvoidcopy(FilefromFile,FiletoFile){〃定義一個(gè)輸入流FileInputStreamfis=null;〃定義一個(gè)輸出流FileOutputStreamfos=null;try{//把復(fù)制地址的File封裝后賦值給輸入流對(duì)象fis=newFileInputStream(fromFile);//把目的地的File封裝后復(fù)制給輸出流的對(duì)象fos=newFileOutputStream(toFile);//創(chuàng)建一個(gè)容量,byte[]buf=newbyte[1024];//每次讀取/寫入的字節(jié)長度intlen=0;//邊讀邊寫while((len=fis.read(buf))!判斷是否還能讀到數(shù)據(jù)//把輸入放到輸出流里面fos.write(buf,0,len);}}catch(Exceptione){e.printStackTrace();}finally{try{//關(guān)閉輸入流和輸出流fis.close();fos.close();}catch(IOExceptione){e.printStackTrace();第9章異常處理9.1單項(xiàng)選擇題1、為了捕獲一個(gè)異常,代碼必須放在下面()語句塊中。A、try塊B、catch塊C、throws塊D、finall塊解答:A3、下列常見的系統(tǒng)定義的異常中,哪個(gè)是輸入、輸出異常?()A、ClassNotFoundExceptionB、IOExceptionC、FileNotFoundExceptionD、UnknownHostException解答:B4、在代碼中,使用catch(Exception的好處是()A、只會(huì)捕獲個(gè)別類型的異常B、捕獲try塊中產(chǎn)生的所有類型的異常C、忽略一些異常D、執(zhí)行一些程序解答:B(太難)6、異常包含下列那一個(gè)內(nèi)容?()A、程序中的語法錯(cuò)誤B、程序的編譯錯(cuò)誤C、程序執(zhí)行過程中遇到的事先沒有預(yù)料到的情況D、程序事先定義好的可能出現(xiàn)的意外情況解答:C(太難)7、getCustomerInfo方法如下,try中可以捕獲三種類型的異常,如果在該方法運(yùn)行中產(chǎn)生了一個(gè)lOException將會(huì)輸出什么結(jié)果(A)publicvoidgetCustomerInfo(){try{//dosomethingthatmaycauseanException}catch(java.io.FileNotFoundExceptionex){System.out.print("FileNotFoundException!");}catch(java.io.IOExceptionex){System.out.print("IOException!");}catch(java.lang.Exceptionex){System.out.print("Exception!");}}AIOException!BIOException!Exception!CFileNotFoundException!IOException!DFileNotFoundException!IOException!Exception!8、有如下代碼段:1){if(unsafe()){//dosomething...}elseif(safe()){//dotheother...}}其中,方法unsafe()將拋出lOException,請(qǐng)問可將以下哪項(xiàng)填入第1行?(D)A、publiclOExceptionmethodName()B、publicvoidmethodName()C、publicvoidmethodName()throwlOExceptiDbnpublicvoidmethodName()throwsIOException9、java中用來拋出異常的關(guān)鍵字是(C)A、tryB、catchC、throwD、finally10、java中關(guān)于異常,下列說法正確的是(A)A、異常是一種對(duì)象B、一旦程序運(yùn)行,異常將被創(chuàng)建。、為了保證程序運(yùn)行速度,要盡量避免異??刂?。、以上說法都不對(duì)11、(A)類是所有異常類的父類。A、ThrowableB、ErrorC、ExceptionD、AWTError12、對(duì)于。3七川子句的排列,下列哪種是正確的(B)A、父類在先,子類在后B、子類在先,父類在后C、有繼承關(guān)系的異常不能在同一個(gè)try程序段內(nèi)D、先有子類,其他如何排列都無關(guān)13、在異常處理中,如釋放資源、關(guān)閉文件、關(guān)閉數(shù)據(jù)庫等由(C來完成。A、try子句B、catch子句C、finall-子句D、throw子句14、當(dāng)方法遇到異常又不知如何處理時(shí),下列哪種說法是正確的(C)A、捕獲異常B、拋出異常C、聲明拋出異常D、嵌套異常15、一個(gè)異常將終止(A)A、整個(gè)程序B、只終止拋出異常的方法C、產(chǎn)生異常的try:塊D、上面的說法都不對(duì)9.2填空題1、系統(tǒng)定義的運(yùn)行異常都可以由系統(tǒng)自動(dòng)拋出,而用戶定義的異常應(yīng)使用throw語句拋出。2、Throwable類是Java異常類的根類。3、拋出自定義異常用throws___j^句,在方法中拋出異常采用__throw__語句。4、異常――就是在程序的運(yùn)行過程中所發(fā)生的錯(cuò)誤5、捕獲異常的統(tǒng)一出通過___finally____語句實(shí)現(xiàn)6、java語言的類庫中提供了一個(gè)___Throwable類,所有的異常都必須是它的實(shí)例或它子類的實(shí)例7、Exception包括運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常。8、catch子句都帶一個(gè)參數(shù),該參數(shù)是某個(gè)異常的類及其變量名,指明它所能夠捕獲的異常類型。。3七川用該參數(shù)去與―異常對(duì)象的類進(jìn)行匹配。9、Java語言中有兩種異常處理機(jī)制:捕獲異常和聲明拋棄異常。9.3簡答題9、什么是Error異常類,什么是Exception異常類,兩者在處理上有什么區(qū)別?解答:Java中的異常類可分為兩大類:Error和ExceptionError包括動(dòng)態(tài)鏈接失敗,虛擬機(jī)錯(cuò)誤等,通常Java程序不應(yīng)該捕獲這類異常,也不會(huì)拋棄這種異常。Exception包括運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常。Error錯(cuò)誤)表示系統(tǒng)級(jí)的錯(cuò)誤和程序不必處理的異常,是java運(yùn)行環(huán)境中的內(nèi)部錯(cuò)誤或者硬件問題,比如,內(nèi)存資源不足等,對(duì)于這種錯(cuò)誤,程序基本無能為力,除了退出運(yùn)行外別無選擇。Exception違例)表示需要捕捉或者需要程序進(jìn)行處理的異常,它處理的是因?yàn)槌绦蛟O(shè)計(jì)的瑕疵而引起的問題或者外部環(huán)境造成的異常,是程序必須處理的。2、Exception異常類包括運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常,簡單介紹兩者內(nèi)容。解答:繼承于RuntimeException的類都屬于運(yùn)行時(shí)異常,例如算術(shù)異常(除零錯(cuò))、數(shù)組下標(biāo)越界異常等等。由于這些異常產(chǎn)生的位置是未知的,Java編譯器允許程序員在程序中不對(duì)它們做出處理。除了運(yùn)行時(shí)異常之外的其他由Exception繼承來的異常類都是非運(yùn)行時(shí)的異常,例如FileNotFoundException文件未找到異常)。Java編譯器要求在程序中必須處理這種異常,捕獲異?;蛘呗暶鲯仐壆惓?。3、Java語言中有哪兩種異常處理機(jī)制,簡單進(jìn)行介紹。解答:捕獲異常和聲明拋棄異常。(1)捕獲異常:當(dāng)Java運(yùn)行環(huán)境得到一個(gè)異常對(duì)象時(shí),它將會(huì)沿著方法的調(diào)用棧逐層回溯,尋找處理這一異常的代碼。找到能夠處理這種類型的異常的方法后,運(yùn)行環(huán)境把當(dāng)前異常對(duì)象交給這個(gè)方法進(jìn)行處理,這一過程稱為捕獲(catch)異常。這是積極的異常處理機(jī)制。如果Java運(yùn)行環(huán)境找不到可以捕獲異常的方法,則運(yùn)行環(huán)境將終止,相應(yīng)的Java程序也將退出。(2)聲明拋棄異常:如果一個(gè)方法并不知道如何處理所出現(xiàn)的異常,則可在方法聲明時(shí),聲明拋棄(throws)異常。這是一種消極的異常處理機(jī)制。9.4綜合題7、編寫一個(gè)異常類MyException,再編寫一個(gè)類Student該類有一個(gè)產(chǎn)生異常的方
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年淮南師范學(xué)院單招職業(yè)技能測試題庫新版
- 2025年黑龍江交通職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫完美版
- 第七單元《習(xí)作:-即景》教學(xué)設(shè)計(jì)-2024-2025學(xué)年五年級(jí)上冊語文統(tǒng)編版
- 2025年貴陽職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫完整
- 2025年河北化工醫(yī)藥職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫完整版
- 2025年度電梯門套智能化門禁系統(tǒng)安裝合同
- 2025年度互聯(lián)網(wǎng)行業(yè)勞務(wù)派遣與技術(shù)研發(fā)合同
- 2025年度房地產(chǎn)投資信托基金房屋回購安排協(xié)議
- 2025年度房屋出售代理市場拓展協(xié)議
- 2025年度公司停車場車輛停放管理及賠償協(xié)議
- 鐵皮板房拆除施工協(xié)議書
- 鐵路工程施工組織設(shè)計(jì).ppt
- 介入科制度匯編
- 電子技術(shù)基礎(chǔ)與技能-(3)
- 部編版四年級(jí)下冊語文第二單元課文教材分析及全部教案
- 工程造價(jià)專業(yè)畢業(yè)實(shí)習(xí)報(bào)告
- 刑釋解教人員安置幫教工作檔案
- 《病理學(xué)》教案
- 綜合日語第二冊練習(xí)冊(修訂版)答案精編版
- 公眾責(zé)任保險(xiǎn)實(shí)用教案
- 吳齊南先生生平
評(píng)論
0/150
提交評(píng)論