多線程皆愉。線程是進(jìn)程中的一個(gè)執(zhí)行單元(執(zhí)行路徑)概作,可以并發(fā)腋妙。
System.gc();申請(qǐng)啟動(dòng)垃圾回收器,垃圾回收器比較慢讯榕,可能會(huì)在虛擬機(jī)結(jié)束后出現(xiàn)骤素。
JVM啟動(dòng)時(shí)就啟動(dòng)了多個(gè)線程,至少有兩個(gè)線程可以出來(lái):
1愚屁,執(zhí)行main济竹;2,負(fù)責(zé)垃圾回收的線程霎槐。
第一種創(chuàng)建線程方法:繼承Thread類送浊,覆蓋run方法,調(diào)用start()啟動(dòng)線程栽燕;可以通過(guò)Thread類的getName()或Thread.currentThread().getName()獲取線程編號(hào)(從0開(kāi)始)
其他方法有wait(); notify(); sleep(time); stop();
狀態(tài):
凍結(jié)狀態(tài):由sleep(time);和wait();進(jìn)入罕袋,notify();喚醒改淑,醒后進(jìn)入臨時(shí)阻塞狀態(tài)碍岔。連個(gè)都不具備。
臨時(shí)阻塞狀態(tài):具備執(zhí)行資格朵夏,但不具備執(zhí)行權(quán)蔼啦。
第二種創(chuàng)建線程方法(常用):Runnable接口,用來(lái)幫助有父類的類創(chuàng)建線程仰猖。通過(guò)Thread類創(chuàng)建對(duì)象捏肢,并將Runnable接口的子類對(duì)象作為構(gòu)造函數(shù)的參數(shù)進(jìn)行傳遞。
Thread類設(shè)計(jì)思想:帶一個(gè)Runnable()接口饥侵,運(yùn)行這個(gè)接口的方法體鸵赫,或者運(yùn)行用戶自定義的run()方法,或者運(yùn)行用戶自定義的Runnable子類里的run()方法躏升。這處講解在視頻13-10辩棒!
如果僅僅使用run();那最好只用Runnable來(lái)實(shí)現(xiàn),它的作用就是封裝線程任務(wù)膨疏。實(shí)現(xiàn)Runnable接口的好處:
1一睁,將線程任務(wù)封裝成對(duì)象,面向?qū)ο蟮乃枷?br> 2佃却,避免單繼承的局限性者吁。同步代碼塊 同步函數(shù) 和 靜態(tài)同步函數(shù):
synchronized(obj){ } obj是任意對(duì)象可以用object類String類等。 synchronized 修飾一個(gè)函數(shù)饲帅。
同步函數(shù)的鎖是固定的this复凳,也就是當(dāng)前對(duì)象瘤泪,
同步代碼塊的鎖是任意對(duì)象。
靜態(tài)同步函數(shù)用的鎖是該類字節(jié)碼文件對(duì)象用this.getclass() 或 類名.class獲取育八。
建議使用同步代碼塊>俊!
同步的好處是:解決線程的安全問(wèn)題单鹿。
同步的壞處是:相對(duì)降低了效率掀宋,同步外的線程每次都會(huì)判斷同步鎖。
必須保證 同步中每個(gè)線程用的都是同一個(gè)鎖仲锄。別用局部變量劲妙。
sleep(time);有異常要拋 interruptedExceptionThread(同一個(gè)對(duì)象)多次.start會(huì)再運(yùn)行一次對(duì)象的run(),對(duì)象的內(nèi)部變量不會(huì)初始化儒喊。
字節(jié)碼文件所屬對(duì)象镣奋。JVM把所有類都封裝成對(duì)象,用對(duì)象.getclass() 或者 類名.class 調(diào)用這個(gè)屬性來(lái)獲得該對(duì)象怀愧,在用到靜態(tài)同步函數(shù)的鎖會(huì)碰到侨颈。
多線程通信。多個(gè)線程在處理同一個(gè)資源芯义,但是任務(wù)卻不同哈垢,可能一個(gè)寫(xiě),一個(gè)讀扛拨。
1.創(chuàng)建資源耘分。2.創(chuàng)建任務(wù)匣椰。3.創(chuàng)建線程驮俗,執(zhí)行任務(wù)哎甲。4.開(kāi)啟線程青自。如何實(shí)現(xiàn)對(duì)象之間共享數(shù)據(jù)蚀同。除了靜態(tài)堪滨,單例桑驱,還可以用傳參的方式将塑,就是用一個(gè)私有成員某類變量北启,在構(gòu)造函數(shù)中傳入一個(gè)對(duì)象初始化這個(gè)成員變量卜朗。
等待和喚醒機(jī)制。涉及的方法:
1暖庄、wait(): 讓線程處于凍結(jié)狀態(tài)聊替,被wait的線程會(huì)被存儲(chǔ)到線程池中,其中有InterruptedException異常要捕捉培廓。
2惹悄、notify(): 喚醒線程池中的一個(gè)線程(任意)。
3肩钠、 notifyAll(): 喚醒線程池中的所有線程泣港,線程池是按照鎖區(qū)分的暂殖。
注意:這些方法都必須定義在同步中。
因?yàn)檫@些方法是用于操作線程狀態(tài)的方法当纱。
必須要明確到底操作的是那個(gè)鎖上的線程呛每。也就是說(shuō)r.wait() 和 r.notify() 操作的是r鎖(監(jiān)視器)對(duì)應(yīng)線程池中的線程。
之所以上面這些方法定義在Object類中坡氯,因?yàn)檫@些都是監(jiān)視器的方法晨横,監(jiān)視器其實(shí)是鎖,鎖可以是任意對(duì)象箫柳。
把同步代碼塊放在共享資源類里手形,比如輸入和輸出都是。
4悯恍、注意:使用wait(), notify(), synchronized(lock)來(lái)管理3個(gè)以上線程時(shí)候库糠,容易造成死鎖和安全問(wèn)題。比如隨機(jī)notify一直是那幾個(gè)生產(chǎn)者涮毫。解決:可以用notifyAll()和無(wú)限循環(huán)判斷flag來(lái)解決這個(gè)安全問(wèn)題瞬欧。具體來(lái)說(shuō),while(flag)解決了線程取得執(zhí)行權(quán)后判斷該不該執(zhí)行罢防。用while()判斷標(biāo)記安全K一ⅰ!篙梢!final變量的初始化:引用方法見(jiàn)此
分靜態(tài)和非靜態(tài)final類型變量顷帖,要么直接初始化,要么構(gòu)造函數(shù)初始化渤滞,要么構(gòu)造代碼塊初始化。同步的顯示鎖方式Lock榴嗅。在java.util.concurrent.locks這個(gè)包里妄呕,用try{}finally{}方式鎖上和解鎖,lock(),unlock(); Lock lock = new Lock();
創(chuàng)建鎖上的監(jiān)視器對(duì)象嗽测。通過(guò)已有鎖獲取绪励,Condition con_1 = lock.newCondition();
所以手法可以,同種線程共用一個(gè)監(jiān)視器唠粥。
方法有:awai();signal();signalAll();
總結(jié):
1疏魏、Lock借口:出現(xiàn)替代了同步代碼塊或者同步函數(shù)。將同步的隱式鎖操作變成顯式操作晤愧,而且更靈活大莫,可以一個(gè)鎖上加多組監(jiān)視器。
lock()獲取鎖官份。unlock()釋放鎖只厘,定義在finally代碼快中烙丛。
2、conditon接口:出現(xiàn)替代了Object中的wait notify notifyAll方法羔味。
將這些監(jiān)視器方法單獨(dú)進(jìn)行了封裝河咽,變成Condition監(jiān)視器對(duì)象「吃可以讓任意鎖進(jìn)行組合忘蟹。
方法有:await();signal();signalAll();
3、其他: (1). wait 和 sleep 區(qū)別在于 wait可以制定時(shí)間也可以不制定時(shí)間搁凸。sleep必須制定時(shí)間寒瓦。
(2). 在同步中,wait: 釋放執(zhí)行器坪仇,釋放鎖杂腰。sleep: 釋放執(zhí)行權(quán),不釋放鎖椅文。停止線程:
1喂很、 stop方法,但已過(guò)時(shí)皆刺,不安全少辣。
2、run方法結(jié)束羡蛾,不能控漓帅。可頂一個(gè)標(biāo)志位while(flag);和public setFlag(){} 把flag置false痴怨,退出循環(huán)結(jié)束任務(wù)忙干。但是如果線程死鎖或凍結(jié)wait()狀態(tài),就無(wú)法讀取標(biāo)志位退出浪藻。如何解決捐迫?
3、可以使用interrupt()方法將線程從凍結(jié)狀態(tài)強(qiáng)制恢復(fù)到運(yùn)行狀態(tài)中來(lái)爱葵,讓線程具備CPU的執(zhí)行資格施戴。。但是強(qiáng)制終端等待動(dòng)作會(huì)發(fā)生InterruptedException萌丈,記得要處理赞哗。線程其他方法。
1辆雾、Daemon線程肪笋。t.setDaemon();設(shè)為守護(hù)線程,后臺(tái)運(yùn)行,必須在啟動(dòng)前調(diào)用涂乌,當(dāng)全是后臺(tái)線程時(shí)虛擬機(jī)退出艺栈。
2、join()方法湾盒。t1.join();調(diào)用這條語(yǔ)句的線程湿右,必須要等t1線程先運(yùn)行完終止后才能接著運(yùn)行,其他不用等罚勾。
3毅人、線程.toString()。會(huì)顯示線程名 優(yōu)先級(jí) 線程組尖殃。優(yōu)先級(jí)可以通過(guò).setPriority()設(shè)置丈莺,最大10最小1越大優(yōu)先級(jí)越高,最高用常量來(lái)設(shè)置送丰。線程組缔俄,可以通過(guò)對(duì)組進(jìn)行操作,比如對(duì)整個(gè)組進(jìn)行中斷處理器躏。
4俐载、Thread.yield()方法。用來(lái)暫時(shí)釋放執(zhí)行權(quán)登失。
5遏佣、抽象的類一定要用abstract修飾,比如定義一個(gè)實(shí)現(xiàn)某接口的類揽浙,如果沒(méi)有覆蓋住状婶,那些方法還是抽象的,那么這個(gè)類必須要用abstract修飾馅巷,否則報(bào)錯(cuò)膛虫。字符串。字符串是不可變的令杈。
new String()還不如直接用""就好;
常用的split();涉及到正則走敌,重點(diǎn)掌握;
trim()重點(diǎn)掌握;
concat()拼接字符串,代替使用“” + “”;
charAt代替使用[]逗噩;
String.valueOf()可以將基本數(shù)據(jù)類型轉(zhuǎn)換為字符串形式;
equalsIgnoreCase()忽略大小寫(xiě)比較兩字符串跌榔;
intern()不知道具體什么用异雁;
length是所有數(shù)組都有的屬性;
GB2312是中文碼表僧须。**最高位是1纲刀,所以顯示都是負(fù)數(shù)。
F3顯示源代碼担平,cmd + 鼠標(biāo)也可以進(jìn)入聲明等內(nèi)容示绊,按cmd + [返回
cmd + shift + f代碼格式化StringBuffer字符串緩沖區(qū)锭部。用于存儲(chǔ)數(shù)據(jù)的容器。
特點(diǎn):
1面褐, 長(zhǎng)度可變拌禾。
2, 可以存儲(chǔ)不同類型的數(shù)據(jù)展哭。
3湃窍, 最終要轉(zhuǎn)成字符串進(jìn)行使用
4, 可以對(duì)字符串進(jìn)行修改。字符串本身不能匪傍,通過(guò)緩沖區(qū)可以改您市。
功能:
1, 添加:
StringBuffer append(); StringBuffer Insert(index, data);
2役衡, 刪除:
StringBuffer delete(start, end); 包含頭茵休,不包含尾
StringBuffer deleteCharAt(int index);刪除指定位置的元素
3, 查找:
char charAt(index);
int indexOf(string);
int lastIndexOf(string);
4, 修改:
StringBuffer replace(start, end, string);先去掉那部分手蝎,再放入string
void setCharAt(index, char);StringBuilder與StringBuffer用法兼容榕莺。不同點(diǎn)在于前者不保證同步,多線程里不安全柑船,后者保證同步和多線程安全帽撑。前者是JDK1.5才出現(xiàn),后者JDK1.0就出現(xiàn)了鞍时。前者優(yōu)點(diǎn)是速度快 用于單線程亏拉,后者加了同步鎖比較慢 用于多線程。
基本數(shù)據(jù)類型對(duì)象包裝類逆巍。比如有Integer, Byte, Character, Boolean等及塘。
1, 取某數(shù)據(jù)類型的最大最小值(.MAX_VALUE),
2, 還常用在與其他類型字符串形式之間轉(zhuǎn)換(.toBinaryString())锐极,
基本數(shù)值類型+""笙僚,String類中的valueOf(基本數(shù)值類型)
3, 還常用到將字符串轉(zhuǎn)換成int型整數(shù) parseInt(string,radix) 或其他類型。 用包裝類中的方法 中的 xxx parseXxx("xxx類型的字符串")只有character沒(méi)有parse方法它不需要灵再。
4, 用對(duì)象.intValue()轉(zhuǎn)成相應(yīng)數(shù)值
5, 進(jìn)制轉(zhuǎn)換 十進(jìn)制->其他進(jìn)制 .toString(data,radix)肋层;.toBinaryString(data); .toOctalString(data); .toHexString(data);
其他進(jìn)制->十進(jìn)制 parseInt(string, radix); 這個(gè)最常用!Integer對(duì)象包裝類翎迁。這個(gè)類最常用栋猖,很多實(shí)用方法比如進(jìn)制轉(zhuǎn)換。
JDK更新后簡(jiǎn)化了書(shū)寫(xiě):Integer i = 4; 自動(dòng)裝箱汪榔,如果裝箱的是同樣的一個(gè)字節(jié)蒲拉,那該數(shù)據(jù)會(huì)被共享,不會(huì)重開(kāi)空間。比如Integer i = 4;Integer j = 4;判斷i ==j返回的是True雌团,注意燃领,只有一個(gè)字節(jié)是這樣的,多于一個(gè)就不是這樣锦援。
i = i+4;(i.intValue() + 4); 自動(dòng)拆箱 萬(wàn)一對(duì)象為null猛蔽,所以要判斷過(guò)。集合框架雨涛。存儲(chǔ)多個(gè)對(duì)象枢舶,其特點(diǎn)是:
1,是用于存儲(chǔ)對(duì)象的容器替久;
2凉泄,集合的長(zhǎng)度是可變的,比如remove()蚯根;
3后众,集合不可以存儲(chǔ)基本數(shù)據(jù)類型。
4颅拦,那么對(duì)象是如何在集合中存儲(chǔ)的蒂誉?
因?yàn)榧先萜鲀?nèi)部的數(shù)據(jù)結(jié)構(gòu)不同,有多種具體容器距帅,不斷向上抽取右锨,就形成了集合框架÷到眨框架頂層是Collection接口 定義了多種容器常用方法:
增刪改查绍移,
用迭代器取對(duì)象元素,Iterator iterator(); 用上for循環(huán)讥电。迭代器接口在容器內(nèi)部類中實(shí)現(xiàn)蹂窖,直接取得容器元素,讓每個(gè)容器取出方式變通用恩敌,降低了容器與取出方式之間的耦合性瞬测,在多種容器中使用迭代器變得很方便,iterator接口就是所有的Collection容器進(jìn)行元素取出的公共接口纠炮。
所以一個(gè)事物直接在訪問(wèn)另一個(gè)事物的成員月趟,這用內(nèi)部類來(lái)完成。
取交集保留 retainAll(coll)恢口,與removeAll]正相反狮斗。常用Collection接口:List, Set,Map
1,List集合:有序(存入和取出順序一致)弧蝇,元素都有索引,可重復(fù)
2,List特有常見(jiàn)方法:有一個(gè)共性特點(diǎn)是都可以操作索引看疗,按位置操作容器內(nèi)容沙峻。
ArrayList 是List的子類接口,可以用List list = new ArrayList();
只有List可以利用索引循環(huán)取元素两芳,也可以用迭代器取摔寨。只有List!
3怖辆,快速失敗迭代器是复,集合和迭代器同時(shí)對(duì)元素進(jìn)行修改,就會(huì)發(fā)生異常竖螃,因?yàn)楂@取集合的迭代器后淑廊,對(duì)集合內(nèi)元素進(jìn)行修改,迭代器是不知道的特咆,這樣迭代就會(huì)出問(wèn)題季惩。所以不要在迭代過(guò)程中使用集合操作元素,容易出現(xiàn)異常腻格。
但只有List容器有一個(gè)listIterator()方式可以解決這個(gè)問(wèn)題画拾,因?yàn)樗峁┝硕喾N修改元素的方法。
4菜职,常用的List有:Vector青抛,ArrayList,LinkList
5酬核,Vector:內(nèi)部是數(shù)組數(shù)據(jù)結(jié)構(gòu)蜜另,具備List所有功能特點(diǎn)。1.0就出現(xiàn)愁茁,最早蚕钦,是同步線程安全的。但是增刪都很慢鹅很,Vector幾乎不用嘶居,枚舉遍歷也不用了。
----ArrayList:內(nèi)部是數(shù)組數(shù)據(jù)結(jié)構(gòu)促煮,不同步線程不安全邮屁。替代了Vector,查詢快因?yàn)榭臻g局部性(緩存的存在)菠齿,數(shù)組迭代效率更高 直接尋址佑吝,自己加鎖。
----LinkedList:內(nèi)部是鏈表數(shù)據(jù)結(jié)構(gòu)绳匀,是不同步的芋忿,增刪速度快炸客。jdk1.6以后的新方法更好用:用offerFirst代替addFirst,用peekFirst peekLast代替getFirst getLast戈钢,用pollFirst代替removeFirst方法痹仙。
6,擴(kuò)大數(shù)組方法是創(chuàng)建一個(gè)新數(shù)組殉了,把原來(lái)數(shù)組里的數(shù)據(jù)復(fù)制到新數(shù)組里开仰。
7,默認(rèn)存儲(chǔ)的是Object類型薪铜,需要向下轉(zhuǎn)型才能使用實(shí)際存入的類方法众弓。
8,eclipse快捷鍵
1隔箍, Set集合:不包含重復(fù)元素谓娃,無(wú)序,方法和Collection方法一致
|-- HashSet:內(nèi)部數(shù)據(jù)結(jié)構(gòu)是哈希表鞍恢,是不同步的傻粘,hashSet是通過(guò)哈希值hashCode()映射,來(lái)確定存放位置帮掉,哈希值和對(duì)象地址是不同的弦悉。而hashCode()通過(guò)值計(jì)算,所以基本數(shù)據(jù)類型的值如果一樣蟆炊,hashCode()值也基本一樣稽莉,但自定義的類不一定,要重寫(xiě)涩搓。
那么污秆,哈希表如何確定元素是否相同:1. 判斷哈希值對(duì)應(yīng)位置有無(wú)元素(哈希值不同,內(nèi)容肯定不相同昧甘,因?yàn)閔ashCode()是通過(guò)值映射良拼,比如"ab" "ba"哈希值相同內(nèi)容不同)。如果哈希值相同充边,再判斷內(nèi)容是否相同用equals()庸推。2. 判斷哈希值相同,其實(shí)是判斷的是對(duì)象的hashCode方法(有必要的話需要重寫(xiě))浇冰;判斷內(nèi)容相同贬媒,用的是equals方法(有必要的話需要重寫(xiě))。 至于我的理解肘习,就是按當(dāng)前對(duì)象放入容器里际乘,如果碰到該映射位置上有對(duì)象,就判斷一下漂佩,哈希值不相同或者哈希值同內(nèi)容不同脖含,就存下一個(gè)空間罪塔,一直延順到空位置上,或者有同哈希值同內(nèi)容的元素而退出來(lái)器赞,這里操作會(huì)調(diào)用這兩個(gè)函數(shù)垢袱。
注意:如果元素要存儲(chǔ)到HashSet集合中,必須覆蓋hashCode方法和equals方法港柜。 remove() contains()方法也是用equals來(lái)找元素內(nèi)容一樣的元素而不是找同地址的。所以一定要復(fù)寫(xiě)好equals方法咳榜。
|-- LinkedHashSet:按插入有序夏醉,不可重復(fù)。
|-- TreeSet:原理二叉排序樹(shù)涌韩,按字典(自然順序)有序畔柔,是不同步的,自然順序由compareTo方法決定臣樱。compareTo判斷元素唯一的方法:就是根據(jù)compareTo()方法返回結(jié)果是否是0靶擦,是0就是相同元素,不存(這里要小心雇毫,等于0的話會(huì)去掉)玄捕,所以要使用TreeSet容器,就需要實(shí)現(xiàn)Comparable接口棚放,覆蓋compareTo方法枚粘。
如果不要按照對(duì)象中具備的自然順序進(jìn)行排序,因?yàn)橛袝r(shí)使用的類不是我們自定義的飘蚯,使用TreeSet集合第二種排序方式二: 讓集合自身具備比較功能
TreeSet(Comparator<? super [E]> comparator) 構(gòu)造一個(gè)新的空 TreeSet馍迄,它根據(jù)指定比較器進(jìn)行排序。經(jīng)常需要寫(xiě)比較器>种琛攀圈!* 也就是一個(gè)實(shí)現(xiàn)Comparable接口的類,并覆蓋compare方法峦甩,傳給構(gòu)造函數(shù)赘来,來(lái)定義自己的排序規(guī)則。
1穴店,Map:一次添加一對(duì)元素撕捍。Collection 一次添加一個(gè)元素。
---Map頁(yè)稱為雙列集合泣洞,Collection集合稱為單列集合忧风。
---其實(shí)Map集合中存儲(chǔ)的就是鍵值對(duì),而且必須保證鍵的唯一性球凰。
常用方法:添加put狮腿,刪除clear remove腿宰,判斷containskey containsValue,獲取get size缘厢,迭代方法keySet Values entrySet()找Map.Entry<T,E>這個(gè)靜態(tài)的映射項(xiàng)類對(duì)象吃度。
2,Map常用的子類:
|-- Hashtable: 內(nèi)部結(jié)構(gòu)上哈希表贴硫,是同步椿每,不允許null作為鍵和值。
------Properties: 用來(lái)存儲(chǔ)鍵值對(duì)應(yīng)的配置文件信息英遭,可以和IO技術(shù)相結(jié)合间护。
|-- HashMap: 內(nèi)部結(jié)構(gòu)上哈希表,不說(shuō)同步的挖诸,允許null作為鍵和值汁尺,重寫(xiě)hashCode, equals方法。
|--TreeMap: 內(nèi)部結(jié)構(gòu)上二叉樹(shù)多律,可以對(duì)Map集合中的鍵進(jìn)行排序痴突,能排序的是Tree*。泛型狼荞。jdk1.5出現(xiàn)的安全機(jī)制辽装。
好處是:
1,將運(yùn)行時(shí)期的問(wèn)題ClassCastException轉(zhuǎn)到了編譯時(shí)期粘秆,確保編譯時(shí)類型的安全如迟。運(yùn)行時(shí)會(huì)將泛型去掉,生成的class文件中是不帶泛型的攻走,這個(gè)稱為泛型的擦除殷勘。
那么為什么擦除?為了兼容以前不認(rèn)識(shí)泛型的類加載器昔搂。后面運(yùn)行用泛型的補(bǔ)償來(lái)自動(dòng)向下轉(zhuǎn)型玲销,原理是用getClass方法,再getName得到類名摘符。
2贤斜,避免了強(qiáng)制轉(zhuǎn)換的麻煩。
那么<>什么時(shí)候用逛裤?當(dāng)操作的飲用數(shù)據(jù)類型不確定的時(shí)候瘩绒,就使用<>。將要操作的引用數(shù)據(jù)類型傳入即可带族。其實(shí)<>就是一個(gè)用于接收具體引用數(shù)據(jù)類型的參數(shù)范圍锁荔。
在程序中,只要用到了帶有<>的類或者接口蝙砌,就要明確傳入的具體引用數(shù)據(jù)類型阳堕。
3跋理,可以自定義泛型類,用來(lái)接收類中要操作的引用數(shù)據(jù)類型恬总。public Class Tool<Q>{}; 當(dāng)類中的操作的引用數(shù)據(jù)類型不確定的時(shí)候前普,就使用泛型來(lái)表示。
4壹堰,泛型方法拭卿。public <W> void show(W str);(泛型必須寫(xiě)在返回類型符前面)。 當(dāng)方法為靜態(tài)時(shí)缀旁,不能訪問(wèn)泛型類中的泛型记劈,如果要訪問(wèn),只能把泛型定義在方法上并巍,也就是做靜態(tài)泛型方法。
5换途,泛型接口懊渡。實(shí)現(xiàn)泛型接口要在子類中確定泛型類型,如果還是不確定類型军拟,就定義好泛型類來(lái)實(shí)現(xiàn)接口剃执,使用泛型來(lái)傳給接口的泛型。比如接口是<T>懈息,實(shí)現(xiàn)它的類是<Q> <Q>肾档,看你參數(shù)類型明確不明確。
6辫继,泛型的通配符:? 傳參的時(shí)候不明確類型怒见,使用(Collection<?> arr)來(lái)傳遞容器泛型不明確的參數(shù)。直接(Collection arr)也是一樣 這是老版本姑宽。使用?通配符的情況是僅在不明確類型而且不對(duì)這種類型的對(duì)象進(jìn)行操作的時(shí)候遣耍,用?通配符,這種情況比較多炮车。
注意:不能用ArrayList<Student>的變量傳給Collection<Person>的變量舵变,只認(rèn)Person。這時(shí)候可以用通配符<? extends Person>來(lái)幫忙瘦穆。
7纪隙,泛型的限定。上限:<? extends Person>扛或,只接受P和P的子類绵咱,一般存元素的時(shí)候用上限,因?yàn)檫@樣取出都是按上限類型進(jìn)行運(yùn)算告喊,安全麸拄。
--------下限:<? super P>派昧,只接受P和P的父類。一般對(duì)元素進(jìn)行取出操作時(shí)拢切,可以用下限蒂萎。綜上,集合選擇的技巧:
需要唯一嗎淮椰?
需要:Set
---需要定制順序:
------需要:TreeSet
------不需要:HashSet
------但是想要一個(gè)和存儲(chǔ)一致的順序(有序):LinkedHashSet
不需要:List
---需要頻繁增刪嗎五慈?
------需要:LinkedList
------不需要:ArrayList
具體集合中源碼及其原理解析看這個(gè)博客集合框架的工具類:有 Collections Arrays 。
Collections:
1主穗,Collections.reverseOrder();想逆序泻拦,用這個(gè)。
2忽媒,將非同步類改為同步争拐,見(jiàn)視頻19-16(就加了個(gè)同步代碼塊再封裝一下),或者直接用Collections中定義好的工具方法晦雨。
Arrays:
1架曹,Array.toString(); 將數(shù)組輸出成字符串形式。
2闹瞧,Arrays.asList(); 將數(shù)組轉(zhuǎn)成列表來(lái)使用绑雄。要注意:因?yàn)閿?shù)組的長(zhǎng)度的固定,所以對(duì)于這種集合的增刪方法是不可以使用的奥邮,否則會(huì)發(fā)生UnsupportedOperationException万牺。
并且,如果數(shù)組中的元素是對(duì)象洽腺,那么轉(zhuǎn)成集合時(shí)脚粟,直接將數(shù)組中的元素作為集合中的元素進(jìn)行存儲(chǔ)。
如果數(shù)組中的元素是基本類型已脓,那么會(huì)將數(shù)組作為集合元素存儲(chǔ)珊楼。
3,集合轉(zhuǎn)成數(shù)組:用Collection接口中的.toArray(); 需要傳入一個(gè)指定類型的數(shù)組大小寫(xiě)上度液,太長(zhǎng)會(huì)給null厕宗,太短會(huì)固化到集合長(zhǎng)度。
可以對(duì)集合中的元素操作方法進(jìn)行限定堕担,就是不允許增刪已慢。for each語(yǔ)句。
1霹购,格式:
for(類型 變量:Collection集合|數(shù)組){}
2佑惠,foreach循環(huán)的局限是,不能對(duì)集合或數(shù)組修改,如重新賦值膜楷,因?yàn)樗窍热〕鲈亟o單獨(dú)的一個(gè)變量來(lái)用的旭咽,比如P p = ps[i]; 所以foreach僅僅在不對(duì)集合修改的情況下使用非常方便,比如遍歷打印赌厅。而且這個(gè)for不能執(zhí)行指定次數(shù)的循環(huán)穷绵。
3,另一個(gè)局限是:
只能遍歷單列集合特愿,也就是不能遍歷Map集合仲墨。解決辦法是:用keySet()方法轉(zhuǎn)單列就可以用了。函數(shù)可變參數(shù):public static int add(int... arr){}
可以直接寫(xiě)多個(gè)參數(shù)在里面或者數(shù)組揍障,而不用必須先創(chuàng)建一個(gè)數(shù)組再傳進(jìn)入目养。如果要傳另外的單個(gè)參數(shù),要放可變參數(shù)前面毒嫡,也即可變參數(shù)必須放列表結(jié)尾癌蚁。應(yīng)用有asList()方法。靜態(tài)導(dǎo)入兜畸。import static java.util.Collections.sort; 其實(shí)是導(dǎo)入類中的靜態(tài)成員匈勋。如果名字沖突,那么一定要加包名膳叨。靜態(tài)導(dǎo)入用的不多。
**System類中的方法和屬性都是靜態(tài)的痘系。常見(jiàn)方法:
1菲嘴,long currentTimeMillis(); 獲取當(dāng)前時(shí)間的毫秒值
2,System.getProperties();獲取系統(tǒng)的屬性信息汰翠,并存儲(chǔ)到Properties(Map子類)集合中龄坪。 Properties集合中存儲(chǔ)都是String類型的鍵和值。最好使用它自己的存儲(chǔ)和取出方法來(lái)完成對(duì)元素的操作复唤。
重點(diǎn):虛擬機(jī)啟動(dòng)的時(shí)候都會(huì)先拿該系統(tǒng)上的信息健田,因?yàn)椴煌到y(tǒng)對(duì)應(yīng)著不同的習(xí)慣,比如換行符在win上是/r/n佛纫,在unix上是/n妓局,為了保證Java的強(qiáng)大移植性,用系統(tǒng)拿到的信息來(lái)寫(xiě)這些易變化的符號(hào)呈宇。比如換行符用System.getProperty("line.separator");或System.lineSeparator(); 就是換行符好爬。可以把它最終化為靜態(tài)常量甥啄。Line.separator這些鍵信息可以在getProperties方法里查到存炮。
3,System.setProperty();往系統(tǒng)里插入一些信息。F2顯示代碼信息穆桂」可以在editor里關(guān)掉自動(dòng)懸停。Runtime運(yùn)行時(shí)對(duì)象享完。沒(méi)有構(gòu)造函數(shù)意味著這個(gè)類不能創(chuàng)建對(duì)象灼芭,因?yàn)闃?gòu)造函數(shù)被私有化了。如果一個(gè)類沒(méi)有構(gòu)造函數(shù)驼侠,這類里的方法都是靜態(tài)的姿鸿,在這個(gè)類里不一樣,但是百分之百有一個(gè)靜態(tài)方法倒源,返回這個(gè)對(duì)象苛预,這是單例設(shè)計(jì)模式俺亮。常見(jiàn)方法有:
1篡腌,exec("notepad.exe xxxx路徑"); 用記事本打開(kāi)對(duì)應(yīng)文件。返回值是Process對(duì)象园细,這個(gè)對(duì)象只有進(jìn)程才創(chuàng)建胳螟,我們可以獲取昔馋。
2,Process糖耸,有一個(gè)destroy()可以殺死由java打開(kāi)的進(jìn)程秘遏。Math類:提供了操作數(shù)學(xué)運(yùn)算的方法。都是靜態(tài)的嘉竟。有:
1邦危,ceil();floor();round();
2,max();min();pow();
3舍扰,random(); util里有Random類倦蚪,更豐富的方法。比如new Random().nextInt(6) + 1;Date日期類默認(rèn)初始化為當(dāng)前時(shí)間边苹,也可指定毫秒值來(lái)做陵且。所以:
1,毫秒值 -> 日期對(duì)象:通過(guò)new Date(timeMillis); Date打印出來(lái)就是日期个束。
2慕购,日期對(duì)象 -> 毫秒值:通過(guò)getTime方法。還可以通過(guò)setTime()設(shè)置
3播急,調(diào)整日期輸出格式:使用DateFormat這個(gè)抽象類脓钾,通過(guò)其靜態(tài)工廠方法獲取實(shí)例對(duì)象,并使用該實(shí)例的format()格式化方法轉(zhuǎn)換日期對(duì)象成合適的字符串桩警,還可以指定風(fēng)格可训。這里的靜態(tài)工廠方法放回的是SimpleDateFormat這個(gè)子類。
4,想要自定義格式握截,可以用SimpleDateFormat("yyyy--MM--dd");或者在DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);來(lái)指定風(fēng)格飞崖。
5,將日期格式的字符串 ---> 日期對(duì)象谨胞,使用的是DateFormat類中的parse()方法固歪。Calendar類 基本取代了Date。也是個(gè)抽象類胯努,需要get實(shí)例牢裳,它弄成了很多字段。
可以通過(guò)鍵取值叶沛,鍵用類的靜態(tài)字段來(lái)寫(xiě) c.get(Calendar.YEAR)蒲讯。小心月從0開(kāi)始,周日按序到周六灰署。
set(2011, 3, 20);設(shè)置時(shí)間判帮,記得月數(shù)要加1。
add(Calendar.YEAR, -2); 在該日歷對(duì)象上加-2年溉箕,操作月也類似晦墙。IO流: 是相對(duì)于內(nèi)存而言的。內(nèi)存到硬盤是輸出(寫(xiě))肴茄,硬盤到內(nèi)存是輸入(讀)晌畅。分為字節(jié)流和字符流,處理字節(jié)的數(shù)據(jù)流對(duì)象是字節(jié)流寡痰。后來(lái)出現(xiàn)了碼表踩麦,如ascii表,java內(nèi)置的unicode表-->無(wú)論什么字符都用兩個(gè)字節(jié)表示氓癌。
字符流的由來(lái):其實(shí)就是 字節(jié)流讀取文字字節(jié)數(shù)據(jù)后,不直接操作而現(xiàn)查指定的編碼表贫橙,獲取對(duì)應(yīng)的文字贪婉,再對(duì)這個(gè)文字進(jìn)行操作。也就是:字節(jié)流 + 編碼表卢肃。
字節(jié)流的兩個(gè)頂層父類:
1疲迂,InputStream 2,OutputStream
字符流的兩個(gè)頂層父類:
1莫湘,Reader 2尤蒿,Writer
這些體系的子類都以父類名做為后綴。
一:往文件中寫(xiě)入字符數(shù)據(jù)用FileWriter類的write()方法幅垮,先會(huì)寫(xiě)到臨時(shí)存儲(chǔ)緩沖區(qū)中腰池,要用flush()方法刷新下就寫(xiě)入。這會(huì)使用系統(tǒng)的寫(xiě)入資源,記得close();在關(guān)閉前會(huì)先調(diào)用flush刷新緩沖中的數(shù)據(jù)要目的地示弓。
如果想要續(xù)寫(xiě)同一個(gè)文件讳侨,就用帶第二個(gè)參數(shù)的構(gòu)造函數(shù)FileWriter(xxx, true);
二:IO異常處理,打開(kāi)會(huì)出異常奏属,寫(xiě)入會(huì)出異常比如寫(xiě)失敗跨跨,關(guān)閉出異常,掛了wins返回異常囱皿。
記住勇婴,流對(duì)象的初始化,在try外面創(chuàng)建引用變量嘱腥,在try里面進(jìn)行對(duì)象初始化耕渴,因?yàn)榱鲗?duì)象創(chuàng)建都有異常發(fā)生。常見(jiàn)做法爹橱,打開(kāi)和讀寫(xiě)一起try萨螺,關(guān)閉在finally里再try。
三:讀取方法:fr.read()讀出一個(gè)字符愧驱,讀出一個(gè)字符數(shù)組慰技。
小技巧,讀出來(lái)的字符數(shù)組可以用new String(buffer, 0, num)將指定范圍的數(shù)組字符內(nèi)容轉(zhuǎn)換成字符串形式组砚,可以用來(lái)寫(xiě)入另一個(gè)文件或輸出吻商。或者直接用fw.write(cbuff, off, len);來(lái)指定要寫(xiě)入的數(shù)組內(nèi)容范圍糟红。
四:緩沖區(qū)對(duì)象:提高效率艾帐。創(chuàng)建緩沖區(qū)必須要有被緩沖的對(duì)象。
寫(xiě)緩沖區(qū):FileWriter盆偿,用BufferedWriter.write()和.flush()寫(xiě)入文件中柒爸,記得關(guān)閉緩沖區(qū).close();其實(shí)關(guān)閉的就是被緩沖的流對(duì)象。這對(duì)象又給了個(gè)newLine()寫(xiě)換行符的方法事扭。
讀緩沖區(qū):FIleReader捎稚,多了readLine()讀一行的方法。原理是在緩沖區(qū)里讀到換行符就停止求橄,把臨時(shí)StringBuilder內(nèi)容輸出今野。
裝飾設(shè)計(jì)模式:對(duì)一組對(duì)象的功能進(jìn)行增強(qiáng)時(shí),就可以使用該模式進(jìn)行問(wèn)題的解決 比如BufferedReader等罐农。把舊類傳參給新類条霜。與繼承一樣可以進(jìn)行功能的擴(kuò)展增強(qiáng)。
有什么區(qū)別涵亏? 用不斷繼承來(lái)擴(kuò)展會(huì)產(chǎn)生很多關(guān)系宰睡,變得臃腫蒲凶,用裝飾更靈活。
特點(diǎn):裝飾類和被裝飾類都必須所屬同一個(gè)接口或者父類夹厌。
五:LineNumberReader豹爹,可以讀取行號(hào)的帶緩沖技術(shù)讀文件。字符流常用的就是FileReader BufferedReader 都是Reader的子類矛纹。
六:字節(jié)流:緩沖區(qū)是字節(jié)數(shù)組臂聋,父類是InputStream OutputStream,操作文件就用FileInputStream或南。寫(xiě)數(shù)據(jù)是直接寫(xiě)入目的地孩等,可以不用flush(),但是close()要做 關(guān)閉資源采够。.available()可獲取文件大小肄方,用這個(gè)可以定義一個(gè)剛剛夠的緩沖區(qū)大小 但易溢出,或者分段讀蹬癌。BufferedOutputStream有Flush();的用法权她,但是不要每寫(xiě)一個(gè)字節(jié)就刷一次會(huì)很慢。
注意:千萬(wàn)不要用直接與文件讀一個(gè)寫(xiě)一個(gè) 不用緩沖區(qū)逝薪。
字符流讀完字節(jié)查表轉(zhuǎn)字符隅要,如果表里查不到內(nèi)容 會(huì)用未知字符區(qū)的數(shù)據(jù)來(lái)表示 元數(shù)據(jù)和目標(biāo)數(shù)據(jù)不會(huì)一致,所以別用字符流讀非文本文件董济。-
鍵盤錄入步清。
1,讀取鍵盤輸入 System.in 是InputStream對(duì)象虏肾,相當(dāng)于打開(kāi)一個(gè)字節(jié)流文件(當(dāng)個(gè)文件使用就行)廓啊。查看這個(gè)類的方法比如read();clode();關(guān)一次就沒(méi)了別關(guān)。cmd + c是-1封豪。
2谴轮,InputStreamReader 是字節(jié)流通向字符流的橋梁(解碼 硬盤字節(jié)文件到內(nèi)存字符),將字節(jié)流轉(zhuǎn)換成字符流吹埠。想要從鍵盤讀一行书聚,要用緩沖流的readLine()。
2藻雌,OutputStreamWriter 是字符流通向字節(jié)流的橋梁(編碼 內(nèi)存字符到硬盤字節(jié)文件),將字節(jié)流轉(zhuǎn)換成字符流來(lái)使用斩个。用這個(gè)來(lái)輸出記得flush();
3胯杭,總結(jié)起來(lái)四個(gè)點(diǎn):
獲取控制臺(tái)輸入流:InputStream in = System.in;
字節(jié)流變字符流:InputStreamReader isr= new InputStreamReader(in);
對(duì)字符流高效裝飾:BufferedReader bufr = new BufferedReader(isr);
String line = bufr.readLine();
OutputStream out = System.out;
OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bufw = new BufferedWriter(osw);
bufw.write(line.toUpperCase());
記得整合成一條語(yǔ)句。
4受啥,流的操作規(guī)律:
之所以要弄清楚這個(gè)規(guī)律做个,是因?yàn)榱鲗?duì)象太多鸽心,開(kāi)發(fā)時(shí)不知道用哪個(gè)對(duì)象合適。
想要知道開(kāi)發(fā)時(shí)用到哪些對(duì)象居暖。只要通過(guò)四個(gè)明確即可顽频。
(1) 明確源和目的(匯)
源:InputStream Reader
目的:OutputStream Writer(2) 明確數(shù)據(jù)是否是純文本數(shù)據(jù)。
源:是純文本:Reader
否:InputStream
目的:是純文本 Writer
否:OutputStream(3) 明確具體的設(shè)備太闺。
源設(shè)備:
硬盤:File
鍵盤:System.in
內(nèi)存:數(shù)組
網(wǎng)絡(luò):Socket流目的設(shè)備:
硬盤:File
控制臺(tái):System.out
內(nèi)存:數(shù)組
網(wǎng)絡(luò):Socket流(4) 是否需要其他額外功能糯景。
1,是否需要高效(緩沖區(qū));
是省骂,就加上buffer.
2蟀淮,轉(zhuǎn)換。
需求1:復(fù)制一個(gè)文本文件钞澳。
1,明確源和目的怠惶。
源:InputStream Reader
目的:OutputStream Writer
2,是否是純文本?
是轧粟!
源:Reader
目的:Writer
3,明確具體設(shè)備策治。
源:
硬盤:File
目的:
硬盤:File
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
4,需要額外功能嗎?
需要兰吟,需要高效通惫。
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
================================================
需求2:讀取鍵盤錄入信息,并寫(xiě)入到一個(gè)文件中揽祥。
1,明確源和目的讽膏。
源:InputStream Reader
目的:OutputStream Writer
2,是否是純文本呢拄丰?
是府树,
源:Reader
目的:Writer
3,明確設(shè)備
源:
鍵盤料按。System.in
目的:
硬盤奄侠。File
InputStream in = System.in;
FileWriter fw = new FileWriter("b.txt");
這樣做可以完成,但是麻煩载矿。將讀取的字節(jié)數(shù)據(jù)轉(zhuǎn)成字符串垄潮。再由字符流操作。
4闷盔,需要額外功能嗎弯洗?
需要。轉(zhuǎn)換逢勾。 將字節(jié)流轉(zhuǎn)成字符流牡整。因?yàn)槊_的源是Reader,這樣操作文本數(shù)據(jù)做便捷溺拱。
所以要將已有的字節(jié)流轉(zhuǎn)成字符流逃贝。使用字節(jié)-->字符 谣辞。InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
FileWriter fw = new FileWriter("b.txt");
還需要功能嗎?
需要:想高效沐扳。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
===================================================
需求3:將一個(gè)文本文件數(shù)據(jù)顯示在控制臺(tái)上泥从。
1,明確源和目的。
源:InputStream Reader
目的:OutputStream Writer
2沪摄,是否是純文本呢躯嫉?
是,
源:Reader
目的:Writer
3卓起,明確具體設(shè)備
源:
硬盤:File
目的:
控制臺(tái):System.out
FileReader fr = new FileReader("a.txt");
OutputStream out = System.out;//PrintStream
4和敬,需要額外功能嗎?
需要戏阅,轉(zhuǎn)換昼弟。
FileReader fr= new FileReader("a.txt");
OutputStreamWriter osw = new OutputStreamWriter(System.out);
需要,高效奕筐。
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
========================================================
需求4:讀取鍵盤錄入數(shù)據(jù)舱痘,顯示在控制臺(tái)上。
1,明確源和目的离赫。
源:InputStream Reader
目的:OutputStream Writer
2芭逝,是否是純文本呢?
是渊胸,
源:Reader
目的:Writer
3旬盯,明確設(shè)備。
源:
鍵盤:System.in
目的:
控制臺(tái):System.out
InputStream in = System.in;
OutputStream out = System.out;
4翎猛,明確額外功能胖翰?
需要轉(zhuǎn)換,因?yàn)槎际亲止?jié)流切厘,但是操作的卻是文本數(shù)據(jù)萨咳。
所以使用字符流操作起來(lái)更為便捷。
InputStreamReader isr = new InputStreamReader(System.in);
OutputStreamWriter osw = new OutputStreamWriter(System.out);
為了將其高效疫稿。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
========================================================
將一個(gè)中文字符串?dāng)?shù)據(jù)按照指定的編碼表寫(xiě)入到一個(gè)文本文件中.
1培他,目的。OutputStream遗座,Writer
2舀凛,是純文本,Writer途蒋。
3猛遍,設(shè)備:硬盤File
FileWriter fw = new FileWriter("a.txt");
fw.write("你好");
注意:既然需求中已經(jīng)明確了指定編碼表的動(dòng)作。
那就不可以使用FileWriter,因?yàn)镕ileWriter內(nèi)部是使用默認(rèn)的本地碼表螃壤。
只能使用其父類。OutputStreamWriter.
OutputStreamWriter接收一個(gè)字節(jié)輸出流對(duì)象筋帖,既然是操作文件奸晴,那么該對(duì)象應(yīng)該是FileOutputStream
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName);
需要高效嗎?
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName));
問(wèn):那么什么時(shí)候使用轉(zhuǎn)換流呢日麸?
1寄啼,源或者目的對(duì)應(yīng)的設(shè)備是字節(jié)流,但是操作的卻是文本數(shù)據(jù)代箭,可以使用轉(zhuǎn)換作為橋梁墩划。
提高對(duì)文本操作的便捷。
2嗡综,一旦操作文本涉及到具體的指定編碼表時(shí)乙帮,必須使用轉(zhuǎn)換流 。
注意: FileWriter fw = new FileWriter("文件名");
封裝的就是
OutputStreamWrite osw = new OutputStreamWrite(new FileOutputStream("文件名"));
它是為了簡(jiǎn)化書(shū)寫(xiě)极景。所以FileWriter 會(huì)是OutputStreamWrite的子類察净。而前者其實(shí)就是轉(zhuǎn)換流默認(rèn)使用了本機(jī)默認(rèn)碼表,后者可以支持指定特定的碼表盼樟。
簡(jiǎn)單來(lái)說(shuō):字節(jié)流 + 本機(jī)默認(rèn)編碼表(Mac上是UTF-8) 就是是 G饪ā!轉(zhuǎn)換流 == 字符流3拷伞译秦!。這是按照默認(rèn)碼表操作文件的便捷類击碗。UTF-8有3個(gè)字節(jié)表示中文筑悴。
-
FIle類封裝文件或文件夾。 和流不同延都,流對(duì)象只能操作文件上的數(shù)據(jù)雷猪。和File類封裝文件和文件夾成對(duì)象,對(duì)文件和文件夾的屬性信息進(jìn)行操作晰房。File還可以封裝一個(gè)父路徑對(duì)象求摇。其子段可以直接獲取本系統(tǒng)的文件 路徑 行分隔符,F(xiàn)ile.separator == System.getProperties(line.separator);等殊者。
1与境,相對(duì)路徑名:就是默認(rèn)使用當(dāng)前目錄,getParent()獲得的是空猖吴,但是可以用getAbsoluteFile()來(lái)獲得絕對(duì)路徑名或絕對(duì)路徑形式的文件摔刁。絕對(duì)路徑名:具體路徑,getParent()不為空海蔽。
2共屈,可以根據(jù)lastModified()是否改變绑谣,來(lái)讀取一次文件,以獲得最新的文件信息拗引。
3借宵,創(chuàng)建和刪除文件:
(1) 創(chuàng)建文件:File f = File("file.txt"); f.createNewFile();
(2) 創(chuàng)建多級(jí)目錄:mkdirs();
(3) 刪除文件:f.delete();f.deleteOnExit();指定好退出時(shí)刪除文件。對(duì)于有內(nèi)容的文件夾不能刪矾削。
4壤玫,判斷:
(1) 是否存在:f.exists();
(2) 是不是文件 目錄:f.isFile(); f.isDirectory(); 操作作判斷用。
5哼凯, 重命名:f.renameTo(); 抽象路徑名也會(huì)改變欲间,改了路徑名會(huì)導(dǎo)致剪切操作。
6断部,列出文件系統(tǒng)根目錄:File.listRoots();
7猎贴,獲得指定分區(qū)容量情況:getFreeSpace(); getTotalSpace(); getUsableSpace();
8,列出指定路徑下的文件和文件夾:list(); 注意File必須是目錄家坎,否則NullPointerException無(wú)法創(chuàng)建返回值嘱能。
9,帶過(guò)濾器的列出文件:
接口 FilenameFilter accept()實(shí)現(xiàn)這方法虱疏。list(new FilterbyName()); 實(shí)現(xiàn)時(shí)可以創(chuàng)建一個(gè)成員變量惹骂,來(lái)指定要滿足的條件的信息。
10做瞪,列出次抽象路徑名表示的目錄中的文件对粪,不是文件名; listFiles();
11,刪除一個(gè)帶內(nèi)容的目錄装蓬。必須用(遞歸)深度遍歷文件夾 必須從最里面往外刪著拭, -
Properties類。Map里有個(gè)HashTable可以和IO流相結(jié)合牍帚,HashTable 的子類Properties 是一個(gè)沒(méi)有泛型的類儡遮,其結(jié)構(gòu)是:
Map
|---HashTable
|---|---Properties:
.
Properties特點(diǎn):
1,該集合中的鍵和值都是字符串類型暗赶。
2鄙币,集合中的數(shù)據(jù)可以保存到流中,或者從流獲取蹂随。
.
通常該集合用于操作以鍵值對(duì)形式存在的配置文件 xml sql十嘿。
.
Properties集合的操作:
1,存 setProperty("xx", "xx");
2岳锁,取 getProperty("xx");
3绩衷,取出所有 stringPropertyNmaes();
4,改 setProperty("xx", "xx");
5,與IO結(jié)合 list() 可以將列表信息輸出到對(duì)應(yīng)的流咳燕。比如打印到控制臺(tái)上勿决。 System.getProperties()返回的就是這個(gè)類,可以直接list到輸出流招盲。
6剥险,數(shù)據(jù)持久化 存儲(chǔ)到硬盤上 store(x, "xx");
7,讀取文件上的屬性信息宪肖,要求:
--集合中的數(shù)據(jù)來(lái)自一個(gè)文件,保證數(shù)據(jù)是鍵值對(duì)健爬,使用讀取流控乾。
load() 可以將文件中的鍵值對(duì)信息加載到Prop對(duì)象上。
讀行并按=切就可以模擬load()方法娜遵。
8蜕衡,操作讀取或?qū)懭胛募r(shí),可以先封裝成File來(lái)看這個(gè)抽象路徑名是否存在设拟,不存在可以新建慨仿,這樣就不會(huì)在讀取的時(shí)候報(bào)錯(cuò)。
9纳胧,常用來(lái)修改一個(gè)配置文件信息镰吆,先用讀取字符流讀進(jìn)prop,再用輸出字符流重寫(xiě)整個(gè)配置文件跑慕。
10万皿,map + io = Properties
11,簡(jiǎn)單的配置文件用Properties鍵值對(duì)核行,復(fù)雜的用.xml文件牢硅。 -
打印流PrintWriter PrintStream --可以直接操作輸入流和文件。PrintSteam 唯一一個(gè)不拋IO異常的IO對(duì)象芝雪,字符流用PrintWriter减余。
---提供打印方法可以對(duì)多種數(shù)據(jù)類型值進(jìn)行打印。并保持?jǐn)?shù)據(jù)的表示形式惩系。
---他不會(huì)拋IOException
其構(gòu)造函數(shù)位岔,接受三種數(shù)據(jù)類型:
---字符串路徑
---File文件
---字節(jié)輸出流
PrintWriter功能和PrintStream功能基本一樣,就多了一個(gè)接受Writer類的構(gòu)造函數(shù)蛆挫。 -
序列流SequenceInputStream --對(duì)多個(gè)流進(jìn)行合并赃承。
---對(duì)于字節(jié)輸入流,可以用數(shù)組來(lái)直接讀取悴侵,read(b);返回值是讀入的數(shù)據(jù)長(zhǎng)度瞧剖,無(wú)數(shù)據(jù)可讀返-1。