java中集合、輸入輸出流、線程重難點總結(jié)_第1頁
java中集合、輸入輸出流、線程重難點總結(jié)_第2頁
java中集合、輸入輸出流、線程重難點總結(jié)_第3頁
java中集合、輸入輸出流、線程重難點總結(jié)_第4頁
java中集合、輸入輸出流、線程重難點總結(jié)_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第十章注意點:1.集合的定義:集合(Collection)即容器(Container),是用來存放數(shù)據(jù)的盒子。java中提供了很多的集合類2.集合的特點:a.集合類中只容納對象名(指向?qū)ο蟮闹羔槪ǖ刂罚゜.集合類中容納的元素都是object類型,一旦把一個對象置入集合類,它的類型將丟失c.集合類的大小可改變注意:數(shù)組是有固定長度的,在定義數(shù)組的時候,就需要確定這個數(shù)組的大小,但是很多時候我們不能確定需要存放多少元素,這時就需要使用集合類3.變量、數(shù)組和集合的區(qū)別變量:只能存放一個數(shù)據(jù)數(shù)組:a.可以存放多個數(shù)據(jù),數(shù)據(jù)必須是同一類型b.數(shù)組大小固定,不能改變集合:a.可以存放多個數(shù)據(jù),數(shù)據(jù)可以是不同類型b.集合大小可以動態(tài)增長4.java集合體系結(jié)構(gòu)java集合結(jié)構(gòu)有兩顆接口樹構(gòu)成:第一棵樹根節(jié)點為Collection接口,它定義了所有的集合的基本操作,如添加、刪除、遍歷等,它的子接口Set、List等則提供了更加特殊的功能第二棵樹根節(jié)點為Map接口。與哈希表類似,保存的事鍵值對的集合,可以通過鍵來實現(xiàn)對值元素的訪問5.迭代器Iterator定義:迭代器是按次序一個一個地獲取集合中的所有的對象,是訪問集合中的每一個元素的標準機制迭代器的創(chuàng)建://將test集合對象轉(zhuǎn)為迭代器Iteratorit=test.iterator();迭代器的常用方法:hasNext()//判斷迭代器中是否有下一個元素,如果有返回true,沒有返回falsenext()//返回迭代的下一個元素6.泛型的理解泛型:即參數(shù)化類型,即所操作的數(shù)據(jù)類型被指定為一個參數(shù)泛型可以用在類、接口、方法的創(chuàng)建中,分別稱為泛型類、泛型接口和泛型方法泛型的引入背景:java集合中存在的問題:javaSE1.4和更早版本的集合有一個共同缺點:一旦將某個對象添加到其中,該對象便失去了其原有的類型信息,集合所容納的元素其實只是一些指向Object對象的引用。所以,從容器中取出的元素都變成了Object類型。實例如下:ListstuList1=newArrayList();stuList1.add(newStudent("張三","200080001"));stuList1.add(newStudent("李四","200080002"));Students1=(Student)stuList.get(0);//需要強制轉(zhuǎn)換(特別注意這里必須強制轉(zhuǎn)換)Stringnm=s1.getName();Stringno=s1.getNumber();該例子使用泛型改寫如下:List<Student>stuList1=newArrayList<Student>();stuList1.add(newStudent("張三","200080001"));stuList1.add(newStudent("李四","200080002"));Students1=stuList1.get(0);//不需要強制轉(zhuǎn)換(這也是使用泛型的好處)Stringnm=s1.getName();Stringno=s1.getNumber();第十一章:輸入輸出流如上所示:將時間的輸出格式按照自己定義的格式輸出具體實例如下:packageshurushuchu;importjava.io.File;importjava.util.Date;importjava.text.SimpleDateFormat;publicclassFileTest3{publicstaticvoidmain(String[]args){ //新建代表目錄的file對象 Filef=newFile("D:\\有用軟件"); if(f.exists()){ //獲取一個目錄下的所有的目錄的文件,并將其保存在字符串?dāng)?shù)組names中 String[]names=f.list(); //增強型的for循環(huán) for(Stringname:names){ //file的構(gòu)造方法,F(xiàn)ile(Stringparent,Stringchild) //其中parent-代表父路徑名字符串,child-子路徑名字符串 Filef1=newFile(f,name); //獲取最后修改時間 longt=f1.lastModified(); //新建Date類的對象代表時間 Datedate=newDate(t); //創(chuàng)建SimpleDateFormat對象構(gòu)造方法設(shè)置時間顯示格式如圖所示,用來設(shè)置日期和時間格式 SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); //格式化,即將時間按我們在構(gòu)造方法中定義的格式輸出 Stringt1=sdf.format(date); //判斷f路徑下的對象是否為文件 if(f1.isFile()){ System.out.println("這是一個文件"+name+"最后修改時間:"+t1); }else{ System.out.println("知識一個文件"+name+"最后修改時間:"+t1); }}}}1.基本概念的理解File代表的是文件和目錄2流的分類-按流的方向輸入流輸出流-按處理數(shù)據(jù)的單位不同字節(jié)流(8位一個字節(jié))字符流(16位兩個字節(jié))-按基本功能分節(jié)點流處理流3.流的分類 字節(jié)流 字符流輸入流InputStreamReader輸出流OutputStreamWriter4..InputStream的read方法是從輸入流中讀取下一個數(shù)據(jù)字節(jié)OutputStream的writer方法是將指定的字節(jié)寫入此輸出流1.增強型for循環(huán)的更深理解2.Collection接口,collections類且collection類中的方法均為靜態(tài)方法3.File類的使用實例如下:packageshurushuchu;importjava.io.File;publicclassFileTest2{publicstaticvoidmain(String[]args){ //新建代表目錄的file對象 Filef=newFile("D:\\有用軟件"); if(f.exists()){ //獲取一個目錄下的所有的目錄的文件,并將其保存在字符串?dāng)?shù)組names中 String[]names=f.list(); //增強型的for循環(huán) for(Stringname:names){ //file的構(gòu)造方法,F(xiàn)ile(Stringparent,Stringchild) //其中parent-代表父路徑名字符串,child-子路徑名字符串 Filef1=newFile(f,name); //判斷f路徑下的對象是否為文件 if(f1.isFile()){ System.out.println("這是一個文件"+name+"最后修改時間:"+f1.lastModified()); }else{ System.out.println("知識一個文件"+name+"最后修改時間:"+f1.lastModified()); } }}}}此處打出的時間格式并非我們常用的格式,那么如何將時間的格式改為我們常用的格式呢?要改則需要使用SimpleDateFromat類修改代碼如下:packageshurushuchu;importjava.io.File;importjava.util.Date;importjava.text.SimpleDateFormat;publicclassFileTest3{publicstaticvoidmain(String[]args){ //新建代表目錄的file對象 Filef=newFile("D:\\有用軟件"); if(f.exists()){ //獲取一個目錄下的所有的目錄的文件,并將其保存在字符串?dāng)?shù)組names中 String[]names=f.list(); //增強型的for循環(huán) for(Stringname:names){ //file的構(gòu)造方法,F(xiàn)ile(Stringparent,Stringchild) //其中parent-代表父路徑名字符串,child-子路徑名字符串 Filef1=newFile(f,name); //獲取最后修改時間 longt=f1.lastModified(); //新建Date類的對象代表時間 Datedate=newDate(t); //創(chuàng)建SimpleDateFormat對象,用來設(shè)置日期和時間格式 SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss"); //格式化,即將時間按我們在構(gòu)造方法中定義的格式輸出 Stringt1=sdf.format(date); //判斷f路徑下的對象是否為文件 if(f1.isFile()){ System.out.println("這是一個文件"+name+"最后修改時間:"+t1); }else{ System.out.println("知識一個文件"+name+"最后修改時間:"+t1); } }}}}4.File類的常用方法的使用實例如下:packageshurushuchu;importjava.io.File;importjava.io.IOException;publicclassFileTest1{ publicstaticvoidmain(String[]args){ //新建一個File類的對象,f表示文件d:/a.txtFilef=newFile("d:/a.txt");//由于Create方法拋出異常故要處理異常try{ if(!f.exists()){ f.createNewFile(); System.out.println("創(chuàng)建文件成功!"); }}catch(IOExceptione){ System.out.println(e.getMessage());}//新建指定路徑的目錄,ml表示多重目錄d:/a/b/c,ml1表示單重目錄d:/mlFileml=newFile("d:/a/b/c");Fileml1=newFile("d:/ml");//創(chuàng)建多重目錄ml.mkdirs();//創(chuàng)建單重目錄ml1.mkdir();if(ml.exists()){ //多重目錄的刪除只能刪除最里面的目錄 ml.delete(); System.out.println("刪除目錄成功!");}//判斷該目錄是否存在if(ml1.exists()){ ml1.delete(); System.out.println("刪除目錄成功!");}//新建File對象mul2代表D:\\C語言目錄Filemul2=newFile("D:\\C語言");//list方法獲得(D:\\C語言)目錄下的文件和目錄,并將其存放在字符串?dāng)?shù)組c中String[]names=mul2.list();//使用增強型的for循環(huán)for(Stringname:names){ //新建使用父目錄和子字符串構(gòu)造方法 Filef1=newFile(mul2,name); //判斷該對象是否為文件 if(f1.isFile()){ System.out.println("這是一個文件:"+f1.getName()); } //判斷該對象是否為目錄 if(f1.isDirectory()){ //getName()獲取文件或目錄的名稱 //getParent方法返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回null。 System.out.println("這是一個目錄:"+f1.getName()+"\t"+f1.getParent()); }}}}5.FileInputStream類的使用packageshurushuchu;importjava.io.InputStream;importjava.io.FileInputStream;publicclassFileInputStreamTest{publicstaticvoidmain(String[]args){ try{ //父類的引用指向子類的對象 InputStreamis=newFileInputStream("D:\\迅博學(xué)習(xí)筆記\\java學(xué)習(xí)筆記\\第八章接口\\接口重難點和注意點.txt"); //read方法返回的是下一個字節(jié) intch=is.read(); //由于read方法是當(dāng)文件到達末尾是返回-1,即 while(ch!=-1){ System.out.print((char)ch); ch=is.read(); } is.close(); }catch(Exceptione){ e.printStackTrace(); }}}//由于獲取是一個一個字節(jié)獲取,而一個漢字有兩個字節(jié),故如果有漢字則會出現(xiàn)錯誤6.FileInputStream類的更深理解作用:讀取指定的文件packageshurushuchu;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStream;importjava.io.FileInputStream;publicclassFileinputStream{ publicstaticvoidmain(String[]args){ //由于FileInputStream構(gòu)造函數(shù)拋出一個異常,故需要對異常進行處理 try{ InputStreamis=newFileInputStream("D:\\迅博學(xué)習(xí)筆記\\java學(xué)習(xí)筆記\\第九章異常\\注意點.txt"); //由于read方法的返回值為int型,該方法的作用是從此輸入流中讀取一個數(shù)據(jù)字節(jié) //所以若讀取的文件中含有漢字則會出現(xiàn)亂碼,由于一個漢字占兩個字節(jié) intch=is.read(); while(ch!=-1){ System.out.print((char)ch); //此句很關(guān)鍵 ch=is.read(); } //特別注意最后要關(guān)閉流 is.close(); } catch(FileNotFoundExceptione1){ e1.getStackTrace(); }catch(IOExceptione){ e.getStackTrace(); } } }注意點:如果文件中有漢字則上面的方法讀取會出現(xiàn)亂碼,解決方案如下://以下方法可以解決如果文件中有漢字時出現(xiàn)亂碼的問題,以此方法若有漢字不會出現(xiàn)亂碼packageshurushuchu;importjava.io.InputStream;importjava.io.FileInputStream;publicclassFileInputStreamTest2{publicstaticvoidmain(String[]args){ try{ //新創(chuàng)建FileInputStream對象 InputStreamf=newFileInputStream("D:\\迅博學(xué)習(xí)筆記\\java學(xué)習(xí)筆記\\第八章接口\\接口重難點和注意點.txt"); //創(chuàng)建數(shù)組保存讀取的字節(jié) byte[]b=newbyte[1024]; //讀取數(shù)據(jù) intch=f.read(b); if(ch!=-1){ //使用字符串publicString(byte[]bytes,intoffset,intlength)構(gòu)造方法,返回值為String類型 System.out.println(newString(b,0,ch)); } f.close(); }catch(Exceptione){ e.printStackTrace(); }}}7.FileReader類的使用注意FileReader類和FileOutputStream類的區(qū)別字節(jié)流字符流InputStreamReaderOutputStreamWriter即FileReader讀取的是一個字符,F(xiàn)ileOutputStream讀取的是一個字節(jié)則可以使用該類解決一下讀取漢字時的亂碼問題,具體的實現(xiàn)方法如下:packageshurushuchu;importjava.io.IOException;importjava.io.FileNotFoundException;importjava.io.Reader;importjava.io.FileReader;publicclassFileReaderTest{publicstaticvoidmain(String[]args){ try{ Readerdq=newFileReader("D:\\迅博學(xué)習(xí)筆記\\java學(xué)習(xí)筆記\\第八章接口\\接口重難點和注意點.txt"); //FileReader類的read方法是讀取的一個字符,read方法返回的是作為整數(shù)讀取的字符 inta=dq.read(); while(a!=-1){ System.out.print((char)a);//將整數(shù)a強制轉(zhuǎn)化為字符 a=dq.read(); } dq.close(); }catch(FileNotFoundExceptione1){ e1.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }}}此程序的關(guān)鍵在于FileReader類的read方法讀取的是一個字符,讀取漢字時不會出現(xiàn)亂碼8.FileOutputStream類的使用方法作用:向文件中寫入數(shù)據(jù)實例如下://FileOutputStream類的使用packageshurushuchu;importjava.io.OutputStream;importjava.io.FileOutputStream;publicclassFileOutStreamTest{publicstaticvoidmain(String[]args){ Stringstr1="相信自己,最后的勝利將屬于我";try{ OutputStreamos=newFileOutputStream("D:\\a\\b\\a.txt"); //write(byte[])將指定字節(jié)寫入此文件輸出流,str1.getBytes()返回值為一個字節(jié)數(shù)組 os.write(str1.getBytes()); System.out.println("寫入數(shù)據(jù)成功!"); os.close();}catch(Exceptione){ e.printStackTrace();}}}9.輸入輸出流同時使用的實例實例如下;packageshurushuchu;importjava.io.InputStream;importjava.io.FileInputStream;importjava.io.OutputStream;importjava.io.FileOutputStream;publicclassFoFosTest{publicstaticvoidmain(String[]args){ try{ //創(chuàng)建輸入流讀取圖像 InputStreamis=newFileInputStream("E:/win7/004423c5uflfl12bq3f39c.png"); //創(chuàng)建輸出流往文件中寫入數(shù)據(jù) OutputStreamos=newFileOutputStream("D:/a/b/a.txt"); //為字節(jié)數(shù)組分配存儲空間 byte[]b=newbyte[1024]; //讀取圖片數(shù)據(jù)并 intlen=is.read(b); while(len!=-1){ //輸出流寫入數(shù)據(jù)到指定的文件中 os.write(b,0,len); len=is.read(b); } //關(guān)閉輸入流輸出流 is.close(); os.close(); }catch(Exceptione){ e.printStackTrace(); }}}10.FileOutputStream類的構(gòu)造方法使用實例://FileOutputStream類的使用packageshurushuchu;importjava.io.File;importjava.io.IOException;importjava.io.OutputStream;importjava.io.FileOutputStream;publicclassFileOutStreamTest{publicstaticvoidmain(String[]args){ Stringstr1="相信自己,最后的勝利將屬于我"; Filef=newFile("D:\\a\\b\\b.txt"); try{ if(!f.exists()){ f.createNewFile(); }else{ OutputStreamos=newFileOutputStream("D:\\a\\b\\b.txt"); //write(byte[])將指定字節(jié)寫入此文件輸出流,str1.getBytes()返回值為一個字節(jié)數(shù)組 os.write(str1.getBytes()); System.out.println("寫入數(shù)據(jù)成功!"); os.close(); //publicFileOutputStream(Stringname,booleanappend)throwsFileNotFoundException //創(chuàng)建一個向具有指定name的文件中寫入數(shù)據(jù)的輸出文件流。如果第二個參數(shù)為true,則將字節(jié)寫入文件末尾處,而不是寫入文件開始處。 //創(chuàng)建一個新FileDescriptor對象來表示此文件連接。 OutputStreamos1=newFileOutputStream("D:\\a\\b\\b.txt",true); Stringstr2="java程序"; //字符串的getBytes()方法返回字節(jié)數(shù)組 os1.write(str2.getBytes()); System.out.println("添加數(shù)據(jù)成功!"); os1.close(); } }catch(Exceptione1){ e1.printStackTrace(); }}}特別注意:構(gòu)造方法FileOutputStream("D:\\a\\b\\b.txt",true)由于第二個參數(shù)為true,故表示將字節(jié)寫入文件末尾處11.讀取和寫入的經(jīng)典實例://將路徑D:\\迅博學(xué)習(xí)筆記\\java學(xué)習(xí)筆記\\第九章異常\\作業(yè)\\bookTest1.java下的bookTest1.java文件內(nèi)容寫入//路徑D:\\a\\b\\c.txt下的c.txt文件中去packageshurushuchu;importjava.io.Reader;importjava.io.FileReader;importjava.io.Writer;importjava.io.FileWriter;publicclassFileReaderTest1{publicstaticvoidmain(String[]args){ try{ //rd代表文件bookTest1.java Readerrd=newFileReader("D:\\迅博學(xué)習(xí)筆記\\java學(xué)習(xí)筆記\\第九章異常\\作業(yè)\\bookTest1.java"); //wt代表文件c.txt Writerwt=newFileWriter("D:\\a\\b\\c.txt"); //為字符數(shù)組分配空間 char[]ch=newchar[1024]; //讀取文件中的字符,并將讀取字符存入數(shù)組中,一次只能讀取1024個字符,read方法的返回值為整型 intlen=rd.read(ch); while(len!=-1){ //將字符數(shù)組中的數(shù)據(jù)全部寫如文件c.txt中 wt.write(ch,0,len); //繼續(xù)讀取文件中的字符,并將讀取字符存入數(shù)組中去,如果未到文件末尾,則繼續(xù)講1024個字符讀出 len=rd.read(ch); } rd.close(); wt.close(); }catch(Exceptione){ e.printStackTrace(); }}}1.什么是序列化和反序列化序列化可以將內(nèi)存中的類寫入文件或數(shù)據(jù)庫中。比如將某個類序列化后存為文件,下次讀取時只需將文件中的數(shù)據(jù)反序列化就可以將原先的類還原到內(nèi)存中。也可以將類序列化為流數(shù)據(jù)進行傳輸??偟膩碚f就是將一個已經(jīng)實例化的類轉(zhuǎn)成文件存儲,下次需要實例化的時候只要反序列化即可將類實例化到內(nèi)存中并保留序列化時類中的所有變量和狀態(tài)。2.節(jié)點流和處理流-節(jié)點流:能直接從一個特定的區(qū)域讀寫數(shù)據(jù)。如硬盤或內(nèi)存空間-處理流:從節(jié)點流中讀寫數(shù)據(jù)。建立在節(jié)點流的基礎(chǔ)上。3.緩沖流實例:packageshurushuchu;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.BufferedOutputStream;importjava.io.BufferedInputStream;publicclassBufferedOutputStreamTest{publicstaticvoidmain(String[]args){ try{ //新建文件輸入流,fr代表文件(面向?qū)ο蟮木幊套⒁恻c.txt) FileInputStreamfr=newFileInputStream("C:\\Users\\Administrator\\Desktop\\java學(xué)習(xí)筆記\\第六章面向?qū)ο缶幊?\\面向?qū)ο蟮木幊套⒁恻c.txt"); //新建緩沖輸入流,緩沖輸入流為處理流,是建立在節(jié)點流(文件輸入流等) BufferedInputStreambr=newBufferedInputStream(fr); //新建文件輸出流,fw代表文件(d.txt) FileOutputStreamfw=newFileOutputStream("c:/d.txt"); //新建緩沖輸出流,緩沖輸出流為處理流,是建立在節(jié)點流的基礎(chǔ)上的 BufferedOutputStreambw=newBufferedOutputStream(fw); //新建字節(jié)數(shù)組,并為字節(jié)數(shù)組分配空間 byte[]b=newbyte[1024]; //使用緩沖輸入流從文件中讀入數(shù)據(jù),并存放在字節(jié)數(shù)組b中 intlen=br.read(b); while(len!=-1){ //從緩沖輸出流中,寫入數(shù)據(jù)到文件d.txt中 bw.write(b); //刷新此緩沖的輸出流。這迫使所有緩沖的輸出字節(jié)被寫出到底層輸出流中 bw.flush(); //繼續(xù)讀取數(shù)據(jù)并將數(shù)據(jù)存放在字節(jié)數(shù)組中 len=br.read(b); } fr.close(); fw.close(); br.close(); bw.close(); }catch(Exceptione){ e.printStackTrace(); }}}緩沖流的讀取一行:實例如下://C:\\Users\\Administrator\\Desktop\\java學(xué)習(xí)筆記\\第六章面向?qū)ο缶幊?\\面向?qū)ο蟮木幊套⒁恻c.txt//路徑下的文件(面向?qū)ο蟮木幊套⒁恻c.txt)的內(nèi)容復(fù)制到c盤中的e.java文件中去packageshurushuchu;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.IOException;publicclassBufferedReaderTest{publicstaticvoidmain(String[]args){ try{ FileReaderfr=newFileReader("C:\\Users\\Administrator\\Desktop\\java學(xué)習(xí)筆記\\第六章面向?qū)ο缶幊?\\面向?qū)ο蟮木幊套⒁恻c.txt"); BufferedReaderbr=newBufferedReader(fr); FileWriterfw=newFileWriter("C:/e.java"); BufferedWriterbw=newBufferedWriter(fw); /*char[]c=newchar[1024]; intlen=br.read(c); while(len!=-1){ //對于讀取字符數(shù)組的寫入格式為Write(char[],intoff,intlen), //即以字符進行讀取時,write方法的參數(shù)Write(char[],intoff,intlen) //不能使用write(char[]);方法了,由于write中沒有該參數(shù) bw.write(c,0,len); bw.flush(); len=br.read(c); }*/ //按行讀取數(shù)據(jù) //讀取文件中的一行,通過下列字符之一即可認為某行已經(jīng)終止,'\n'(換行),'\r'(回車) Strings=br.readLine(); while(s!=null){ //將讀取的一行數(shù)據(jù)寫入指定文件中 bw.write(s); //寫入一個分隔符 bw.newLine(); //刷新該流的緩沖區(qū),并強行將緩沖區(qū)的數(shù)據(jù)寫入指定文件中去 bw.flush(); s=br.readLine(); } //關(guān)閉相應(yīng)的流 fr.close(); fw.close(); br.close(); bw.close(); }catch(IOExceptione){ e.printStackTrace(); } }}4.Print流printStream流只能是建立在OutputStream基礎(chǔ)之上的PrintStream流是針對(字節(jié))的流PrintWriter流是針對(字符)的流實例如下:packageshurushuchu;importjava.io.FileReader;importjava.io.PrintStream;importjava.io.PrintWriter;importjava.io.FileOutputStream;publicclassPrintStreamTest{publicstaticvoidmain(String[]args){ try{ //創(chuàng)建文件輸入流,fr代表文件(重難點.txt) FileReaderfr=newFileReader("C:\\Users\\Administrator\\Desktop\\java學(xué)習(xí)筆記\\第十一章輸入輸出流1\\重難點.txt"); //FileOutputStreamfw=newFileOutputStream("C:/da.txt"); //創(chuàng)建打印輸出流(打印流也只用輸出流),ps代表文件da.txt,即從輸入流中讀取數(shù)據(jù)后 //,將數(shù)據(jù)寫入的指定的文件,注意PrintWriter為字符輸出流,PrintStream為字節(jié)輸出流 PrintWriterps=newPrintWriter("C:/da.txt"); /* 構(gòu)造方法二:FlieInputStreamfr=newFlieInputStream("C:\\Users\\Administrator\\Desktop\\java學(xué)習(xí)筆記\\第十一章輸入輸出流1\\重難點.txt"); PrintWriterps=newPrintWriter(fr); */ char[]b=newchar[1024]; intlen=fr.read(b); while(len!=-1){ //調(diào)用PrintWriter流的print方法,注意該方法中沒有print(byte[]) ps.print(b); ps.flush(); len=fr.read(b); } fr.close(); //fw.close(); ps.close(); }catch(Exceptione){ e.printStackTrace(); }}}5.DataOutput是一個接口DateOutputStream是一個實現(xiàn)接口的類注意點:數(shù)據(jù)流是一個字節(jié)流,即沒有DataWriter,DataReader實例如下:packageshurushuchu;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.DataInputStream;importjava.io.DataOutputStream;publicclassDateStreamTest{ publicstaticvoidmain(String[]args){ try{ //新建文件輸出流,其中fw代表文件file.txt(底層流) FileOutputStreamfw=newFileOutputStream("c:/file.txt"); //新建數(shù)據(jù)流輸出流,其中dw代表文件 DataOutputStreamdw=newDataOutputStream(fw); //將指定的整數(shù)寫入基礎(chǔ)輸出流中(即fw流中) dw.writeInt(12); //將指定的字符寫入基礎(chǔ)輸出流中 dw.writeChar('男'); //新建文件輸入流,其中fw代表文件file.txt(底層流) FileInputStreamfr=newFileInputStream("c:/file.txt"); //新建數(shù)據(jù)輸入流,其中fr為基礎(chǔ)流 DataInputStreamdr=newDataInputStream(fr); //dr.readChar()方法,從包含的輸入流中讀取該操作需要的字節(jié),返回為此輸入流的下兩個字節(jié),解釋為一個字符 System.out.println(dr.readInt()); System.out.println(dr.readChar()); }catch(Exceptione){ e.printStackTrace(); } }}6.Object類使用實例注意:并不是任何引用類型的數(shù)據(jù)(對象)都可以序列化的,只有實現(xiàn)了Serializable接口的類的對象才可以序列化使用實例如下:packageshurushuchu;importjava.io.Serializable;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;publicclassObjectTest{ publicstaticvoidmain(String[]args){ try{ //新建文件輸出流,fw代表文件b.java(底層流) FileOutputStreamfw=newFileOutputStream("f:/b.java"); //新建對象輸出流, ObjectOutputStreamow=newObjectOutputStream(fw); //新建Student類對象 Studentstu1=newStudent("孫悟空","021140507",'男',1000,90.44); //將Student類對象序列化寫入文件b.java中 ow.writeObject(stu1); //新建文件輸入流,fr代表文件b.java FileInputStreamfr=newFileInputStream("f:/b.java"); //新建對象輸入流 ObjectInputStreamor=newObjectInputStream(fr); //反序列化讀取文件中的對象 Studentstu=(Student)or.readObject(); //在控制臺打印出對象stu System.out.println(stu); fr.close(); fw.close(); or.close(); ow.close(); }catch(Exceptione){ e.printStackTrace(); } }}//注意并不是任何引用類型的數(shù)據(jù)都可以序列化的,只用實現(xiàn)了Serializable接口類的對象才可以序列化classStudentimplementsSerializable{ privateStringname; privateStringstuNo; privatecharsex; privateintage; privatedoublegrade; publicStudent(Stringname,StringstuNo,charsex,intage,doublegrade){ =name; this.stuNo=stuNo; this.sex=sex; this.age=age; this.grade=grade; } //重寫toString方法 publicStringtoString(){ returnname+":"+sex+":"+age+":"+grade; }}第十二章1.Thread類的使用實例如下:packagexianche;//注意Thread類在lang包中,故不需要導(dǎo)入包publicclassMianThreadTest{publicstaticvoidmain(String[]args){ //Thread的currentThread()方法返回的是Thread對象故可以在其后調(diào)用getName()方法 System.out.println(Thread.currentThread().getName()); for(inti=0;i<10;i++){ System.out.println("main()--------------"+i); try{ //調(diào)用Thread類的sleep方法,并且該方法會拋出異常,線程暫停一秒 Thread.sleep(1000); }catch(Exceptione){ e.printStackTrace(); } }}}2.創(chuàng)建線程的方法有兩種方法一:通過繼承Thread類來創(chuàng)建自己的線程packagexianche;publicclassThreadTest{ publicstaticvoidmain(String[]args){ //創(chuàng)建線程 MyThreadt=newMyThread("t1"); //啟動線程,使該線程開始執(zhí)行,java虛擬機調(diào)用該線程的run方法 t.start(); try{ for(inti=0;i<10;i++) { System.out.println(Thread.currentThread().getName()+"---------"+i); //Thread方法為靜態(tài)方法,調(diào)用只需要使用類名.方法名即可 Thread.sleep(1000); } }catch(Exceptione){ e.printStackTrace(); } }}//通過繼承Thread類來創(chuàng)建自己的線程類classMyThreadextendsThread{ //構(gòu)造方法 publicMyThread(Stringname){ //調(diào)用父類的構(gòu)造方法 super(name); } //重寫父類的run方法 publicvoidrun(){ try{ for(inti=0;i<10;i++){ System.out.println(getName()+"------------"+i); //由于MyThread繼承了Thread類,且sleep方法為靜態(tài)方法,故可以直接調(diào)用 sleep(1000); } }catch(Exceptione){ e.printStackTrace(); } }}方法二:利用實現(xiàn)Runnable接口來創(chuàng)建線程實例如下:packagexianche;publicclassTreadTest1{publicstaticvoidmain(String[]args){ //創(chuàng)建自己定義的線程類 MyTread1f=newMyTread1(); //由于自己創(chuàng)建的線程類中沒有Start方法,不能啟動線程,故利用Thread類的Start方法來啟動線程 //使用Thread的構(gòu)造方法 Threadw=newThread(f); //利用Thread類的start方法啟動線程 w.start(); try{ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"-----------"+i); Thread.sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); } }}//通過實現(xiàn)Runnable接口來創(chuàng)建自己的線程classMyTread1implementsRunnable{ //實現(xiàn)Runable接口中的run方法 publicvoidrun(){ try{ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"------------"+i); Thread.sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); } }}3.中斷線程的方法方法一:中斷線程的方法利用標記,終止循環(huán)來中斷線程實例如下:packagexianche;publicclassInterruptedThreadTest{publicstaticvoidmain(String[]args){ //創(chuàng)建MyThread3類對象,并調(diào)用帶參的構(gòu)造方法來創(chuàng)建對象 MyThread3t=newMyThread3("t2"); //調(diào)用Thread的start方法來啟動線程 t.start(); try{ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"---------"+i); Thread.sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); } }}//通過繼承Thread類創(chuàng)建線程classMyThread3extendsThread{ //私有變量作為標記 privatebooleanflag=false; //帶參數(shù)的構(gòu)造方法 publicMyThread3(Stringname){ //調(diào)用父類的構(gòu)造方法 super(name); } //重寫父類的run方法 publicvoidrun(){ try{ //利用標記作為循環(huán)判斷 for(inti=0;!flag&&i<10;i++){ System.out.println(getName()+"------------"+i); sleep(1000); if(i==6) //當(dāng)i=6時,將flag賦值為true flag=true; } }catch(Exceptione){ e.printStackTrace(); } }}方法二:利用isInterrupted()方法來實現(xiàn)中斷線程實例如下:packagexianche;publicclassInterruptedTreadTest{publicstaticvoidmain(String[]args){ MyThread2t=newMyThread2("t1"); t.start(); try{ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"-----------"+i); Thread.sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); }}}classMyThread2extendsThread{ publicMyThread2(Stringname){ super(name); } publicvoidrun(){ try{ //isInterrupted為什么使用類名.方法名,就出現(xiàn)錯誤 //使用isInterrupted方法來檢查中斷狀態(tài)變量值是否為true for(inti=0;!isInterrupted()&&i<10;i++){ System.out.println(getName()+"------------"+i); //由于MyThread2類繼承了Thread類,且sleep方法為靜態(tài)方法 sleep(1000); if(i==6) //interrupted方法為靜態(tài)方法 interrupt();//中斷,只是設(shè)置當(dāng)前線程的中斷線程狀態(tài)變量的值為true } }catch(InterruptedExceptione){ e.printStackTrace(); } }}注意interrupt和interrupted的區(qū)別1.interrupt只是設(shè)置當(dāng)前線程的中斷線程狀態(tài)變量的值為true,并沒有中斷線程,一個線程在設(shè)置了中斷標記后,仍可運行2.interrupted是測試當(dāng)前執(zhí)行的線程是否被中斷,在肯定的情況下,清除當(dāng)前線程的中斷標記并返回true方法三:通過返回語句來中斷進程實例如下:packagexianche;//為什么t1進程是在i=4時中斷,而不是在i=3是中斷publicclassInterruptedThreadTest1{publicstaticvoidmain(String[]args){ MyThread4t=newMyThread4("t1"); t.start(); try{ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"---"+i); Thread.sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); }}}classMyThread4extendsThread{ publicMyThread4(Stringname){ super(name); } publicvoidrun(){ try{ for(inti=0;i<10;i++){ System.out.println(currentThread().getName()+"------"+i); sleep(1000); if(i==3) interrupt();//interrupt方法設(shè)置當(dāng)前線程中斷狀態(tài)變量的值為true, //即拋出中斷異常,拋出異常后則處理異常,返回空值即終止進程 } }catch(InterruptedExceptione){ //當(dāng)發(fā)現(xiàn)異常后就執(zhí)行該語句 return; } }}3.如果在結(jié)束進程之前還要執(zhí)行一些其他的命令語句則放在finally語句中,如word中的建文件后,打入內(nèi)容后,如果忘了保存,直接關(guān)閉程序,則會彈出提示框,提醒你保存文件,這就是在結(jié)束進程之前要執(zhí)行的語句實例如下:packagexianche;publicclassInterruptedThreadTest1{publicstaticvoidmain(String[]args){ MyThread4t=newMyThread4("t1"); t.start(); try{ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"---"+i); Thread.sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); }}}classMyThread4extendsThread{ publicMyThread4(Stringname){ super(name); } publicvoidrun(){ try{ for(inti=0;i<10;i++){ System.out.println(currentThread().getName()+"------"+i); sleep(1000); if(i==3) interrupt();//interrupt方法設(shè)置當(dāng)前線程中斷狀態(tài)變量的值為true, //即拋出中斷異常,拋出異常后則處理異常,返回空值即終止進程 } }catch(InterruptedExceptione){ //當(dāng)發(fā)現(xiàn)異常后就執(zhí)行該語句 return; }finally{ System.out.println("請保存文件!"); } }}特別注意:finally語句在程序結(jié)束前執(zhí)行4.Thread類的join方法的使用實例如下:packagexianche;publicclassJoinTest{publicstaticvoidmain(String[]args){ MyTreadt=newMyTread("k"); t.start(); try{ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName()+"---"+i); Thread.sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); } }}classMyTreadextendsThread{ publicMyTread(Stringname){ super(name); } publicvoidrun(){ try{ for(inti=0;i<10;i++){ System.out.println(currentThread().getName()+"-----"+i); if(i==2) //當(dāng)i=2時,t線程停止等待10秒,等待該線程終止時間,k線程終止,讓出cpu主線程執(zhí)行 join(10000); sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); } }}以上程序執(zhí)行結(jié)果為:main---0k-----0k-----1main---1main---2k-----2main---3main---4main---5main---6main---7main---8main---9k-----3k-----4k-----5k-----6k-----7k-----8k-----9執(zhí)行k進程時,當(dāng)i=2時則k進程暫停10秒,即從執(zhí)行k進程i=2開始,10秒后才執(zhí)行k進程,由于k-----2執(zhí)行后,主進程執(zhí)行完只要7秒,故主進程執(zhí)行完后還要等3秒才繼續(xù)執(zhí)行k進程注意點:如果join()括號中沒寫參數(shù),則表示當(dāng)i=5時,等待t進程執(zhí)行完畢后再執(zhí)行main進程5.Thread類中的yield方法的使用yield方法作用是暫停正在執(zhí)行的線程對象,并執(zhí)行其他線程對象實例如下:packagexianche;publicclassYieldThreadTest1{ publicstaticvoidmain(String[]args){ MyThread5t1=newMyThread5("t1"); t1.start(); try{ for(inti=1;i<=10;i++){ System.out.println("main------------------"+i); if(i==4) Thread.yield();//讓出cpu //使當(dāng)前線程休眠1秒鐘 Thread.sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); } }}//繼承Thread類創(chuàng)建自己的線程類classMyThread5extendsThread{ //帶參數(shù)的構(gòu)造方法 publicMyThread5(Stringname){ //調(diào)用父類的構(gòu)造方法給name成員變量賦值 super(name); } //重寫run方法 publicvoidrun(){ //輸出1-10的數(shù)字 try{ for(inti=1;i<=10;i++){ System.out.println(getName()+"-----------"+i); //休眠1秒鐘 sleep(1000); } }catch(InterruptedExceptione){ e.printStackTrace(); }}}程序的運行結(jié)果為:main------------------1t1-----------1main------------------2t1-----------2main------------------3t1-----------3main------------------4t1-----------4t1-----------5main------------------5t1-----------6main------------------6main------------------7t1-----------7main------------------8t1-----------8t1-----------9main------------------9t1-----------10main------------------10線程項目:1.案例注意點:-買票問題注意點:1.synchronized作用是:讓它所管轄的代碼部分,要么全部執(zhí)行完,要么全部不執(zhí)行2.synchronized既可以修飾代碼塊,又可以修飾函數(shù)項目實例如下:packagexianche;//疑問為什么,使用synchronized關(guān)鍵字后,為什么還是會出現(xiàn)一張票會有兩個窗口同時賣出publicclassMaipiaoTest{publicstaticvoidmai

溫馨提示

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

評論

0/150

提交評論