Java學(xué)習(xí)筆記_2

  1. 多線程皆愉。線程是進(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ù)膨疏。

  2. 實(shí)現(xiàn)Runnable接口的好處:
    1一睁,將線程任務(wù)封裝成對(duì)象,面向?qū)ο蟮乃枷?br> 2佃却,避免單繼承的局限性者吁。

  3. 同步代碼塊 同步函數(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);有異常要拋 interruptedException

  4. Thread(同一個(gè)對(duì)象)多次.start會(huì)再運(yùn)行一次對(duì)象的run(),對(duì)象的內(nèi)部變量不會(huì)初始化儒喊。

  5. 字節(jié)碼文件所屬對(duì)象镣奋。JVM把所有類都封裝成對(duì)象,用對(duì)象.getclass() 或者 類名.class 調(diào)用這個(gè)屬性來(lái)獲得該對(duì)象怀愧,在用到靜態(tài)同步函數(shù)的鎖會(huì)碰到侨颈。

  6. 多線程通信。多個(gè)線程在處理同一個(gè)資源芯义,但是任務(wù)卻不同哈垢,可能一個(gè)寫(xiě),一個(gè)讀扛拨。
    1.創(chuàng)建資源耘分。2.創(chuàng)建任務(wù)匣椰。3.創(chuàng)建線程驮俗,執(zhí)行任務(wù)哎甲。4.開(kāi)啟線程青自。

  7. 如何實(shí)現(xiàn)對(duì)象之間共享數(shù)據(jù)蚀同。除了靜態(tài)堪滨,單例桑驱,還可以用傳參的方式将塑,就是用一個(gè)私有成員某類變量北启,在構(gòu)造函數(shù)中傳入一個(gè)對(duì)象初始化這個(gè)成員變量卜朗。

  8. 等待和喚醒機(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一ⅰ!篙梢!

  9. final變量的初始化引用方法見(jiàn)此
    分靜態(tài)和非靜態(tài)final類型變量顷帖,要么直接初始化,要么構(gòu)造函數(shù)初始化渤滞,要么構(gòu)造代碼塊初始化。

  10. 同步的顯示鎖方式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),不釋放鎖椅文。

  11. 停止線程
    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萌丈,記得要處理赞哗。

  12. 線程其他方法
    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ò)膛虫。

  13. eclipse快捷鍵1
    eclipse快捷鍵2

  14. 字符串。字符串是不可變的令杈。
    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ù)。

  1. F3顯示源代碼担平,cmd + 鼠標(biāo)也可以進(jìn)入聲明等內(nèi)容示绊,按cmd + [返回
    cmd + shift + f代碼格式化

  2. 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);

  3. StringBuilder與StringBuffer用法兼容榕莺。不同點(diǎn)在于前者不保證同步,多線程里不安全柑船,后者保證同步和多線程安全帽撑。前者是JDK1.5才出現(xiàn),后者JDK1.0就出現(xiàn)了鞍时。前者優(yōu)點(diǎn)是速度快 用于單線程亏拉,后者加了同步鎖比較慢 用于多線程。

  4. 基本數(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è)最常用!

  5. 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ò)。

  6. 集合框架雨涛。存儲(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]正相反狮斗。

  7. 常用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*。

  8. 泛型狼荞。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í)拢切,可以用下限蒂萎。

  9. 綜上,集合選擇的技巧
    需要唯一嗎淮椰?
    需要:Set
    ---需要定制順序:
    ------需要:TreeSet
    ------不需要:HashSet
    ------但是想要一個(gè)和存儲(chǔ)一致的順序(有序):LinkedHashSet
    不需要:List
    ---需要頻繁增刪嗎五慈?
    ------需要:LinkedList
    ------不需要:ArrayList
    具體集合中源碼及其原理解析看這個(gè)博客

  10. 集合框架的工具類:有 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)行限定堕担,就是不允許增刪已慢。

  11. 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)單列就可以用了。

  12. 函數(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()方法。

  13. 靜態(tài)導(dǎo)入兜畸。import static java.util.Collections.sort; 其實(shí)是導(dǎo)入類中的靜態(tài)成員匈勋。如果名字沖突,那么一定要加包名膳叨。靜態(tài)導(dǎo)入用的不多。

  14. **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)懸停。

  15. 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)程秘遏。

  16. Math類:提供了操作數(shù)學(xué)運(yùn)算的方法。都是靜態(tài)的嘉竟。有:
    1邦危,ceil();floor();round();
    2,max();min();pow();
    3舍扰,random(); util里有Random類倦蚪,更豐富的方法。比如new Random().nextInt(6) + 1;

  17. 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()方法固歪。

  18. 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年溉箕,操作月也類似晦墙。

  19. 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ì)一致,所以別用字符流讀非文本文件董济。

  20. 鍵盤錄入步清。
    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é)表示中文筑悴。

  1. 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)容的目錄装蓬。必須用(遞歸)深度遍歷文件夾 必須從最里面往外刪著拭,
  2. 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文件牢硅。
  3. 打印流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ù)蛆挫。
  4. 序列流SequenceInputStream --對(duì)多個(gè)流進(jìn)行合并赃承。
    ---對(duì)于字節(jié)輸入流,可以用數(shù)組來(lái)直接讀取悴侵,read(b);返回值是讀入的數(shù)據(jù)長(zhǎng)度瞧剖,無(wú)數(shù)據(jù)可讀返-1。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抓于,隨后出現(xiàn)的幾起案子做粤,更是在濱河造成了極大的恐慌,老刑警劉巖捉撮,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怕品,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巾遭,警方通過(guò)查閱死者的電腦和手機(jī)肉康,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)灼舍,“玉大人吼和,你說(shuō)我怎么就攤上這事∑锼兀” “怎么了炫乓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)献丑。 經(jīng)常有香客問(wèn)我末捣,道長(zhǎng),這世上最難降的妖魔是什么创橄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任箩做,我火速辦了婚禮,結(jié)果婚禮上妥畏,老公的妹妹穿的比我還像新娘卒茬。我一直安慰自己,他們只是感情好咖熟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布圃酵。 她就那樣靜靜地躺著,像睡著了一般馍管。 火紅的嫁衣襯著肌膚如雪郭赐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天确沸,我揣著相機(jī)與錄音捌锭,去河邊找鬼。 笑死罗捎,一個(gè)胖子當(dāng)著我的面吹牛观谦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桨菜,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼豁状,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捉偏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泻红,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤夭禽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谊路,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體讹躯,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年缠劝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了潮梯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惨恭,死狀恐怖酷麦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喉恋,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布母廷,位于F島的核電站轻黑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琴昆。R本人自食惡果不足惜氓鄙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望业舍。 院中可真熱鬧抖拦,春花似錦、人聲如沸舷暮。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)下面。三九已至复颈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沥割,已是汗流浹背耗啦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留机杜,地道東北人帜讲。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像椒拗,于是被迫代替她去往敵國(guó)和親似将。 傳聞我的和親對(duì)象是個(gè)殘疾皇子获黔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,952評(píng)論 1 18
  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來(lái)依藍(lán)閱讀 7,335評(píng)論 3 87
  • 寫(xiě)在前面的話: 這篇博客是我從這里“轉(zhuǎn)載”的,為什么轉(zhuǎn)載兩個(gè)字加“”呢玩郊?因?yàn)檫@絕不是簡(jiǎn)單的復(fù)制粘貼肢执,我花了五六個(gè)小...
    SmartSean閱讀 4,711評(píng)論 12 45
  • 本文主要講了java中多線程的使用方法、線程同步译红、線程數(shù)據(jù)傳遞预茄、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等侦厚。 首先講...
    李欣陽(yáng)閱讀 2,442評(píng)論 1 15
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法耻陕,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法刨沦,繼承相關(guān)的語(yǔ)法诗宣,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,587評(píng)論 18 399