JAVA學(xué)習(xí)全套筆記_第1頁(yè)
JAVA學(xué)習(xí)全套筆記_第2頁(yè)
JAVA學(xué)習(xí)全套筆記_第3頁(yè)
JAVA學(xué)習(xí)全套筆記_第4頁(yè)
JAVA學(xué)習(xí)全套筆記_第5頁(yè)
已閱讀5頁(yè),還剩166頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

RepositoryURL:https://USER-20140722PG:8443/svn/jsd151201配置變量:計(jì)算機(jī)→屬性→高級(jí)系統(tǒng)設(shè)置→高級(jí)→環(huán)境變量系統(tǒng)變量→新建JAVA_HOME變量?!ぷ兞恐堤顚?xiě)jdk的安裝目錄(本人是E:\Java\jdk1.7.0)系統(tǒng)變量→尋找Path變量→編輯·在變量值最后輸入%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;·(注意原來(lái)Path的變量值末尾有沒(méi)有;號(hào),如果沒(méi)有,先輸入;號(hào)再輸入上面的代碼)系統(tǒng)變量→新建CLASSPATH變量·變量值填寫(xiě).;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意最前面有一點(diǎn))·系統(tǒng)變量配置完畢檢測(cè)是否成功:cmd下輸入javajavacjava–version//檢查版本若程序越改越爛,可以右擊該java文件→ReplaceWith→LocalHistry來(lái)回到之前保存的版本//TODO注釋用于在Tasks頁(yè)面上查看未完成的方法快捷方法:System.out.println()可以用Syso+Alt+/直接寫(xiě)全Ctrl+/將當(dāng)前行注釋main方法可以main+Alt+/+Enter直接寫(xiě)全Ctrl+Shift+*:將所有方法打開(kāi)Ctrl+Shift+小鍵盤的/:將所有方法關(guān)閉Ctrl+PageUp/Ctrl+PageDown:在打開(kāi)的多個(gè)java文件間切換Ctrl+鼠標(biāo)點(diǎn)擊方法名:進(jìn)入方法體內(nèi)部Ctrl+F:查找Ctrl+K:依次查找鼠標(biāo)選定關(guān)鍵字Ctrl+Shift+K:查找上一個(gè)鼠標(biāo)選定關(guān)鍵字Alt+↑/↓:將上下相鄰的兩行互換位置Ctrl+Alt+↓:復(fù)制當(dāng)前行Ctrl+Shift+O:快速導(dǎo)包Ctrl+Shift+F:調(diào)整格式Ctrl+Enter:將字符串快速分行Ctrl+Shift+T:查找類Alt+Shift+J:生成注釋Alt+Shift+M:將選定代碼封裝為一個(gè)方法Ctrl+O:查看類中的屬性及方法列表Ctrl+T:查看類的繼承關(guān)系A(chǔ)lt+Shift+X,T:快速對(duì)@Test標(biāo)簽標(biāo)記的方法進(jìn)行測(cè)試longstattime=System.currentTimeMillis();表示從1970.1.1零時(shí)到現(xiàn)在的毫秒數(shù)+兩邊是數(shù)字為加法,有一邊為字符串做字符串連接switch后不能加long型inti=(int)(Math.random()100);后面(Math.random()100)一定要加括號(hào),不然就是一個(gè)偽隨機(jī)數(shù)Math.random()隨機(jī)生成一個(gè)0.0-0.99999999999999…之間的數(shù)建議:循環(huán)層數(shù)越少越好,層數(shù)越少效率越高若循環(huán)次數(shù)超3層,說(shuō)明設(shè)計(jì)有問(wèn)題importjava.util.Random;Randomran=newRandom();arr[i]=ran.nextInt(100);使用Random類,需要導(dǎo)入java.util.Random用Random類的nextInt(100)方法來(lái)生成隨機(jī)數(shù),括號(hào)內(nèi)的100應(yīng)為0-100之間數(shù)組程序=算法+數(shù)據(jù)結(jié)構(gòu)算法:解決問(wèn)題的流程/步驟(順序,分支,嵌套)數(shù)據(jù)結(jié)構(gòu):將數(shù)據(jù)按照某種結(jié)構(gòu)來(lái)保存設(shè)計(jì)良好的數(shù)據(jù)結(jié)構(gòu)會(huì)導(dǎo)致好的算法數(shù)組是一種數(shù)據(jù)類型(引用類型)int[]=newint[]{2,5,8};中括號(hào)內(nèi)不能加數(shù)字?jǐn)?shù)組的訪問(wèn): 通過(guò)數(shù)組名.length可以獲得數(shù)組長(zhǎng)度數(shù)組可以用Arrays.toString(arr)來(lái)輸出需要導(dǎo)入java.util.Arrays數(shù)組復(fù)制System.arraycopy(a,0,a1,0,5)arr=Arrays.copyOf(arr,arr.length+1);數(shù)據(jù)不同時(shí)選擇哪種排序方式,最終效率不同冒泡的原理:1. n個(gè)數(shù)冒n-1輪2. 每一輪都是從第一個(gè)元素開(kāi)始比,每次和它的下一個(gè)元素比3. 冒出來(lái)的不再比較了升序使用Arrays.sort(arr);來(lái)排列并非一次判斷就能得到最終結(jié)果用開(kāi)關(guān)doublea=Math.sqrt(100)求100的平方根方法(函數(shù))1.封裝一段特定的邏輯功能2.方法盡可能獨(dú)立,盡可能小3.方法可以被反復(fù)調(diào)用4.結(jié)構(gòu)清晰,便于維護(hù),便于合作開(kāi)發(fā)若方法執(zhí)行完之后,需要一個(gè)數(shù)據(jù),則有返回值若方法執(zhí)行完后,不需要數(shù)據(jù),則無(wú)返回值input=inputStr.toCharArray();//將字符串轉(zhuǎn)換為字符數(shù)組StringinputStr=scan.next().toUpperCase();//將輸入的字符串轉(zhuǎn)換為大寫(xiě)inputStr.equals("EXIT")//和括號(hào)內(nèi)字符串進(jìn)行比較面向?qū)ο竺嫦蜻^(guò)程的缺陷1.缺乏對(duì)數(shù)據(jù)的封裝2.數(shù)據(jù)與方法(操作數(shù)據(jù)的)的分離什么是類?什么是對(duì)象1.現(xiàn)實(shí)世界是由很多很多對(duì)象組成的基于對(duì)象抽出了類2.對(duì)象:真實(shí)存在的單個(gè)個(gè)體類:代表一類個(gè)體3.類中包含:1)對(duì)象所共有的特性/屬性(靜)變量2)對(duì)象所共有的行為(動(dòng))方法4.一個(gè)類可以創(chuàng)建多個(gè)對(duì)象同一個(gè)類所創(chuàng)建的對(duì)象,結(jié)構(gòu)相同,數(shù)據(jù)不同5.類是模版,對(duì)象是類的具體實(shí)例定義類:1.找對(duì)象2.抽類3.設(shè)計(jì)類中的成員變量和方法4.創(chuàng)建對(duì)象并測(cè)試引用類型之間畫(huà)等號(hào):相當(dāng)于兩個(gè)指針指向同一個(gè)對(duì)象1)指向了同一個(gè)對(duì)象(eg:房門鑰匙)2)對(duì)其中一個(gè)引用的修改,影響另外一個(gè)引用基本類型之間畫(huà)等號(hào):1)賦值(eg:身份證復(fù)印件)2)對(duì)其中一個(gè)引用的修改,不會(huì)影響另外一個(gè)方法的簽名:方法名+參數(shù)列表方法重載同一個(gè)類里的不同方法可以重名,但形參不能一樣調(diào)用時(shí)系統(tǒng)根據(jù)形參來(lái)判斷使用哪一個(gè)方法1.同一個(gè)java文件中可以包含多個(gè)類2.public修飾的類只能有一個(gè)3.public的類必須與文件名相同構(gòu)造方法方法名稱必須與類名相同構(gòu)造方法無(wú)返回值,但不能寫(xiě)void1.常常給成員變量賦值2.與類同名,沒(méi)有返回值類型3.在創(chuàng)建對(duì)象(new)時(shí)被自動(dòng)調(diào)用4.若自己不寫(xiě)構(gòu)造,則編譯器默認(rèn)提供一個(gè)無(wú)參構(gòu)造若自己寫(xiě)了構(gòu)造,則不再默認(rèn)提供5.構(gòu)造方法可以重載this:指代當(dāng)前對(duì)象,哪個(gè)對(duì)象調(diào)指的就是哪個(gè)對(duì)象在方法中訪問(wèn)成員變量之前默認(rèn)有個(gè)this.用法:1.this.成員變量名訪問(wèn)成員變量2.this.方法名()調(diào)用方法3.this()調(diào)用構(gòu)造方法堆內(nèi)存用new創(chuàng)建的對(duì)象(包含成員變量)存在堆中堆的生命周期是從對(duì)象被創(chuàng)建到對(duì)象在堆中被回收System.gc()回收無(wú)引用的對(duì)象(即無(wú)指針指向的對(duì)象)棧棧中存放所有局部變量每個(gè)方法都會(huì)分配相應(yīng)的棧幀以存儲(chǔ)該方法的參數(shù)和局部變量等數(shù)據(jù)方法調(diào)用完成,棧幀清除,局部變量失效方法區(qū):用于存儲(chǔ)字節(jié)碼文件(.class)以及方法方法只有一份,通過(guò)this區(qū)分具體的對(duì)象繼承:1)作用:避免代碼的重復(fù),有利于代碼的重用2)通過(guò)extends實(shí)現(xiàn)繼承3)父類:所有子類所共有的屬性和行為子類:子類所特有的屬性和行為4)子類繼承父類后,子類具有:子類的+父類的5)一個(gè)父類可以有多個(gè)子類一個(gè)類只能繼承一個(gè)父類單一繼承6)繼承具有傳遞性7)java規(guī)定:構(gòu)造子類之前必須先構(gòu)造父類,子類構(gòu)造中若自己不調(diào)父類構(gòu)造,則默認(rèn)super()調(diào)父類的無(wú)參構(gòu)造,若自己寫(xiě)了,則不再默認(rèn)提供super()調(diào)父類構(gòu)造必須位于子類構(gòu)造的第一句super:指代當(dāng)前對(duì)象的父類對(duì)象super用法:super.成員變量名--訪問(wèn)父類的成員變量super.方法名()調(diào)用父類的方法super()調(diào)用父類的構(gòu)造方法4.向上造型:1)父類型的引用指向子類的對(duì)象2)能點(diǎn)出來(lái)什么,看引用的類型運(yùn)行期調(diào)用哪個(gè)屬性(成員變量)看父類類型,調(diào)用哪個(gè)方法看new出來(lái)的對(duì)象重寫(xiě)(override)與重載(overload)的區(qū)別:1)重寫(xiě):父子類中,方法名稱相同,參數(shù)列表相同遵循"運(yùn)行期"綁定,根據(jù)對(duì)象的類型調(diào)用方法2)重載:同一個(gè)類中,方法名稱相同,參數(shù)列表不同遵循"編譯期"綁定,根據(jù)參數(shù)的類型綁定調(diào)用的方法重載看參數(shù)類型,重寫(xiě)看對(duì)象類型重寫(xiě)遵守"兩同兩小一大"原則1)兩同:1.1)方法名稱相同1.2)參數(shù)列表相同2)兩小:2.1)子類的返回值類型小于或等于父類的2.1.1)返回值類型為void時(shí),必須相等2.1.2)返回值類型為基本類型時(shí),必須相等2.1.3)返回值類型為引用類型時(shí),可以小于或等于2.2)子類拋出的異常小于或等于父類的3)一大:3.1)子類的訪問(wèn)權(quán)限大于或等于父類的//父類大,子類小classCoo{ voidsay(){} doublesayHi(){return0.0;} Cootest(){returnnull;} Dooshow(){returnnull;}}classDooextendsCoo{ voidsay(){}//void時(shí),必須相等 doublesayHi(){return0.0;}//基本類型必須相等 Dootest(){returnnull;}//引用類型可以小于或等于 //Cooshow(){returnnull;}//編譯錯(cuò)誤,必須小于或等于}完全限定名:包名.類名訪問(wèn)控制修飾符:public:公共的,任何類protected:受保護(hù)的,本類、子類、同包類默認(rèn)的:什么也不寫(xiě),本類、同包類private:私有的,本類注意:1)類的修飾符只能是public和默認(rèn)的2)類中成員如上4種都可以static:靜態(tài)的1)靜態(tài)變量:1.1)由static修飾1.2)屬于類,存在方法區(qū)中,只有一份1.3)常常通過(guò)類名.來(lái)訪問(wèn)1.4)何時(shí)用:當(dāng)所有對(duì)象數(shù)據(jù)都一樣時(shí)使用2)靜態(tài)方法:2.1)由static修飾2.2)屬于類,存在方法區(qū)中,只有一份2.3)常常通過(guò)類名.來(lái)訪問(wèn)2.4)靜態(tài)方法沒(méi)有隱式的this傳遞,所以靜態(tài)方法中不能直接訪問(wèn)實(shí)例成員2.5)何時(shí)用:方法的操作僅與參數(shù)相關(guān)而與對(duì)象無(wú)關(guān)時(shí)使用有static的方法可以直接調(diào)用,沒(méi)有static的方法必須用對(duì)象調(diào)3)靜態(tài)塊:3.1)由static修飾3.2)在類被加載時(shí)自動(dòng)執(zhí)行,因類只被加載一次,所以靜態(tài)塊也只執(zhí)行一次3.3)何時(shí)用:常常用于加載靜態(tài)資源(圖片、音頻、視頻等)成員變量:1)實(shí)例變量:屬于對(duì)象的,存在堆中有幾個(gè)對(duì)象就有幾份對(duì)象名.來(lái)調(diào)用2)靜態(tài)變量:屬于類的,存在方法區(qū)中只有一份類名.來(lái)調(diào)用程序中需要去保護(hù)數(shù)據(jù)建議:數(shù)據(jù)私有化private,行為公開(kāi)化publicfinal:不可變1)修飾變量:變量不可被改變2)修飾方法:方法不可被重寫(xiě)3)修飾類:類不可被繼承final修飾成員變量,兩種初始化方式:1)聲明的同時(shí)初始化2)構(gòu)造方法中初始化final修飾局部變量:使用之前初始化即可常量由staticfinal修飾,必須聲明同時(shí)初始化,相當(dāng)于const不能改變,通過(guò)類名.來(lái)訪問(wèn)抽象方法由abstract修飾只有定義,沒(méi)有方法的實(shí)現(xiàn)(無(wú)方法體{})抽象類包含抽象方法的必須為抽象類不包含抽象方法的也可以聲明為抽象類抽象類不能被實(shí)例化抽象類是需要被繼承的,子類:1.重寫(xiě)父類的所有抽象類(常見(jiàn))2.也聲明為抽象類(一般不這么做)抽象類的意義1.父類的意義: 封裝子類共有的屬性和行為 為子類提供了一種統(tǒng)一的類型 2.可以包含抽象方法,為所有子類提供統(tǒng)一入口 每個(gè)子類具體實(shí)現(xiàn)不同接口:引用數(shù)據(jù)類型可當(dāng)成一個(gè)父類1.是一個(gè)標(biāo)準(zhǔn)、規(guī)范 遵守標(biāo)準(zhǔn)就能干某件事2.由interface定義3.接口中只能包含常量和抽象方法4.接口不能被實(shí)例化5.接口是需要被實(shí)現(xiàn)的 實(shí)現(xiàn)類必須重寫(xiě)接口中的所有抽象方法6.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口 又繼承又實(shí)現(xiàn)時(shí),必須先繼承后實(shí)現(xiàn)7.接口可以繼承接口同類型之間用繼承不同類型之間用實(shí)現(xiàn)設(shè)計(jì)原則:將公共的屬性和行為抽到父類中所有子類的行為都一樣普通方法所有子類的行為不一樣抽象方法符合既是也是原則時(shí),使用接口多態(tài):多種形態(tài)意義: 1.同一類型的引用指向不同的對(duì)象時(shí),有不同的實(shí)現(xiàn) 2.同一個(gè)對(duì)象被造型為不同的類型時(shí),具備不同的功能3.向上造型:能造型成的類型為父類、實(shí)現(xiàn)的接口4.強(qiáng)制類型轉(zhuǎn)換,成功的條件: 1.引用所指向的對(duì)象,就是該類型 2.引用所指向的對(duì)象實(shí)現(xiàn)了該接口 若違背如上兩個(gè)條件,則發(fā)生轉(zhuǎn)換異常ClassCastException建議強(qiáng)轉(zhuǎn)之前通過(guò)instanceof來(lái)判斷,instanceof為true則可強(qiáng)轉(zhuǎn)成員內(nèi)部類1.類中套類,里面的叫內(nèi)部類,外面的叫外部類2.內(nèi)部類通常只服務(wù)于外部類,對(duì)外不具備可見(jiàn)性的3.內(nèi)部類對(duì)象通常只在外部類中創(chuàng)建4.內(nèi)部類中可以直接訪問(wèn)外部類的成員(包括私有的)內(nèi)部類中有一個(gè)隱式的引用指向創(chuàng)建它的外部類對(duì)象外部類名.this.成員變量匿名內(nèi)部類1.想創(chuàng)建一個(gè)類的對(duì)象,對(duì)象創(chuàng)建后,類的意義就不存在了,此時(shí)該類不必命名,稱之為匿名內(nèi)部類2.匿名內(nèi)部類中若想訪問(wèn)外部的變量,變量必須是final的面向?qū)ο笕筇攸c(diǎn)1)封裝:1.1)類:封裝的是對(duì)象的屬性和行為1.2)方法:封裝的是功能的具體的實(shí)現(xiàn)1.3)訪問(wèn)修飾符:封裝的是訪問(wèn)的權(quán)限2)繼承:2.1)減少代碼重復(fù),有利于代碼的重用2.2)父類/基類:所有子類所共有的子類/派生類:子類所特有的2.3)一旦子類繼承的父類,子具有:父+子3)多態(tài):3.1)意義:行為的多態(tài)、對(duì)象的多態(tài)3.2)向上造型、強(qiáng)制類型轉(zhuǎn)換、instanceof3.3)多態(tài)后,代碼擴(kuò)展性、維護(hù)性好3.4)多態(tài)的表現(xiàn)形式:重寫(xiě)與重載【API】字符串字符串是不變對(duì)象,意思是:一旦字符串對(duì)象創(chuàng)建后,其表示的字符串內(nèi)容是不可變的,一旦變化內(nèi)容一定會(huì)創(chuàng)建新對(duì)象。使用字面量創(chuàng)建的字符串對(duì)象會(huì)存入常量池進(jìn)行緩存。若再次使用該字面量創(chuàng)建新字符串時(shí).不會(huì)再創(chuàng)建新對(duì)象,而是直接引用之前創(chuàng)建的對(duì)象。當(dāng)一個(gè)計(jì)算表達(dá)式的運(yùn)算符兩邊都是字面量時(shí),編譯器在編譯源程序時(shí),會(huì)對(duì)其優(yōu)化,會(huì)直接運(yùn)算,并將結(jié)果編譯到.class文件中。length用于數(shù)組,length()用于字符串和文件,size()用于集合intlength()返回當(dāng)前字符串的字符個(gè)數(shù)EX:System.out.println(s1.length());intindexOf(Stringstr)該方法的作用是查看給定字符串在當(dāng)前字符串中的位置,若不存在則返回-1EX:intindex=str.indexOf("can");重載的方法可在指定位置處開(kāi)始查找最后一次出現(xiàn)給定字符串的位置EX:index=str.lastIndexOf("can");Stringsubstring(intstart,intend)截取當(dāng)前字符串指定范圍內(nèi)的字符串javaAPI中通常用2個(gè)數(shù)字表示范圍式,都是含頭不含尾EX:Stringsub=str.substring(5,8);Stringtrim()去除當(dāng)前字符串兩邊的空白字符,無(wú)論多少charcharAt(intindex)返回指定位置對(duì)應(yīng)的字符EX:charc=name.charAt(i);//返回字符串i位置的字符booleanstartsWith(Stringstr)判斷當(dāng)前字符串是否是以給定字符串開(kāi)始的EX:booleanstarts=str.startsWith("th");booleanendsWith(Stringstr)判斷當(dāng)前字符串是否是以給定字符串結(jié)束的EX:booleanends=str.endsWith("ava");StringtoUpperCase()StringtoLowerCase()將當(dāng)前字符串中的英文轉(zhuǎn)換為全大寫(xiě)或全小寫(xiě)String提供了一套靜態(tài)方法valueOf()多種重載,但作用都是將給定的參數(shù)內(nèi)容轉(zhuǎn)換為字符串常用的是將基本類型轉(zhuǎn)換為字符串EX:Stringstr=String.valueOf(i);//將其他類型數(shù)據(jù)轉(zhuǎn)換為字符串型其他類型轉(zhuǎn)換為字符串型:valueOf()字符串型轉(zhuǎn)為其他類型:intValue()以int型為例字符串拼接導(dǎo)致的性能問(wèn)題StringBuilder用于修改字符串內(nèi)容使用的類該類內(nèi)部維護(hù)一個(gè)可變的字符序列提供了編輯字符串內(nèi)容的相關(guān)方法:增,刪,改,插StringBuilderappend(Stringstr)在當(dāng)前字符串末尾追加指定內(nèi)容,相當(dāng)于C語(yǔ)言的strcat()StringBuilderreplace(intstart,intend,Stringstr)將當(dāng)前字符串中指定范圍內(nèi)的字符串替換為給定的內(nèi)容StirngBuilderdelete(intstart,intend)刪除當(dāng)前字符串中指定范圍內(nèi)的字符串StringBuilderinsert(intindxe,Stringstr)在指定位置插入指定內(nèi)容,原位置及后續(xù)內(nèi)容順序向后移動(dòng)。StringBuilderreverse()反轉(zhuǎn)字符串EX:StringBuilderbuf=newStringBuilder("ProgrammingLanguage:");buf.append("Ibm").append("Java")//在字符串后面追加字符串.insert(3,"Oracle")//在指定位置插入字符串.replace(9,13,"JAVA")//將9-13位之間的字符替換為JAVA .delete(13,17)//刪除13-17位之間的字符串 .reverse();//反轉(zhuǎn)字符串文檔文檔注釋可以聲明在類,方法,常量上java提供了一個(gè)命令:javadoc可以通過(guò)對(duì)文檔注釋的讀取自動(dòng)生成該類對(duì)應(yīng)的一個(gè)API文檔@authorAdministrator 作者@version1.02016/01/21 版本@seejava.lang.String 參見(jiàn)@sinceJDK5.0 支持JDK的最低版本@param 參數(shù)@return 返回值正則表達(dá)式用一組特殊的字符組成的一個(gè)字符串,該字符串描述了一種格式正則表達(dá)式的作用是使用該格式驗(yàn)證指定字符串內(nèi)容書(shū)法滿足該格式要求"."點(diǎn),在正則表達(dá)式中表示任意一個(gè)字符\d:表示任意一個(gè)數(shù)字\w:表示任意一個(gè)單詞字符(只能是數(shù)字,字母,下劃線)\s:表示任意一個(gè)空白字符(\t\r\n\f\x0B)\D:表示任意一個(gè)非數(shù)字字符\W:表示任意一個(gè)非單詞字符\S:表示任意一個(gè)非空白字符"+":表示內(nèi)容可以連續(xù)出現(xiàn)至少1次以上"*":表示內(nèi)容出現(xiàn)0-若干次"?":表示內(nèi)容出現(xiàn)0-1次{n}:表示內(nèi)容必須出現(xiàn)n次{n,m}:表示內(nèi)容出現(xiàn)n-m次{n,}:表示內(nèi)容出現(xiàn)至少n次()可以將內(nèi)容看做一個(gè)整體通過(guò)在正則表達(dá)式的開(kāi)始添加"^"以及末尾添加"$"來(lái)表示一個(gè)整體booleanmatches(Stringregex)String提供的該方法用于使用給定的正則表達(dá)式來(lái)驗(yàn)證當(dāng)前字符串是否滿足格式要求,滿足則返回trueEX:Stringregex1="[a-z]";//a-z之內(nèi)所有字符//判斷a是否符合regex1的要求System.out.println("a".matches(regex1));郵箱的正則表達(dá)式:[\w]+@[\w]+(\.[\w]+)+Stirng[]split(Stringregex)使用給定的正則表達(dá)式,將當(dāng)前字符串中按照滿足正則表達(dá)式的部分進(jìn)行拆分,獲取剩下的每部分內(nèi)容EX:Stringstr="javacppphpc#objective-c";//按空字符所在位置將字符串拆分為字符串?dāng)?shù)組,并將空字符刪除String[]strArr=str.split("\\s");StringreplaceAll(Stirngregex,Stringstr)將當(dāng)前字符串中滿足正則表達(dá)式的部分替換為給定的字符串,相當(dāng)于replace升級(jí)版EX://將字符串中的所有數(shù)字替換為“數(shù)字”二字Stringstr="abc123bcd45ef6g7890";str=str.replaceAll("\\d+","數(shù)字");//replace升級(jí)版正則表達(dá)式的\轉(zhuǎn)意與java的\轉(zhuǎn)意有一定沖突,因此需要將\再轉(zhuǎn)意才能變?yōu)檎齽t表達(dá)式的轉(zhuǎn)意\若不重寫(xiě)toString方法,則調(diào)用的是Object提供的輸出格式為類名@地址println方法輸出的是給定對(duì)象toString方法返回的字符串隱式調(diào)用引用類型與字符串連接時(shí),會(huì)先調(diào)用該對(duì)象toString方法,將返回的字符串與該字符串連接當(dāng)一個(gè)類的toString方法被使用,那么該類就應(yīng)當(dāng)重寫(xiě)toString方法返回的字符串格式?jīng)]有要求,結(jié)合實(shí)際需求而定但原則上應(yīng)當(dāng)包含當(dāng)前類需要關(guān)心的屬性信息javaAPI中的類基本都重寫(xiě)了toString方法equals方法用于比較兩個(gè)對(duì)象內(nèi)容是否相同若沒(méi)重寫(xiě),Object提供的比較方式就是使用的"=="所以若使用該方法,就應(yīng)當(dāng)結(jié)合需求重寫(xiě)equals方法同樣的javaAPI中的大部分類都重寫(xiě)了equals包裝類:用于解決基本類型不能參與面向?qū)ο蟮膯?wèn)題數(shù)字類型的包裝類都繼承自Number,Number定義了幾個(gè)抽象方法,允許擋墻包裝類表示的數(shù)字可以以任何數(shù)字的基本類型返回但是從大的向小的轉(zhuǎn)換時(shí)可能丟失精度數(shù)字類型包裝類支持兩個(gè)常量MAX_VALUEMIN_VALUE用于標(biāo)示對(duì)應(yīng)的基本類型的取值范圍包裝類支持一個(gè)靜態(tài)方法,可以將字符串轉(zhuǎn)換為對(duì)應(yīng)的基本類型,前提是該字符串能正確描述基本類型可以表示的值。EX:Stringstr="123";inti=Integer.parseInt(str);JDK5.0之后推出了一個(gè)新特性:自動(dòng)拆裝箱有自動(dòng)拆裝箱特性后,允許我們?cè)诰帉?xiě)源代碼時(shí)基本類型與對(duì)應(yīng)的包裝類混用,而不需要關(guān)心之間的互轉(zhuǎn)自動(dòng)拆裝箱是編譯器認(rèn)可的而非虛擬機(jī)認(rèn)可編譯器在編譯代碼時(shí)會(huì)自動(dòng)補(bǔ)全代碼進(jìn)行兩者見(jiàn)的轉(zhuǎn)換工作觸發(fā)自動(dòng)裝箱,class文件中:Integerin=Integer.valueOf(1);//基本類型轉(zhuǎn)換成字符串型觸發(fā)自動(dòng)拆箱,class文件中:i=Value();//字符串型轉(zhuǎn)換成基本類型時(shí)間相關(guān)APIjava.util.Date每一個(gè)Date實(shí)例都可以表示一個(gè)具體的時(shí)間點(diǎn)Date內(nèi)部維護(hù)一個(gè)long值,該值表示的是從1970年元旦到該Date表示的時(shí)間之間所經(jīng)過(guò)的毫秒差Date由于設(shè)計(jì)存在缺陷所以不使用它進(jìn)行時(shí)間方面的操作,僅用于表示一個(gè)時(shí)間EX:Datenow=newDate();//獲取當(dāng)前系統(tǒng)時(shí)間longtime=now.getTime();//獲取當(dāng)前系統(tǒng)時(shí)間的毫秒值,相當(dāng)于System.currentTimeMillis()now.setTime(1000);//設(shè)置要顯示的時(shí)間,1970年元旦加上參數(shù)毫秒java.text.SimpleDateFormat該類可以根據(jù)指定的日期格式,在Date與String之間進(jìn)行相互轉(zhuǎn)換Date→String:formatString→Date:parseEX:SimpleDateFormatsdf=newSimpleDateFormat("yyyy年MM月dd日EHH:mm:ssa");//Date→StringStringstr=sdf.format(now);//將參數(shù)所代表時(shí)間轉(zhuǎn)換為字符串//String→DateStringdateStr="2016年01月23日星期六10:29:21上午";Datedate=sdf.parse(dateStr);java.util.CalendarCalendar是一個(gè)抽象類,規(guī)定了操作時(shí)間的相關(guān)方法常用的實(shí)現(xiàn)類為陽(yáng)歷,即格里高里歷java.util.GregorianCalendarCalendar提供了一個(gè)靜態(tài)方法getInstance該方法可以根據(jù)當(dāng)前系統(tǒng)所在地區(qū)獲取一個(gè)適用的實(shí)現(xiàn)類通常返回的就是GregorianCalendarEX://默認(rèn)創(chuàng)建出來(lái)就表示當(dāng)前系統(tǒng)時(shí)間,無(wú)法直觀反映時(shí)間Calendarcalendar=Calendar.getInstance();Calendar→DategetTime的作用是將當(dāng)前Calendar表示的時(shí)間以Date形式返回EX:Datedate=calendar.getTime();Date→CalendarsetTime的作用是使當(dāng)前Calendar表示給定的Date所表示的時(shí)間EX:calendar.setTime(date);//將calendar設(shè)置為date所表示的時(shí)間通過(guò)Calendar可以獲取對(duì)應(yīng)的時(shí)間分量(時(shí)間單位)的值intget(intfield)獲取給定時(shí)間分量所對(duì)應(yīng)的值,時(shí)間分量應(yīng)當(dāng)使用Calendar提供的常量EX://獲取年intyear=calendar.get(Calendar.YEAR);//獲取月 注意:月從0開(kāi)始因此輸出時(shí)要加1intmonth=calendar.get(Calendar.MONTH);//獲取日跟天相關(guān)的常量 DATE 月中的天 DAY_OF_MONTH 月中的天 DAY_OF_WEEK 星期中的天 1是星期天,2是星期一,以此類推 DAY_OF_YEAR 年中的天Calendar提供了用于對(duì)指定時(shí)間分量設(shè)置值的方法:voidset(intfield,intvalue)EX:calendar.set(Calendar.YEAR,2008);//設(shè)置年calendar.set(Calendar.MONTH,Calendar.AUGUST);//設(shè)置為8月獲取給定時(shí)間分量所允許的最大值,參照日期為當(dāng)前Calendar所表示的日期EX:獲取當(dāng)前Calendar所表示的年份的總天數(shù)intday=calendar.getActualMaximum(Calendar.DAY_OF_YEAR);Calendar提供了用于計(jì)算時(shí)間的方法:voidadd(intfield,intvalue)對(duì)指定的時(shí)間分量累加指定的值EX://3年以后的時(shí)間calendar.add(Calendar.YEAR,3);時(shí)間計(jì)算的流程:用戶輸入一個(gè)日期,經(jīng)過(guò)計(jì)算后得出結(jié)果,再顯示給用戶String| SimpleDateFormat.parse()↓Date| 1:Calendar.getInstance()獲取系統(tǒng)時(shí)間| 2:calendar.steTime(date)↓Calendar| 通過(guò)Calendar進(jìn)行一系列時(shí)間操作| 使得Calendar表示最終計(jì)算后的日期↓Calendar目標(biāo)時(shí)間| 通過(guò)Calendar.getTime()↓Date| SimpleDateFormat.format()↓Stringjava.util.Collection集合,用于保存一組元素,提供了維護(hù)集合元素的相關(guān)方法相對(duì)數(shù)組而言,操作簡(jiǎn)便Collection接口定義了所有集合都具有的方法Collection派生了兩個(gè)子接口:List:可重復(fù)集,且有序(可以通過(guò)下標(biāo)操作元素)Set:不可重復(fù)集元素是否重復(fù)的判定標(biāo)準(zhǔn)是參照元素自身equals比較的結(jié)果集合存放的是元素的引用boolenaadd(Ee)向集合中添加給定元素,若成功則返回trueEX:c.add("one");intsize()返回當(dāng)前集合中的元素?cái)?shù)量EX:System.out.println(c.size());booleanisEmpty()查看當(dāng)前集合是否是空的voidclear()清空集合booleancontains(Ee)判斷當(dāng)前集合是否包含給定元素是依據(jù)元素的equals比較的結(jié)果EX:booleancontains=c.contains(p);刪除集合元素boolenaremove(Ee)從集合中刪除給定元素,成功刪除則返回true,否則返回false刪除的是集合中第一個(gè)與給定元素equals比較為true的元素EX:c.remove(p);//刪除的是集合中第一個(gè)與p進(jìn)行equals比較為true的元素集合的批量操作booleanaddAll(Collectionc)將給定集合中的所有元素添加到當(dāng)前集合中方法調(diào)用完畢后當(dāng)前集合元素只要數(shù)量上產(chǎn)生了變化就返回truebooleancintainsAll(Collectionc)判斷當(dāng)前集合是否包含給定集合中的所有元素遍歷集合由于List與Set集合的實(shí)現(xiàn)有差異,集合提供了統(tǒng)一的遍歷集合方式:迭代器Iterator是一個(gè)接口僅規(guī)定了遍歷集合應(yīng)有的方法并沒(méi)有給出具體實(shí)現(xiàn),不同的集合自行實(shí)現(xiàn)該接口.遍歷集合時(shí),無(wú)需記住每一種集合提供的具體迭代器的名字,僅依靠多態(tài)將他們看做Iterator使用即可.使用迭代器遍歷集合的方式是統(tǒng)一的,應(yīng)當(dāng)遵循問(wèn),取,刪的過(guò)程其中刪除不是必須操作Iteratoriterator()獲取用于遍歷當(dāng)前迭代器的實(shí)現(xiàn)類Iteratorit=c.iterator();//c是一個(gè)集合booleanhasNext()問(wèn)的過(guò)程,通過(guò)迭代器判斷集合是否還有元素可以取出while(it.hasNext())Enext()取的過(guò)程,通過(guò)迭代器將集合中該元素取出Objectobj=it.next();使用迭代器遍歷集合的過(guò)程中,不能通過(guò)集合的方法改變?cè)財(cái)?shù)量迭代器的remove刪除的是通過(guò)next方法取出的元素增強(qiáng)for循環(huán)也叫做新循環(huán),foreach新循環(huán)是在JDK1.5以后推出的特性.新循環(huán)只用來(lái)遍歷集合或數(shù)組使用新循環(huán)并非新語(yǔ)法,而是編譯器認(rèn)可。編譯器在遇到使用新循環(huán)遍歷集合時(shí),會(huì)將新循環(huán)改為迭代器模式。所以,使用新循環(huán)遍歷集合的過(guò)程中也不能通過(guò)集合的方法刪除元素EX:for(Stringstr:arr)//用于接收每個(gè)元素的變量 要遍歷的數(shù)組泛型包裝類的實(shí)際類型指定必須是引用類型泛型的實(shí)際類型是Object,當(dāng)應(yīng)用時(shí)不指定泛型的實(shí)際類型時(shí),就使用默認(rèn)的ObjectList集合List是可重復(fù)集,且有序特點(diǎn)是:可以通過(guò)下標(biāo)操作元素常用的實(shí)現(xiàn)類:ArrayList:內(nèi)部就是一個(gè)數(shù)組LinkedList:內(nèi)部是一個(gè)鏈表由于內(nèi)部實(shí)現(xiàn)原理不同,ArrayList適合查詢,增刪元素慢一些LinkedList增刪快,但查詢慢一些Eget(intindex) 獲取指定下標(biāo)對(duì)應(yīng)的元素 Eset(intindex,Eelement) 將指定元素設(shè)置到指定位置上,返回值為原位置對(duì)應(yīng)的元素,所以是替換元素操作List提供了一對(duì)重載的add與remove方法voidadd(intindex,Eelement)將給定元素插入到指定位置,原位置及后續(xù)元素順序向后移動(dòng),相當(dāng)于String的insert方法Eremove(intindex)刪除并返回指定位置的元素List提供了一個(gè)可以獲取指定范圍內(nèi)子集的方法:ListsubList(intstart,intend)對(duì)子集的操作就是對(duì)原集合該范圍內(nèi)的元素的操作集合轉(zhuǎn)換為數(shù)組String[]str=c.toArray(newString[c.size()]);//c是一個(gè)集合newString[c.size()]中的長(zhǎng)度可以隨意,但new的類型必須和集合的類型一致toArray先判斷new的類型是否和集合類型一致,如果一致再判斷數(shù)組長(zhǎng)度是否足夠,如果不足夠則自動(dòng)創(chuàng)建一個(gè)相同類型的足夠長(zhǎng)度的數(shù)組數(shù)組轉(zhuǎn)換為集合需要注意,只能轉(zhuǎn)換為L(zhǎng)ist集合原因在于Set集合不允許存放重復(fù)元素使用數(shù)組的工具類Arrays的靜態(tài)方法asList()實(shí)現(xiàn)List<String>list=Arrays.asList(array);//array是數(shù)組名但對(duì)于基本數(shù)據(jù)類型的數(shù)組支持并不好,當(dāng)數(shù)組是基本數(shù)據(jù)類型時(shí)不建議使用當(dāng)使用asList()方法時(shí),數(shù)組就和列表鏈接在一起了。當(dāng)更新其中之一時(shí),另一個(gè)將自動(dòng)獲得更新,基本數(shù)據(jù)類型數(shù)組不具備該特性所有集合都支持一個(gè)傳入另一個(gè)集合的構(gòu)造方法,那么通過(guò)該構(gòu)造方法創(chuàng)建出來(lái)的集合中會(huì)包含給定集合中的所有元素。List<String>list1=newArrayList<String>(list);相當(dāng)于List<String>list1=newArrayList<String>();list1.addAll(list);兩句集合的工具類CollectionsCollections.sort(list);用于對(duì)集合進(jìn)行升序排序,僅限于List集合Collection是集合的接口Collections是集合的工具類,提供多種靜態(tài)方法來(lái)操作集合自定義類型集合排序①若想通過(guò)sort方法對(duì)自定義類型的集合進(jìn)行排序,前提是元素必須實(shí)現(xiàn)Comparable接口,并重寫(xiě)抽象方法compareTo方法并定義比較大小的規(guī)則②publicintcompareTo(Pointo){ return(this.x*this.x+this.y*this.y)-(o.x*o.x+o.y*o.y);}//重寫(xiě)compareTo方法來(lái)對(duì)坐標(biāo)進(jìn)行排序該方法用于判斷當(dāng)前對(duì)象(this)與參數(shù)對(duì)象o的大小返回值表示哪個(gè)對(duì)象大或小,返回值不關(guān)注具體的值,只關(guān)注取值范圍:當(dāng)返回值>0:當(dāng)前對(duì)象比參數(shù)對(duì)象大當(dāng)返回值<0:當(dāng)前對(duì)象比參數(shù)對(duì)象小當(dāng)返回值=0:兩個(gè)對(duì)象相等③sort方法要求元素必須實(shí)現(xiàn)Comparable接口,當(dāng)我們使用某個(gè)功能時(shí),該功能要求我們的代碼為其改變那么就稱為該功能對(duì)我們的代碼有侵入性,改的代碼越多,侵入性越大侵入性大對(duì)代碼后期維護(hù)和擴(kuò)展不利一旦Java類實(shí)現(xiàn)了Comparable,其比較邏輯就已經(jīng)確定;如果希望在排序的操作中臨時(shí)指定比較規(guī)則,可以采用Comparator接口創(chuàng)建匿名內(nèi)部類的方式來(lái)創(chuàng)建一個(gè)比較器。該接口要求實(shí)現(xiàn)類必須重寫(xiě)其定義的方法:intcompare(To1,To2)EX:建立匿名內(nèi)部類,com作為sort的第二個(gè)參數(shù)用以提供排序依據(jù)//創(chuàng)建比較器Comparator<String>com=newComparator<String>(){ publicintcompare(Stringo1,Stringo2) { returno1.length()-o2.length(); }};Collections.sort(list,com);若o1>o2則返回值應(yīng)>0,若o1<o2則返回值應(yīng)<0,若o1==o2則返回值應(yīng)為0重載的sort方法要求傳入比較器,然后利用比較器對(duì)元素進(jìn)行比較后進(jìn)行自然排序。該方法比較常用:1.不要求元素實(shí)現(xiàn)接口,減小侵入2.當(dāng)元素自身含有比較方法,但不滿足排序需求時(shí),也可以提供額外的比較器進(jìn)行排序。list=Collections.synchronizedList(list);set=Collections.synchronizedSet(set);map=Collections.synchronizedMap(map);將集合轉(zhuǎn)換成線程安全的隊(duì)列和棧java.util.Queue隊(duì)列,用于存儲(chǔ)一組元素,但是存取元素必須遵循先進(jìn)先出原則。由于LinkedList可以存放一組元素,并且首尾增刪元素效率高,所以其滿足隊(duì)列的特點(diǎn)。因此,LinkedList也實(shí)現(xiàn)了隊(duì)列接口Queue保存了集合的一些基本操作:add,removebooleanoffer(Ee)向隊(duì)列末尾追加新元素Offer通過(guò)返回false的方式檢查添加元素失敗,而add通過(guò)拋異常來(lái)檢查Epoll()獲取隊(duì)首元素,并將該元素從隊(duì)列中刪除,出隊(duì)操作在隊(duì)列為空時(shí),remove()方法拋出一個(gè)異常,而poll()方法則返回null。Epeek()引用隊(duì)首元素,并不刪除該元素,若隊(duì)列為空,則返回null棧存儲(chǔ)一組元素,存取必須遵循先進(jìn)后出原則,使用棧一般是為了實(shí)現(xiàn)后退功能Epush()入棧操作Epop();獲取棧頂元素,并將該元素從棧中刪除,出棧操作java.util.MapMap:查找表存放元素是以key-value對(duì)的形式存放其中key不允許重復(fù)(key的equals比較不能為true)Map看起來(lái)更像是一個(gè)多行兩列的表格常用的實(shí)現(xiàn)類:HashMap(散列表),無(wú)序的LinkedHashMap可以使輸入順序與輸出順序一致Vput(Kk,Vv)將給定的key-value對(duì)存入到Map中由于Key不允許重復(fù),所以,若使用Map中已經(jīng)存在的Key存放新元素時(shí),擇善替換value操作,會(huì)將這個(gè)Key對(duì)應(yīng)的原有Value值返回。若是一個(gè)新的Key,則返回值為NULLEX:map.put("語(yǔ)文",98);替換value建議不要用基本類型接收put返回的值,容易造成空指針異常,應(yīng)該使用包裝類接收EX:Integernum=map.put("語(yǔ)文",94);//接收的是原來(lái)的值98集合添加元素用add,隊(duì)列用offer,棧用push,Map(查找表)用putVget(Kk)獲取指定key對(duì)應(yīng)的value,若指定的key在Map中不存在,則返回值為nullEX:num=map.get("數(shù)學(xué)");//找到key"數(shù)學(xué)",返回對(duì)應(yīng)的valueVremove(Kk)刪除給定的key對(duì)應(yīng)的key-value對(duì),返回值為被刪除記錄對(duì)應(yīng)的valueEX:num=map.remove("語(yǔ)文");booleancontainsKey(Objectkey)檢測(cè)當(dāng)前Map中是否包含給定的key,若包含則返回true遍歷Map遍歷Map有三種方式:1.遍歷所有的keySet<K>keySet()將當(dāng)前Map中所有的key存入到一個(gè)Set集合中,然后返回EX:Set<String>keySet=map.keySet();2.遍歷每一組鍵值對(duì)Set<Entry<K,V>>entrySet()在Map中每一組鍵值對(duì)是以一個(gè)Entry的實(shí)例保存的該類有兩個(gè)屬性分別保存key和valueEX:Set<Entry<String,Integer>>entrySet=map1.entrySet();每一個(gè)Entry實(shí)例表示Map中一組鍵值對(duì),可以通過(guò)getKey和getValue兩個(gè)方法用來(lái)獲取key與valueEX:System.out.println(e.getKey()+":"+e.getValue());3.遍歷所有的value(不常用)Collection<V>values()獲取所有的valueEX:Collection<Integer>values=map.values();HashMap原理:當(dāng)我們向HashMap中存入一組鍵值對(duì)時(shí),HashMap首先獲取key這個(gè)對(duì)象的hashcode()方法的返回值,然后使用該值進(jìn)行一個(gè)散列算法,得出一個(gè)數(shù)字,這個(gè)數(shù)字就是這組鍵值對(duì)要存入散列數(shù)組中的下標(biāo)位置。作為HashMap中的key類hashcode方法與equals方法的重寫(xiě)要注意,因?yàn)檫@兩個(gè)方法的結(jié)果直接影響散列表的性能。這兩個(gè)方法是在Object中定義的,API文檔中對(duì)這兩個(gè)方法的重寫(xiě)做了說(shuō)明:1.每當(dāng)我們重寫(xiě)一個(gè)類的equals方法時(shí),就應(yīng)當(dāng)連同重寫(xiě)hashcode2.hashcode返回的數(shù)字應(yīng)該是穩(wěn)定的,意思是說(shuō)當(dāng)參與equals比較的屬性的值沒(méi)有發(fā)生改變的前提下,多次調(diào)用hashcode返回的數(shù)字應(yīng)當(dāng)相同3.hashcode的值應(yīng)當(dāng)與equals的結(jié)果相對(duì)應(yīng):兩個(gè)對(duì)象若equals比較為true,hashcode值應(yīng)當(dāng)相同。兩個(gè)對(duì)象equals比較結(jié)果為false,hashcode值最好不同。若依然相同,那么作為key存入HashMap中時(shí)會(huì)產(chǎn)生鏈表情況,影響HashMap查詢性能文件java.io.FileFile的每一個(gè)實(shí)例用于表示操作系統(tǒng)中文件系統(tǒng)里的一個(gè)文件或目錄通過(guò)File可以:訪問(wèn)文件或目錄的屬性(文件名,大小等信息)操作文件或目錄(創(chuàng)建,刪除)訪問(wèn)目錄中的子項(xiàng)不可以:不能通過(guò)File訪問(wèn)文件的數(shù)據(jù)在使用路徑時(shí),不要使用絕對(duì)路徑,因?yàn)榇嬖谄脚_(tái)差異性。應(yīng)當(dāng)使用相對(duì)路徑:常見(jiàn)的相對(duì)路徑:1.類路徑classpath2.當(dāng)前目錄,在eclipse中當(dāng)前目錄指的是當(dāng)前項(xiàng)目的根目錄.代表當(dāng)前根目錄File.separator是一個(gè)常量,表示文件的層級(jí)分隔符/,會(huì)顯示與當(dāng)前系統(tǒng)相匹配的分隔符EX:Filefile=newFile("."+File.separator+"test.txt");Stringname=file.getName();//獲取文件名longlength=file.length();//獲取文件的大小(單位為字節(jié))file.isFile()//判斷是否是文件file.isDirectory()//判斷是否是目錄 file.isHidden();//判斷是否是隱藏的file.canRead();//判讀是否可讀file.canWrite();//判斷是否可寫(xiě)longtime=file.lastModified();//文件的最后修改時(shí)間booleanexists()//判斷當(dāng)前File表示文件或目錄是否真實(shí)存在file.createNewFile();//創(chuàng)建文件,需要拋出異常file.delete();//刪除文件,和刪除目錄一樣,但只有空目錄才能刪除dir.mkdir();//創(chuàng)建目錄dir.mkdirs();//創(chuàng)建多層目錄,會(huì)自動(dòng)創(chuàng)建所有不存在的父目錄File[]subs=dir.listFiles();//獲取當(dāng)前目錄中所有子項(xiàng)File[]listFiles(FileFilterfilter)//獲取當(dāng)前目錄中滿足給定過(guò)濾器條件的子項(xiàng),一般用匿名內(nèi)部類創(chuàng)建,需要重寫(xiě)accept方法EX:FileFilterfilter=newFileFilter()//創(chuàng)建過(guò)濾器{publicbooleanaccept(Filefile)//返回過(guò)濾結(jié)果 { System.out.println("正在過(guò)濾:"+file.getName()); returnfile.isFile();//得到目錄下所有文件 }//endofaccept}; File[]subs=dir.listFiles(filter);//獲取所有滿足過(guò)濾條件的子目錄java.io.RandomAccessFile該類用于讀寫(xiě)文件數(shù)據(jù)該類讀寫(xiě)文件數(shù)據(jù)是基于指針的有兩種常見(jiàn)的創(chuàng)建模式:r只讀模式:僅對(duì)文件進(jìn)行讀取工作rw讀寫(xiě)模式:可以對(duì)文件數(shù)據(jù)進(jìn)行編輯voidwrite(intd)向文件中寫(xiě)出1個(gè)字節(jié),寫(xiě)的是給定的int值對(duì)應(yīng)的2進(jìn)制中的低八位EX:raf.write(1);voidwrite(byte[]data)將給定的字節(jié)數(shù)組中的所有字節(jié)一次性寫(xiě)出voidwrite(byte[]data,intoffset,intlen)將給定的字節(jié)數(shù)組中從下標(biāo)為offset處開(kāi)始的連續(xù)len個(gè)字節(jié)寫(xiě)出intread()讀取一個(gè)字節(jié),并將該字節(jié)以int形式返回返回的int值應(yīng)當(dāng)只有低八位有效。若返回值為-1則表示讀取到了文件末尾:EOF(endoffile)EX:intd=raf.read();intread(byet[]data)一次性讀取給定的字節(jié)數(shù)組總長(zhǎng)度的字節(jié)量,并將讀取的這些字節(jié)存入到該數(shù)組中。返回值為實(shí)際讀取到的字節(jié)量,若返回值為-1,則表示讀取到了文件末尾。longpos=raf.getFilePointer();//獲取當(dāng)前RandomAccessFile指針位置raf.writeInt(max);//一次寫(xiě)出一個(gè)int值writeLong(123L)//一次寫(xiě)出一個(gè)long值writeDouble(123.123)//一次寫(xiě)出一個(gè)doubie值voidseek(longpos)將指針移動(dòng)到相對(duì)于文件開(kāi)頭pos個(gè)字節(jié)的指定位置inti=raf.readInt();一次讀取一個(gè)int值流輸入是讀,輸出是寫(xiě)流根據(jù)方向分為輸入流與輸出流,其中輸入流用來(lái)讀取,輸出流用來(lái)寫(xiě)出流分為節(jié)點(diǎn)流(低級(jí)流),處理流(高級(jí)流)節(jié)點(diǎn)流:真實(shí)搬運(yùn)數(shù)據(jù)的流,數(shù)據(jù)來(lái)源與去向明確處理流:不能獨(dú)立存在,需要處理另一個(gè)流,使用處理流的目的是簡(jiǎn)化讀寫(xiě)操作基本流java.io.FileOutputStream()文件字節(jié)輸出流,是一個(gè)低級(jí)流,用于將字節(jié)寫(xiě)入到文件中默認(rèn)創(chuàng)建出來(lái)的FileOutputStream是覆蓋模式:會(huì)先將數(shù)據(jù)全部刪除后再開(kāi)始寫(xiě)入新內(nèi)容追加模式,F(xiàn)OS支持在當(dāng)前文件末尾追加寫(xiě)操作FileOutputStream(Stringstr,booleanappend)FileOutputStream(Filefile,booleanappend)byte[]getBytes()//將字符串按系統(tǒng)默認(rèn)字符集轉(zhuǎn)換為字節(jié)數(shù)組byte[]getBytes(StringcharsetName)按照指定的字符集(編碼)進(jìn)行轉(zhuǎn)換常用字符集:GBK:英文1個(gè)字節(jié),中文2個(gè)字節(jié)UTF-8:英文1個(gè)字節(jié),中文3個(gè)字節(jié)ISO8859-1:歐洲的編碼,英文1個(gè)字節(jié),不支持中文fos.write(data);//將data字節(jié)數(shù)組寫(xiě)入文件java.io.FileInputStream()文件字節(jié)輸入流,是一個(gè)低級(jí)流,用于將字節(jié)讀取到文件中字符串的構(gòu)造方法支持將字節(jié)轉(zhuǎn)換回字符串String(byte[]data)將字節(jié)數(shù)組中所有字節(jié)按照系統(tǒng)默認(rèn)字符集轉(zhuǎn)換為字符串 String(byte[]data,Stringcharsetname)按照指定的字符集轉(zhuǎn)換 String(byte[]data,intoffset,intlen)將給定的字節(jié)數(shù)組中從offset處開(kāi)始的連續(xù)len個(gè)字節(jié)按照當(dāng)前系統(tǒng)默認(rèn)的字符集轉(zhuǎn)換為字符串 String(byte[]data,intoffset,intlen,StringcharsetName)按照指定的字符集轉(zhuǎn)換EX:Stringstr=newString(buf,0,len,"utf-8");緩沖流java.io.BufferedInputStreamBIS內(nèi)部維護(hù)著一個(gè)緩沖區(qū)(字節(jié)數(shù)組),當(dāng)我們調(diào)用read()方法讀取一個(gè)字節(jié)時(shí),BIS會(huì)一次性讀取若干字節(jié)并存入到內(nèi)部的字節(jié)數(shù)組中緩存,然后將第一個(gè)字節(jié)返回。當(dāng)我們?cè)俅握{(diào)用read()方法時(shí),其直接從字節(jié)數(shù)組中將第二個(gè)字節(jié)返回,直到所有字節(jié)都返回。當(dāng)再次調(diào)用read()方法時(shí)才會(huì)再一次性讀取若干字節(jié)存入緩存。所以本質(zhì)上還是通過(guò)提高讀取量減少讀的次數(shù)提高的讀取效率java.io.BufferedOutputStream寫(xiě)出同樣,當(dāng)我們調(diào)用BOS的write方法寫(xiě)出一個(gè)字節(jié)時(shí),BOS會(huì)將該字節(jié)存入內(nèi)部維護(hù)的字節(jié)數(shù)組中,直到該字節(jié)數(shù)組存滿,才會(huì)一次性寫(xiě)出voidflush()//強(qiáng)制將緩沖流中的緩沖區(qū)數(shù)據(jù)全部寫(xiě)出對(duì)象流java.io.ObjectOutputStream 對(duì)象轉(zhuǎn)字節(jié)對(duì)象輸出流,是一個(gè)高級(jí)流,作用是可以將java中任何引用類型實(shí)例轉(zhuǎn)換為一組字節(jié)后寫(xiě)出voidwriteObject(Objecto)OOS獨(dú)有的方法,作用是可以將給定的對(duì)象轉(zhuǎn)換為字節(jié)后寫(xiě)出過(guò)程:1.先將給定的對(duì)象轉(zhuǎn)化為一組字節(jié)2.通過(guò)FOS將這組字節(jié)寫(xiě)入到文件中(硬盤)這兩個(gè)過(guò)程有專業(yè)術(shù)語(yǔ)1.對(duì)象序列化 2.持久化ObjectOutputStream在對(duì)對(duì)象進(jìn)行序列化時(shí),需要該對(duì)象所屬的類實(shí)現(xiàn)Serializable接口。實(shí)現(xiàn)該接口不需要重寫(xiě)任何方法。類中被transient關(guān)鍵字修飾的屬性序列化時(shí)會(huì)被忽略java.io.ObjectInputStream字節(jié)轉(zhuǎn)對(duì)象對(duì)象輸入流,是一個(gè)高級(jí)流,作用是進(jìn)行對(duì)象的反序列化ObjectreadObject()將字節(jié)以對(duì)象形式讀取,需要拋出ClassNotFound異常轉(zhuǎn)換流轉(zhuǎn)換流是一組字符流。字符流都是高級(jí)流,讀寫(xiě)單位為字符。作用是在字符與字節(jié)之間轉(zhuǎn)換。轉(zhuǎn)換流的特點(diǎn):可以按照指定的字符集在字符與字節(jié)間轉(zhuǎn)換java.io.OutputStreamWriter字符轉(zhuǎn)字節(jié)字符輸出流會(huì)自動(dòng)將給定的字符串按照系統(tǒng)默認(rèn)字符集轉(zhuǎn)換為一組字節(jié)后通過(guò)FOS寫(xiě)入到文件中,也可以按照給定的字符集寫(xiě)出字符串EX:OutputStreamWriterosw=newOutputStreamWriter(fos,"UTF-8");java.io.InputStreamReader字節(jié)轉(zhuǎn)字符字符輸入流可以按照指定的字符集將字節(jié)轉(zhuǎn)換為字符后讀取出來(lái),可以指定字符集由于字符流只能讀寫(xiě)文本數(shù)據(jù),所以對(duì)于文件的讀寫(xiě)僅能針對(duì)文本文件進(jìn)行。使用字符流復(fù)制文本文件,它可以在復(fù)制的過(guò)程中轉(zhuǎn)換編碼緩沖字符流java.io.PrintWriter寫(xiě)文件具有自動(dòng)行刷新功能的緩沖字符輸出流快速創(chuàng)建基于文件寫(xiě)操作的PrintWriterPrintWriter(Stringpath)//絕對(duì)路徑PrintWriter(Filefile)//文件名寫(xiě)入方法:pw.println("");當(dāng)PrintWriter是基于一個(gè)流創(chuàng)建時(shí),那么就可以指定是否自動(dòng)行刷新PrintWriter(OutputStreamo,booleanautoFlush)PrintWriter(Writerw,booleanautoFlush)當(dāng)?shù)诙€(gè)參數(shù)為true時(shí),則具備自動(dòng)行刷新,作用:每當(dāng)調(diào)用println方法后會(huì)自動(dòng)執(zhí)行flush().這樣做雖然會(huì)提高寫(xiě)出次數(shù)降低寫(xiě)效率,但是寫(xiě)出的即時(shí)性提高了java.io.BufferedReader讀文件緩沖字符輸入流,特點(diǎn):以行為單位讀取字符串,只能讀取字符流(文本文件)StringreadLine()該方法會(huì)連續(xù)讀取若干字節(jié),直到讀取到換行符為止,然后將換行符之前的所有字符組成一個(gè)字符串返回。換行不會(huì)返回。若返回值為NULL,則是讀取到文件末尾流總結(jié):流都要拋異常除了BufferedReader用readLine來(lái)讀,PrintWrite用println來(lái)寫(xiě)其余流的讀都是read,寫(xiě)都是write。輸入流input(讀)第二參數(shù)輸出流output(寫(xiě))第二參數(shù)基本流FileInputStream用于讀字節(jié)無(wú)FileOutputStream用于寫(xiě)字節(jié)boolean是否是追加模式高級(jí)流緩沖流BufferedInputStream一次讀取若干字節(jié)并存入內(nèi)部的字節(jié)數(shù)組中緩存,返回第一個(gè)字節(jié)int定義緩存區(qū)大小BufferedOutputStream將若干字節(jié)存入字節(jié)數(shù)組直到該字節(jié)數(shù)組存滿,才會(huì)一次性寫(xiě)出int定義緩存區(qū)大小對(duì)象流ObjectInputStream字節(jié)轉(zhuǎn)對(duì)象反序列化voidwriteObject(Objecto)將給定的對(duì)象轉(zhuǎn)換為字節(jié)后寫(xiě)出無(wú)ObjectOutputStream對(duì)象轉(zhuǎn)字節(jié)序列化將java中任何對(duì)象轉(zhuǎn)換為一組字節(jié)后寫(xiě)出ObjectreadObject()將字節(jié)以對(duì)象形式讀取,需要拋出ClassNotFound異常無(wú)轉(zhuǎn)換流InputStreamReader字節(jié)轉(zhuǎn)字符String指定字符集OutputStreamWriter字符轉(zhuǎn)字節(jié)String指定字符集緩沖字符流BufferedReader讀文件StringreadLine()讀取一行,將換行符之前的所有字符組成一個(gè)字符串返回,換行不會(huì)返回若返回值為NULL,則是讀取到文件末尾int指定緩沖區(qū)大小PrintWriter寫(xiě)文件println()方法寫(xiě)出boolean是否自動(dòng)行刷新異常try不可以單獨(dú)出現(xiàn),后面需要跟個(gè)catch或finally,當(dāng)try中某語(yǔ)句出錯(cuò),跳到catch處理完成后,try中出錯(cuò)的語(yǔ)句后面的語(yǔ)句無(wú)法執(zhí)行。try下面可以跟多個(gè)catch,最后一定要加個(gè)catch用以捕獲父類的Exception,以避免因?yàn)椴东@的異常導(dǎo)致中斷異常如果是子父類關(guān)系,則父類必須放最下面結(jié)構(gòu)有些類似if...elseiffinally塊finally必須定義在異常捕獲機(jī)制的最后:1.可以直接跟在try之后2.只能跟在最后一個(gè)catch之后finally可以保證其中的代碼無(wú)論try語(yǔ)句塊中的代碼是否拋出異常都一定會(huì)被執(zhí)行finally常備用來(lái)做諸如釋放資源等操作當(dāng)一個(gè)方法中使用throw拋出某個(gè)異常時(shí),就應(yīng)當(dāng)在方法上使用throws聲明該異常的拋出,以通知調(diào)用者處理異常。只有拋出RuntimeException編譯器不強(qiáng)制要求處理,其他都必須處理,否則編譯不通過(guò)。RuntimeException拋出的都是些常見(jiàn)異常,如空指針異常,下標(biāo)越界異常等處理拋出的異常有兩種方式:1.使用try-cathch自行捕獲并解決2.在當(dāng)前方法上繼續(xù)使用thorws聲明將該異常拋出父類已經(jīng)拋出了異常,子類可以不拋異常、拋出和父類一樣的異常、僅拋出部分異常、拋出父類異常的子類異常,不能拋出額外異常和父類異常e.printStackTrace();//輸出錯(cuò)誤堆棧Stringm=e.getMessage();//獲取消息(一般是出錯(cuò)的相關(guān)事件信息)throw和throws的區(qū)別throw出現(xiàn)在方法體內(nèi),表示拋出了一個(gè)異常實(shí)例,執(zhí)行throw一定會(huì)拋出某種異常。 throws出現(xiàn)在方法聲明后面,表示該方法有出現(xiàn)這類異常的可能性,并不一定會(huì)發(fā)生這些異常線程Thread需要繼承Thread類或者實(shí)現(xiàn)Runnable接口,內(nèi)部都是重寫(xiě)run方法t.start();//啟動(dòng)線程longid=getId();//獲取當(dāng)前線程IdStringname=getName();//獲取當(dāng)前線程名字線程都要重寫(xiě)run方法Thread.currentThread()可以獲取運(yùn)行當(dāng)前代碼片段的線程Thread提供了獲取線程信息的相關(guān)方法:longgetId():返回該線程的標(biāo)識(shí)符StringgetName():返回該線程的名稱intgetPriority():返回線程的優(yōu)先級(jí)setPriority(1); 設(shè)置線程的優(yōu)先級(jí),范圍:1~101最低,10最高Thread.stategetState():獲取線程的狀態(tài)booleanisAlive():測(cè)試線程是否處于活動(dòng)狀態(tài)booleanisDaemon():測(cè)試線程是否為守護(hù)線程booleanisInterrupted():測(cè)試線程是否已經(jīng)中斷Thread.yield();將正在運(yùn)行的線程從Running狀態(tài)讓出CPU,返回到Runnable狀態(tài),其他線程有機(jī)會(huì)運(yùn)行Daemon==守護(hù)線程==后臺(tái)線程Thread.setDaemon(true);//設(shè)為守護(hù)線程守護(hù)線程會(huì)在主線程結(jié)束一段時(shí)間后結(jié)束默認(rèn)線程都是前臺(tái)線程,前臺(tái)線程結(jié)束時(shí),java程序進(jìn)程才結(jié)束setDaemon必須在啟動(dòng)線程之前調(diào)用。注意:不能胡亂設(shè)置后臺(tái)線程,后臺(tái)線程可以被提前結(jié)束。軟件核心邏輯,必須在前臺(tái)線程中。在不明確情況下,全部線程都使用前臺(tái)的。java啟動(dòng)時(shí)至少執(zhí)行一個(gè)前臺(tái)線程,即主線程,主線程會(huì)調(diào)用main方法t.sleep(5000);//讓當(dāng)前線程休眠指定毫秒需要拋出InterruptedEerrupt();//打斷線程的sleept1.join();當(dāng)前線程t2調(diào)用了t1.join,會(huì)等待t1線程完成以后繼續(xù)運(yùn)行t2block(有兩種結(jié)束方式)1、t1結(jié)束,join正常返回,繼續(xù)運(yùn)行2、t2在等待期間,被其他線程所打斷sleep和join的區(qū)別:鎖機(jī)制當(dāng)多個(gè)線程操作同一段資源時(shí)由于線程切換的不確定性,會(huì)導(dǎo)致邏輯出現(xiàn)混亂,嚴(yán)重時(shí)可以導(dǎo)致系統(tǒng)癱瘓,為了避免多個(gè)線程“搶”,應(yīng)當(dāng)讓他們排隊(duì)同步鎖當(dāng)一個(gè)方法被synchronized修飾后,該方法稱為同步方法,多個(gè)線程不能同時(shí)進(jìn)入方法內(nèi)部,那么就等于多個(gè)線程要排隊(duì)執(zhí)行該方法避免搶就避免了并發(fā)安全問(wèn)題。當(dāng)在方法上使用synchronized時(shí),鎖對(duì)象就是當(dāng)前方法所屬對(duì)象,即thisSynchronized塊有效的縮小同步范圍可以在保證安全的前提下提高并發(fā)效率使用同步塊若想達(dá)到同步效果,需要同步監(jiān)視器(上鎖的對(duì)象)對(duì)于多個(gè)線程而言看到的是同一個(gè)才行靜態(tài)方法若被synchronized修飾后,所指的是當(dāng)前靜態(tài)方法所屬類的類對(duì)象java中每個(gè)類都有一個(gè)類對(duì)象(Class實(shí)例)JVM在加載當(dāng)前類時(shí)會(huì)創(chuàng)建一個(gè)Class的實(shí)例來(lái)描述當(dāng)前類,由于每個(gè)類都有且只有一個(gè)類對(duì)象,所以靜態(tài)方法一定具有同步效果。當(dāng)使用synchronized修飾不同代碼片段時(shí),只要多個(gè)線程看到的鎖對(duì)象相同,那么這些代碼片段之間就具有了互斥性。如:一個(gè)類里有兩個(gè)方法都用synchronized修飾了,當(dāng)兩個(gè)線程分別調(diào)用這兩個(gè)方法時(shí),會(huì)先讓一個(gè)線程執(zhí)行完畢,再執(zhí)行下一個(gè)線程線程池即線程的集合,服務(wù)器接受一個(gè)客戶請(qǐng)求后,從線程池中取出一條空閑線程來(lái)為之服務(wù),服務(wù)完成后不關(guān)閉線程,而是返回到線程池中。目的:控制線程數(shù)量,重用線程。當(dāng)任務(wù)量多,或出現(xiàn)頻繁創(chuàng)建線程時(shí),就應(yīng)當(dāng)首先考慮使用線程池,因?yàn)檫^(guò)多的線程可能會(huì)導(dǎo)致CPU的過(guò)度切換,對(duì)資源消耗大,嚴(yán)重時(shí)會(huì)導(dǎo)致系統(tǒng)癱瘓。頻繁的創(chuàng)建銷毀線程也會(huì)給系統(tǒng)帶來(lái)額外的負(fù)擔(dān)。線程池可以控制線程數(shù)量,避免過(guò)度切換,并且可以重用以創(chuàng)建線程去執(zhí)行不同任務(wù),減少對(duì)系統(tǒng)的負(fù)擔(dān)線程池有以下幾種方法:Executors.newCachedThreadPool()創(chuàng)建一個(gè)可根據(jù)需要?jiǎng)?chuàng)建新線程的線程池,但是在以前構(gòu)造的線程可用時(shí)將重用它們。(彈性好,但沒(méi)有數(shù)量限制,容易出問(wèn)題)Executors.newFixedThreadPool(intnThreads)創(chuàng)建一個(gè)可重用固定線程集合的線程池,以共享的無(wú)界隊(duì)列方式來(lái)運(yùn)行這些線程。Executors.newScheduledThreadPool(intcorePoolSize)創(chuàng)建一個(gè)線程池,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。Executors.newSingleThreadExecutor()創(chuàng)建一個(gè)使用單個(gè)worker線程的Executor,以無(wú)界隊(duì)列方式來(lái)運(yùn)行該線程。XML指可擴(kuò)展標(biāo)記語(yǔ)言(ExtensibleMarkupLanguage)是獨(dú)立于軟件和硬件的信息傳輸工具應(yīng)用于web開(kāi)發(fā)的許多方面,常用于簡(jiǎn)化數(shù)據(jù)的存儲(chǔ)和共享簡(jiǎn)化數(shù)據(jù)共享、簡(jiǎn)化數(shù)據(jù)傳輸、簡(jiǎn)化平臺(tái)的變更XML處理指令簡(jiǎn)稱PI(processinginstruction)用來(lái)指揮解析引擎如何解析XML文檔內(nèi)容。<?xmlversion="1.0"encoding="utf-8"?>在XML中,所有的處理指令都以<?開(kāi)始,?>結(jié)束。<?后面緊跟的是處理指令的名稱。XML處理指令要求指定一個(gè)version屬性。并允許指定可選的standalone和encoding,其中standalone:指是否允許使用外部聲明,可設(shè)置為yes或noyes指定不使用外部聲明no使用外部聲明encoding:指作者使用的字符編碼格式。utf-8,GBK,gb2312元素和屬性XML文檔包含XML元素XML元素:也就是標(biāo)簽。從(包括)開(kāi)始標(biāo)簽知道(包括)借宿標(biāo)簽的部分。元素可以包含其他元素、文本、二者混合物。元素也可擁有屬性。<datasourceid="db_oracle"><propertyname="url"> jdbc:thin@6:1521:tarena</property><propertyname="dbUser">openlab</property><propertyname="dbPwd">open123</property></datasource>XML中標(biāo)簽的名字大小寫(xiě)嚴(yán)格區(qū)分且必須有后標(biāo)簽(這兩點(diǎn)在HTML可以不嚴(yán)格要求)XML必有根標(biāo)簽,并且只有一對(duì)XML解析方式1、SAX解析2、DOM解析讀取XML文檔SAXReader讀取1、導(dǎo)入dom4j-full.jar包(domforjava所以叫dom4j) 2、創(chuàng)建SAXReader來(lái)讀取文檔Document的getRootElement方法Document對(duì)象是一顆文檔樹(shù)的根,可提供對(duì)文檔數(shù)據(jù)的最初(或最頂層)的訪問(wèn)入口。Element對(duì)象表示XML文檔中的元素。ElementgetRootElement()用于獲取根元素使用DOM4J解析XML文檔的流程:1、創(chuàng)建用于解析XML文檔的類SAXReader2、使用讀取要解析的文檔,并將內(nèi)容抓環(huán)衛(wèi)一個(gè)DOcument對(duì)象表示。DOM操作耗時(shí)耗資源就體現(xiàn)在這一步。因?yàn)樽x取XML文檔時(shí),就將所有內(nèi)容全部解析了,這個(gè)操作是耗時(shí)的,并且會(huì)將所有內(nèi)容存入Document對(duì)象中,由于java中對(duì)象存于內(nèi)存,所以消耗內(nèi)存就體現(xiàn)在這里。3、通過(guò)Document對(duì)象獲取文檔根元素4、根據(jù)XML的結(jié)構(gòu),結(jié)合需求通過(guò)根元素逐層獲取子元素,以達(dá)到獲取XML中保存的數(shù)據(jù)的目的Document提供了獲取根元素的方法ElementgetRootElement(); 每一個(gè)Element實(shí)例都表示XML文檔中的一對(duì)標(biāo)簽 Element提供了獲取子元素的方法: Listelements();獲取當(dāng)前元素下所有子元素 Listelements(Stringname);獲取當(dāng)前元素下所有該名稱的子元素 Elementelement(Stringname);獲取當(dāng)前元素下指定名字的子元素XPath路徑表達(dá)式XPath是一門在XML文檔中查找信息的語(yǔ)言。對(duì)元素和屬性進(jìn)行遍歷【TCP通信】Socket簡(jiǎn)介socket通常稱作“套接字”,用于描述IP地址和端口。應(yīng)用程序通常通過(guò)“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。ServerSocket用于服務(wù)端,Socket是建立網(wǎng)絡(luò)連接時(shí)使用的。在連接成功時(shí),應(yīng)用程序兩端都會(huì)產(chǎn)生一個(gè)Socket實(shí)例Sockets=newSocket("localhost",8900);創(chuàng)建Socket對(duì)象,必須的參數(shù):地址和端口號(hào)如果服務(wù)器名稱、端口號(hào)錯(cuò)誤,就會(huì)出現(xiàn)連接異??蛻舳顺绦驁?zhí)行之前,服務(wù)器務(wù)必先啟動(dòng)!Socket的構(gòu)造器會(huì)自動(dòng)找到服務(wù)器并且進(jìn)行連接,如果連接成功就返回Socket對(duì)象。socket包含兩個(gè)流:in,out分別對(duì)應(yīng)連接到服務(wù)器的out和in關(guān)閉Socket時(shí),會(huì)自動(dòng)關(guān)閉其中的輸入輸出流。ServerSocketss=newServerSocket(8900);創(chuàng)建ServerSocket對(duì)象,必須給定端口號(hào),用于綁定tcp服務(wù)端口,tcp端口0~65535,一般不建議使用1K以下的端口號(hào)!如果端口已經(jīng)被占用(已經(jīng)開(kāi)啟了tcp)將拋出異常,如果程序運(yùn)行了兩遍也會(huì)出現(xiàn)這個(gè)異常!

Socketaccept()監(jiān)聽(tīng)Socket的連接該方法是一個(gè)阻塞方法,直到一個(gè)客戶端通過(guò)Socket連接上服務(wù)端后才停止阻塞,結(jié)束B(niǎo)lock繼續(xù)執(zhí)行,返回一個(gè)Socket對(duì)象獲取IP和端口號(hào)InetAddressip=socket.getLocalAddress();//獲取本地IPintport=socket.getLocalPort();//獲取本地端

溫馨提示

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