JAvaSE學(xué)習(xí)筆記02_第1頁(yè)
JAvaSE學(xué)習(xí)筆記02_第2頁(yè)
JAvaSE學(xué)習(xí)筆記02_第3頁(yè)
JAvaSE學(xué)習(xí)筆記02_第4頁(yè)
JAvaSE學(xué)習(xí)筆記02_第5頁(yè)
已閱讀5頁(yè),還剩14頁(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)介

1、1.增強(qiáng)for循環(huán)。也叫新循環(huán),增強(qiáng)循環(huán)2.增強(qiáng)for循環(huán),就是為了遍歷數(shù)組和集合用的。 For(元素類型 e : 集合或數(shù)組) 循環(huán)體 新循環(huán)并非是新的語(yǔ)法,而是在編譯過(guò)程中,編譯器會(huì)將新循環(huán) 轉(zhuǎn)換成迭代器模式,所以循環(huán)本質(zhì)是迭代器 在這個(gè)新循環(huán)的時(shí)候,也不能用集合的方法去修改集合的元素的個(gè)數(shù)。 新循環(huán)遍歷集合的時(shí)候,接收數(shù)據(jù)的類型要用Object。因?yàn)榧?中可以放任何數(shù)據(jù)的類型3. 新循環(huán)是不關(guān)心循環(huán)次數(shù)的4. 泛型:在java5以后才推出的泛型只能是引用類型:所以不能之際寫in類型的,執(zhí)行寫Integer Collection<Integer> c = new ArrayL

2、ist<Intger>();泛型的作用在于,約束這個(gè)集合中只能存放什么類型的數(shù)據(jù)實(shí)際上:泛型是假的Collection<String> c = new ArrayList<String>();在這我們定義的是String類型的,當(dāng)我們?cè)诓迦胫档臅r(shí)候C.add(“a”);/實(shí)際上不是直接存入字符串,只是編譯器提醒 我們要傳入字符串。但是在創(chuàng)建了這個(gè)集合的對(duì)象的時(shí)候,保存的還是Object類型的,我們傳入的Object類型的,但是當(dāng)我們輸出的時(shí)候會(huì)幫我們強(qiáng)轉(zhuǎn)為我們泛型中指定的類型所以泛型的本質(zhì)是Object類型的5. 泛型:注:泛型是假的 泛型的屬性其本質(zhì)就是O

3、bject類型的,只不過(guò)我們?cè)诰幾g程序的時(shí)候, Java編譯器在幫我們檢查師門實(shí)際用到屬性時(shí)給定的類型是否正確 在獲取泛型的值時(shí),java虛擬機(jī)幫我們做了一次強(qiáng)轉(zhuǎn)類型轉(zhuǎn)換而已 是在get方法的返回值上進(jìn)行的強(qiáng)轉(zhuǎn)。6. List集合 List是可重復(fù)集合:有兩個(gè)實(shí)現(xiàn)了ArrayList , LinkedList7. ArrayList:內(nèi)部就是一個(gè)數(shù)組實(shí)現(xiàn)的8. LinkedList:內(nèi)部就是一個(gè)鏈表實(shí)現(xiàn)的:鏈表分單向鏈表和循環(huán)鏈表 單向鏈表就是首尾不相連,循環(huán)鏈表就是首尾相連的。 鏈表結(jié)構(gòu)的增刪非常適合。就像我們自行車的鏈條一樣,增刪方便。 但是ArrayList的數(shù)組實(shí)現(xiàn)的,增刪就非常不方便

4、,刪除了一個(gè)。 后面的都有跟著動(dòng)。但是鏈表的查詢比較慢。 所以ArrayList,與LinkedList兩個(gè)集合的作用,方法都一樣。只是性能不一樣9. List繼承了Collecion的方法之外還有有其他的方法。是Set也沒(méi)有的 其中就有,List可以用下標(biāo)去操作元素,Set集合就沒(méi)有10. List集合的set();方法。輸入一個(gè)下標(biāo)和一個(gè)元素。作用是指定下標(biāo)傳入指定值。 但是注意了,它會(huì)把你傳入的下標(biāo)的值給替換成了你新傳入的值。 有個(gè)返回值,就是被你替換了的那個(gè)元素。沒(méi)有的下標(biāo)是不能替換的 get();方法的作用是,輸入一個(gè)下標(biāo)得到這個(gè)下標(biāo)的值。下標(biāo)也是從0開(kāi)始的 get();方法只有Li

5、st才有,Collection中就沒(méi)11. List集合的add方法;傳入兩個(gè)值。如果在已有的元素的下標(biāo)下添加一個(gè)元素 那么會(huì)把原有的元素往后擠。12. List集合的remove方法;傳入一個(gè)下標(biāo)刪除一個(gè)元素。返回值就是我們 刪除的那個(gè)元素。這個(gè)可以告訴我們刪除了什么元素,因?yàn)槲覀冎粋魅肓讼聵?biāo) Collection刪除的remove方法沒(méi)有返回值,因?yàn)?在Collection中的remove方法是根據(jù)傳入一個(gè)元素來(lái)刪除的,不是因?yàn)?傳入下標(biāo)來(lái)刪除元素。13. List的subList();方法傳入兩個(gè)下標(biāo)截取一定范圍的元素。 返回的又是一個(gè)新的集合,所以我們接收要用新的集合來(lái)接收 如:Lis

6、t<Integer> list2 = list.subList(3,7);System.out.println(list2); /list2相當(dāng)于list集合的子集合14. 如果一個(gè)List集合中放的數(shù)字,要把集合中的每個(gè)元素都乘以10 如:list這個(gè)集合中方法Integer類型的,3,4,5,6 。要把這幾個(gè)元素 乘以是,可以用for循環(huán),用集合的get方法,根據(jù)下標(biāo)取出每一個(gè) 元素,乘以10之后。在用list集合的set方法來(lái),根據(jù)下標(biāo)替換元素。 注:在上面的13,中的subList方法,對(duì)list集合進(jìn)行了截取一部分放到 新的集合list2中去,但是我們把list2中的元素

7、的值都替換成了乘以 10的元素,那么list集合中的對(duì)應(yīng)的元素也會(huì)跟著乘以10, 會(huì)改變父類元素。15. List,通過(guò)toArray();方法把集合轉(zhuǎn)換成數(shù)組 注:這個(gè)方法是Collection中的,所以Set集合也是能用,只是轉(zhuǎn)換成Set 以后,這個(gè)數(shù)組就沒(méi)有以前的順序了。 在注:這個(gè)方法返回的是一個(gè)Object類型的數(shù)組。想要得到我們想要的類型 的數(shù)組還需要轉(zhuǎn)化. 用強(qiáng)轉(zhuǎn)。如: Object ob = list.toArray();/得到list集合轉(zhuǎn)換的數(shù)組。 for(Object o : ob) String str = (String)o; System.out.println(s

8、tr); 如果我們一個(gè)list集合是String類型的,我們要直接轉(zhuǎn)換成String 類型的數(shù)組用方法:String tostr = list.toArray(new Stringlist.size(); /這個(gè)方法只要傳入一個(gè)參數(shù)就可以了。 傳入的是生成這個(gè)數(shù)組的長(zhǎng)度,如果這個(gè)長(zhǎng)度你傳入的值不能滿足 list這個(gè)集合的長(zhǎng)度,那么系統(tǒng)會(huì)自動(dòng)給我們一個(gè)長(zhǎng)度。數(shù)組的類型 是參照我們給定數(shù)組的類型,給的長(zhǎng)度。但是這樣不提倡16. 數(shù)組的工具類。Arrays類。其中sort用于排序;Arrays.sort() 其中:Arrays.asList();這個(gè)方法傳入一個(gè)數(shù)組。把這個(gè)數(shù)組轉(zhuǎn)換成List集合 返

9、回值是list集合。其中注意是不能轉(zhuǎn)換成Set的。如果轉(zhuǎn)換成了Set 集合的話,要是這個(gè)數(shù)組中有兩個(gè)相同的元素,那么會(huì)出現(xiàn)丟數(shù)據(jù) 的現(xiàn)象。 List<String> list = Array.asList(array數(shù)組); 注意:如果把一個(gè)數(shù)組轉(zhuǎn)換成了集合后,這個(gè)集合不能用,添加和刪除的方法 因?yàn)檫@個(gè)集合繼承了數(shù)組的特性。 如果用list集合的set方法,根據(jù)下標(biāo)替換了一個(gè)元素,那么數(shù)組中的 元素也會(huì)因此而改變。17. 想要把一個(gè)數(shù)組直接輸出,也需要用數(shù)組的工具類ArraysJava中是沒(méi)有數(shù)組的,java中的數(shù)組都是靠Array類去實(shí)現(xiàn)的。Array這個(gè)類是靠C語(yǔ)言去實(shí)現(xiàn)的,A

10、rray是數(shù)組類的實(shí)現(xiàn)類,Arrays是工具類 用這個(gè)類重寫了toString();的toString();方法。 System.out.println(Arrays.toString(傳入一個(gè)數(shù)組);18. 集合的復(fù)制 所有的集合的實(shí)現(xiàn)類都支持一個(gè)構(gòu)造方法,該構(gòu)造方法傳入一個(gè)Collection 那么該構(gòu)造方法創(chuàng)建出來(lái)的集合默認(rèn)就添加了給定集合中的所有的元素,這樣的構(gòu)造方法叫做復(fù)制構(gòu)造器: 已經(jīng)有集合list 如:List list2 = new ArrayList(list); Set set = new HashSet(list); list集合復(fù)制到Set集合也是可以的,Set集合復(fù)制

11、到list集合也是可以的 但是list復(fù)制到set存在很到的數(shù)據(jù)丟失的風(fēng)險(xiǎn)。19.集合的工具了Collections Collection是集合的父接口,Collections是集合的父接口20. 集合的排序方法。使用集合的工具類Collections中的sort();方法 Collections.sort();該方法傳入一個(gè)集合21.Comparable 接口,實(shí)現(xiàn)他的compareTo();方法。這個(gè)方法返回一個(gè)int值 這個(gè)int中大于0的時(shí)候,說(shuō)明當(dāng)前對(duì)象大于給定的值,小于0說(shuō)明當(dāng)前對(duì)象 小于給定值,等于0的時(shí)候說(shuō)明當(dāng)前對(duì)象等于給定的值。 注Comparable接口的作用。是對(duì)一些不是

12、具體的值進(jìn)行排序用的 如以下代碼: public class Point implements Comparable<Point>private int x; /實(shí)現(xiàn)這個(gè)接口傳入一個(gè)泛型,讓這個(gè)接口的實(shí)現(xiàn)方法private int y; /能直接用這個(gè)類型進(jìn)行比較。public Point(int x,int y)this.x=x;this.y=y;Overridepublic String toString() return "("+x+","+y+")"Overridepublic int compareTo(Poin

13、t o) int len = this.x*this.x+this.y*this.y;int lenl = o.x*o.x+o.y*o.y;return len-lenl; 實(shí)現(xiàn)類 public class ListDemo7 public static void main(String args) List<Point> list = new ArrayList<Point>();list.add(new Point(1,2);list.add(new Point(33,4);list.add(new Point(15,6);list.add(new Point(72

14、,8);System.out.println(list);Collections.sort(list);System.out.println(list); 如果我們沒(méi)有在實(shí)體類中實(shí)現(xiàn)Comparable接口,那么我們出入的值就沒(méi)法比較 如果我們實(shí)現(xiàn)了這個(gè)接口,實(shí)現(xiàn)了它的方法。這個(gè)方法就是用于這些比較的 其中:int len = this.x*this.x+this.y*this.y; int lenl = o.x*o.x+o.y*o.y; return len-lenl; 我們通過(guò)返回的值來(lái)進(jìn)行比較。原理是由x,y值。兩個(gè)值變成一個(gè)點(diǎn) 這個(gè)點(diǎn)到原點(diǎn)的距離做比較。這個(gè)通過(guò)原理得到的值來(lái)比較大小。

15、22. 如果傳入集合中的是中文的字符串的話,排序方法是 調(diào)用Collections.sort();/的重載方法,出入兩個(gè)參數(shù) 第一個(gè)參數(shù)是要排序的集合,第二個(gè)參數(shù)是比較規(guī)則 如下代碼:實(shí)現(xiàn)字符串的排序,我們用字符串長(zhǎng)度排序 public static void main(String args) List<String> list = new ArrayList<String>();MyComparator m = new MyComparator();list.add("張");list.add("張三2555");list.a

16、dd("張三33");list.add("張三4");Collections.sort(list,m);System.out.println(list); class MyComparator implements Comparator<String> public int compare(String o1, String o2) return o1.length()-o2.length();23.隊(duì)列 Queue LinkedList是隊(duì)列的實(shí)現(xiàn)類,ArrayList不是 隊(duì)列添加元素用offer();方法 Queue<String

17、> queue = new LinkedList<String>();queue.offer("a"); 添加添加元素到隊(duì)列用offer();方法。提取出來(lái)用queue.poll();方法, poll();方法的返回值類型是我們用offer();方法傳入值時(shí)候的類型。 poll();方法是出隊(duì),當(dāng)調(diào)用這個(gè)方法之后。這個(gè)隊(duì)列中就沒(méi)有這個(gè)元素了 。出隊(duì)順序是從第一個(gè)開(kāi)始出。因?yàn)殛?duì)列只有一個(gè)一個(gè)出隊(duì) 當(dāng)我們只是想引用隊(duì)列中的第一個(gè)元素的時(shí)候,而不是讓這個(gè)元素從隊(duì)列中出來(lái) 我們用方法peek();這個(gè)方法就不會(huì)改變隊(duì)列中元素的個(gè)數(shù)。這個(gè)方法的返回值 跟poll()

18、;方法的返回值一樣 注:我們?nèi)绻闅vqueue這個(gè)集合的時(shí)候,用for循環(huán)加poll();方法 for(int a=queue.size();a>0;a-) /問(wèn)什么寫這樣的循環(huán)是因?yàn)?,?duì)列取一個(gè)元素就少一個(gè)元素。 如果按常用的for循環(huán),寫的a<queue.size()的長(zhǎng)度的話, 這個(gè)長(zhǎng)度會(huì)不斷的變,最后就會(huì)取不完一些值。 所以我們一般遍歷隊(duì)列的時(shí)候用while循環(huán),而不用for循環(huán) 只要在while中的條件判斷queue.size();是不是大于0進(jìn)可以了第二天1. 雙端隊(duì)列: Deque:雙端隊(duì)列與隊(duì)列Queue的區(qū)別在于,雙端隊(duì)列兩端都可以進(jìn)出隊(duì)列 當(dāng)我們對(duì)雙端隊(duì)列進(jìn)行

19、限制的時(shí)候,限制為只能從一端進(jìn)出隊(duì)列。不能 從雙端進(jìn)出。這樣就形成了,經(jīng)典數(shù)據(jù)結(jié)構(gòu):棧: 雙端隊(duì)列的實(shí)現(xiàn)類也是LinkedList Deque<String> stack = new LinkedList<String>(); 雙端隊(duì)列,放元素的方法是:stack.push(“one);/push=添加 放進(jìn)去的元素,第一個(gè)放進(jìn)去的放在最后。 雙端隊(duì)列的pop();方法跟隊(duì)列Queue的poll方法一樣,都是取出并刪除 元素。2. Map:Map本身是一個(gè)接口。它不是一個(gè)集合,跟Collection沒(méi)什么關(guān)系 Map看起來(lái)像是一個(gè)多行兩列的表格,以key,value成對(duì)

20、的形式保存 注:在Map中key是不能重復(fù)的,如果我們?cè)俅斡胮ut();方法 往map中添加key相同的值,那么就會(huì)把以前對(duì)應(yīng)的value 替換成新的value的值。3.Map的實(shí)現(xiàn)類時(shí)HashMap4.Map的put()方法;是往Map中存儲(chǔ)元素的方法。這個(gè)方法需要傳入兩個(gè)參數(shù) 一個(gè)參數(shù)是Key,一個(gè)參數(shù)是value Map<String,Integer> map = new HashMap<String,Integer>(); map.put(“語(yǔ)文”,80); 注:在Map中如果key不存在的時(shí)候,會(huì)將key和value存入到Map中去,返回值 是一個(gè)null。所

21、以,如果value是一個(gè)包裝類型的值的時(shí)候,我們?cè)讷@取put 的返回值的時(shí)候,也要用包裝類型去接收,而不能用基本類型,不然可能會(huì)發(fā)生 空指針異常。 如果key已經(jīng)有了的情況下添加進(jìn)去的話,返回的就是value的值。5. Map:直接用System.out.println(map);輸出,Map本身是重寫了toString的 可以直接輸出Map6. Map:中獲得元素的方式是根據(jù)給定的key,來(lái)獲取對(duì)應(yīng)的value的,若給定的 可以再map中不存在,則返回值為null。只是獲得,但是不會(huì)刪除 用get();方法獲取元素:map.get(“語(yǔ)文”);/返回的是語(yǔ)文對(duì)應(yīng)的成績(jī) 返回的值,我們接收的時(shí)

22、候要注意,如果是包裝類型注入的值,我們也用 包裝類來(lái)接收 7.Map:中刪除元素的方法,remove();/傳入一個(gè)key,根據(jù)key刪除對(duì)應(yīng)的value 。在這若對(duì)應(yīng)的key存在,那么這個(gè)方法的返回值則是這個(gè)key對(duì)應(yīng)的值 如果我們傳入的key不存在,那么返回值則是null。所在這個(gè)的返回值 也要用包裝類來(lái)接收。8. Map:的containsKey();方法。這個(gè)方法傳入一個(gè)key值。來(lái)驗(yàn)證這個(gè)map中 是不是存在這個(gè)key值,存在返回true,不存在返回false。9.Map:中的key對(duì)應(yīng)一個(gè)hashCode值,當(dāng)我們用map的get方法的時(shí)候 傳入的key值,那么程序會(huì)直接去找key

23、的hashCode值。10. 使用HashMap的注意事項(xiàng): 我們應(yīng)該盡量保證,不相同的key,hashCode()值也要不相同。不然會(huì)大大的降低HashMap的解鎖方法。如果兩個(gè)對(duì)象equals比較返回true,那么這兩個(gè)對(duì)象的hashCode值就相同在java中,我們?cè)谥貙慹quals的時(shí)候,也要對(duì)應(yīng)的重寫hashCode方法。 HashCode();是一個(gè)方法。11. 遍歷Map中的所以key,:調(diào)用的是keySet();方法: 這個(gè)方法返回的是一個(gè)Set集合。返回的是Set集合是因?yàn)镸ap的Key跟 Set集合一樣,都是無(wú)序的,不能重復(fù)的。Set<String> Set的泛

24、型是字符串類型 這個(gè)類型是跟Map中的key對(duì)應(yīng)的。12. Map:的entrySet();方法;返回的Set集合,這個(gè)Set<Entry>的泛型是Entry 類型的;這時(shí)候Set集合中存放的是Entry的鍵值對(duì)(鍵值對(duì):就是一個(gè) 鍵值對(duì)中保存著一個(gè)組數(shù)據(jù),包含了Map中key,value。 在這注意:Entry還要加一個(gè)泛型 如:Set<Entry<String,Integer>> entry = map.entrySet(); Entry約束的Set中存放的數(shù)據(jù)的類型,Entry<>中的泛型。是根據(jù) Map中的泛型來(lái)的,因?yàn)閑ntry中存的是

25、map的鍵值對(duì)。是用來(lái)約束 Entry中的數(shù)據(jù)的類型的。所以在這我們都要用遍歷器,先遍歷Set集合得到Entry<String,Integer>然后再?gòu)腅ntry中得到key,value Set<Entry<String,Integer>> entry = map.entrySet();Iterator<Entry<String,Integer>> it = entry.iterator();while(it.hasNext()Entry<String,Integer> en = it.next();String key

26、= en.getKey();int value = en.getValue();System.out.println("key:"+key+"-value:"+value);13. Map中遍歷所有的value,不常用:方法是values(); 返回的Collection集合類型的 Collection<Integer> values = map.values();for(int value : values)System.out.println(value);14. 有序的Map:LinkedHashMap<> 因?yàn)橛行?,所以?/p>

27、率比HashMap要低。用LinkedHashMap創(chuàng)建 的Map。輸出的順序,就與插入的時(shí)候的順序一樣。 使用與HashMap是一樣的15. File類:文件操作類 /在Myeclipse中"."表示當(dāng)前項(xiàng)目的根目錄File file = new File(".demo.txt"); 在windows中的層級(jí)分隔符是.在liux中的層級(jí)分隔符是/ 所以在寫一個(gè)java程序,要在Windows和Linx中都能運(yùn)行 那么層級(jí)分隔符可以用方法File.separator 如:File file = new File("."+File.se

28、parator+"demo.txt"); 在Windows中注意。有的時(shí)候后綴名是隱藏的。16.通過(guò)File,我們可以獲取文件或目錄的屬性信息(文件名,站多少字節(jié)等信息), 或者操作文件或目錄(創(chuàng)建,刪除)。但是不能對(duì)文件的內(nèi)容進(jìn)行修改17. 調(diào)用File的isFile();方法。可以獲得這個(gè)文件是,文本文件還是目錄 返回的是true,表示是這個(gè)文件是一個(gè)文本文件。18.調(diào)用File的getName();方法可以獲得這個(gè)文件的名字19.File的length();方法。獲取當(dāng)前文件占用的字節(jié)量。返回的是一個(gè)long值20.File的lastModified();方法??梢缘?/p>

29、到這個(gè)文本文件最后修改的時(shí)間。 返回的是一個(gè)long值的毫秒值。21. File的其他不常用的方法:canRead();/查看這個(gè)文件是否可讀 canWrite();/ 可寫 canExecute();/ 可運(yùn)行 isHidden();/ 是否為影藏文件22. 怎么用File在硬盤中創(chuàng)建一個(gè)文本文件:用createNewFile();方法 代碼如:/在當(dāng)前項(xiàng)目的根目錄下創(chuàng)建一個(gè)叫名問(wèn)test.txt的文件File file = new File("test.txt");if(!file.exists()/現(xiàn)在這判斷這個(gè)文件是否不存在,不在才創(chuàng)建file.createNewF

30、ile();System.out.println("創(chuàng)建文件成功"); Windows中創(chuàng)建文件,目錄寫 "D:"+File.separator+"zheng.txt"23. 刪除硬盤中的一個(gè)文本文件用delete();方法。這個(gè)方法不要傳入?yún)?shù) 這個(gè)也是要用exists();方法判斷下這個(gè)文件是不是存在,再刪除 注意:這個(gè)刪除,在回收站中都已經(jīng)沒(méi)有了24. File file = new File(“test.txt”);/我們?cè)谶@寫這個(gè)文件的名字與路徑 但是我們下面對(duì)這些文件的的方法操作不用傳參數(shù)。那是因?yàn)椤?都根據(jù)我們?cè)谶@傳的信

31、息去找文件了。25.File對(duì)目錄的操作 File dir = new File(“文件名”); 通過(guò)File的isDirectory();方法判斷這個(gè)文件是否是一個(gè)目錄26. File中創(chuàng)建目錄通過(guò)方法:mkdir(); 最好也是用exists();方法判斷下這個(gè)目錄是不是存在。27.File中刪除目錄通過(guò)方法:delete();這個(gè)與刪除文本文件一樣28.File中的mkdir();與mkdirs();方法的區(qū)別在于。mkdir();方法只能一次創(chuàng)建 一個(gè)目錄。而mkdirs();能一次創(chuàng)建多級(jí)目錄 如:File dir = new File("a"+File.sepa

32、rator+"b"+File.separator+ "c"+File.separator+"d"+File.separator+"e"+File.separator+"f");if(!dir.exists()dir.mkdirs();System.out.println("創(chuàng)建f目錄成功");/這個(gè)方法能幫我們把f目錄的上級(jí)沒(méi)有的目錄都創(chuàng)建出來(lái)29. File中創(chuàng)建多級(jí)目錄的方法已經(jīng)講了 但是我們用delete刪除一個(gè)目錄的時(shí)候,如果這個(gè)目錄中有類容就會(huì)刪除不掉。第三天1.怎

33、么用File查詢一個(gè)目錄下,的其他的所有子項(xiàng) 首先判斷這個(gè)文件是一個(gè)目錄還是一個(gè)文本文件用isDirectory();方法 然后在用 listFiles();方法,這個(gè)方法返回的是一個(gè)File ,的數(shù)組 注意這個(gè)方法只能查看下一級(jí)的子項(xiàng),多級(jí)下的就沒(méi)法查 /查看當(dāng)前項(xiàng)目根目錄下的所以子項(xiàng)File dir = new File(".");if(dir.isDirectory()/判斷這個(gè)文件是不是一個(gè)目錄.我們項(xiàng)目的跟目錄是一 File subs = dir.listFiles(); 個(gè)目錄for(File sub : subs)String name = sub.getNa

34、me();long length = sub.length();System.out.println(name+":"+length);2. 文件過(guò)濾:實(shí)現(xiàn)接口FileFileter接口,然后實(shí)現(xiàn)這個(gè)接口的方法 然后我們?cè)谶@個(gè)接口中定義,過(guò)濾條件。 滿足這個(gè)條件的才輸出 File dir = new File("."); if(dir.isDirectory()/創(chuàng)建一個(gè)過(guò)濾器實(shí)例FileFilter filter = new MyFilter();/使用過(guò)濾器,過(guò)濾子項(xiàng)File subs = dir.listFiles(filter);/把過(guò)濾器傳入到

35、查詢子項(xiàng)的方法中for(File sub :subs)System.out.println(sub.getName(); class MyFilter implements FileFilterOverridepublic boolean accept(File file) String name = file.getName();/得到字符串是不是以給定字符開(kāi)頭的boolean b = name.startsWith(".");/以點(diǎn)開(kāi)頭的那么都過(guò)濾掉return b;3. 如果我要?jiǎng)?chuàng)建一個(gè)文本文件,但是這個(gè)文本文件的父目錄都不存在 這個(gè)時(shí)候用file.createNew

36、File();方法創(chuàng)建就會(huì)不成功 我們就要用方法,file.getParentFile();返回的就是一個(gè)目錄,然后再 判斷這個(gè)錄存不存在,不存在就可以先創(chuàng)建目錄,然后在用創(chuàng)建 文本文件的方法創(chuàng)建文本文檔。 如下代碼: File file = new File("a"+File.separator+"b"+File.separator+"c"+File.separator+"d"+File.separator+"e"+File.separator+"f.txt");/* *

37、創(chuàng)建文件時(shí),首先要判斷當(dāng)前這個(gè)文件所在的父目錄是否存在。 * ,因?yàn)槿舨淮嬖冢瑫?huì)拋出異常 */這個(gè)時(shí)候就要先判斷父目錄是不是存在,如果不存在那么就先把父目錄創(chuàng)建出來(lái)File parent = file.getParentFile();if(!parent.exists()parent.mkdirs();if(!file.exists()file.createNewFile();4. RandomAccessFile類:是一個(gè)常用的讀寫文件內(nèi)容的類 這個(gè)類的讀寫是基于指針的操作,這個(gè)類總是在當(dāng)前指針的位置讀寫字節(jié) 使用方法:RandomAccessFile(“一個(gè)文件名,路徑”,”r或rw”);

38、 r表示:只讀。 rw表示:可讀可寫5.向文件中輸出值,用RandomAccessFile 的write();方法 每次使用IO的東西,都要用close();關(guān)閉IO;6. write();方法向文件中寫入值; read();方法從當(dāng)前文件中讀取一個(gè)字節(jié)。返回的是一個(gè)int值。但是一個(gè) Int值是4個(gè)字節(jié),所以這個(gè)讀出來(lái)的int就是只有”低8位”有效。 所以最大就是255.當(dāng)256的時(shí)候就會(huì)讀取不到正確的值,只讀的到低8位的值 若read();方法的返回值是-1的時(shí)候說(shuō)明讀到了文件的末尾。/我們?cè)谟脀rite();方法向文件中寫入個(gè)十進(jìn)制的-1.那么對(duì)于int來(lái)說(shuō)就是32個(gè)1。 在這種情況下的

39、時(shí)候write();方法會(huì)值寫入低8位,那就是8個(gè)1進(jìn)去。那么當(dāng)我們用read(); 方法讀取文件的時(shí)候讀取的就是8個(gè)1.而8個(gè)1代表的值就是2557. 把一個(gè)源文件中的內(nèi)容,讀取并賦值到一個(gè)新的文件中: 方法如下代碼 /原文件只需要能讀就可以 RandomAccessFile raf = new RandomAccessFile("zheng.txt","r"); /原文件只需要能讀就可以RandomAccessFile raf2 = new RandomAccessFile("zheng2.txt","rw")

40、;int a;while(a = raf.read()!=-1)raf2.write(a);raf.close();raf2.close();System.out.println("完畢");在這,我們把zheng.txt這個(gè)文件的內(nèi)容只讀,的讀取出來(lái),用read();方法read();方法每次讀一個(gè)字節(jié)。我們?cè)侔堰@個(gè)字節(jié)值,賦值給變量a。 然后在于write();方法,把a(bǔ)寫入到zheng2.txt這個(gè)文件中注:因?yàn)檫@個(gè)方法每次只讀一個(gè)字節(jié)和寫一個(gè)字節(jié)。所以效率非常的慢 若想提高讀寫效率,那么在讀寫數(shù)據(jù)的時(shí)候,就必須減少讀寫次數(shù), 就不要一次只讀寫一個(gè)字節(jié)了。 在這wri

41、te(byte b);/write還有一個(gè)重載方法,傳入一個(gè)byte數(shù)組, 一次把這個(gè)數(shù)組的內(nèi)容全部寫進(jìn)去。 如果要向文本文件中寫入一個(gè)字符串。用write(byte b);方法那么我們就要先用str.getBytes();/方法。這個(gè)方法返回的是一個(gè)byte 數(shù)組 String str = "我在中國(guó),我在中國(guó),江蘇,蘇州"byte b = str.getBytes();raf.write(b);/然后直接用這個(gè)方法,把字節(jié)傳進(jìn)去 注意:getBytes();方法是以當(dāng)前系統(tǒng)的編碼格式轉(zhuǎn)換成的字節(jié) 我們還能getBytes(“指定一個(gè)編碼格式“); 我們寫入的方法writ

42、e(byte b);方法能傳入一個(gè)字節(jié)數(shù)組。 那么read(byte b);方法也是能傳入一個(gè)字節(jié)數(shù)組,讓讀取也一次從文件 中讀取一個(gè)字節(jié)數(shù)組的量。 代碼如: byte b = new byte50; int len = raf.read(b);/這個(gè)方法只是嘗試著讀50個(gè)字節(jié)。因?yàn)椋?注:我們這個(gè)byte 數(shù)組聲明的是50個(gè)字節(jié),但是有可能讀最后一次 剩下的不足50個(gè)字節(jié)了。那就實(shí)際有多少個(gè)字節(jié)就讀取多少個(gè)字節(jié)。 這個(gè)返回的值len,就是這個(gè)方法實(shí)際上讀取到的字節(jié)。 注:我們寫入文件的時(shí)候用getBytes();方法,傳入一個(gè)編碼格式 把字符串轉(zhuǎn)為字節(jié)數(shù)組。我們也可以用byte b = ne

43、w byte50; int len = raf2.read(b); String str = new String(b,"GBK"); 這個(gè)方法傳入一個(gè)編碼格式,與getBytes() 的編碼格式一樣,來(lái)讀取文件8. 注意:當(dāng)我們用代碼,把一個(gè)源文件中的內(nèi)容寫到新的文件中的時(shí)候, 我們用byte ;字節(jié)數(shù)組,來(lái)提高兩個(gè)文件之間的讀寫效率, 聲明一個(gè)字節(jié)數(shù)組byte b = new byte1024*10;/一次讀取10KB, 然后用方法read(byte b); 傳入這個(gè)字節(jié)數(shù)組,要是不傳入字節(jié)數(shù)組, 那么這個(gè)方法一次只讀取了一個(gè)字節(jié),就要調(diào)用write();方法來(lái)寫入到新

44、的 文件中。所以用read()方法來(lái)讀取文件,傳一個(gè)字節(jié)數(shù)組。這就會(huì)以10KB 一次讀取了以后才寫入到另外一個(gè)新的文件中去,當(dāng)最后一次讀取的時(shí)候 沒(méi)有10KB的時(shí)候,我們可以通過(guò)判斷語(yǔ)句來(lái)驗(yàn)證read();方法的返回值,如果這個(gè)方法的返回值為-1,那么就說(shuō)明。源文件中沒(méi)有內(nèi)容了。 以上是讀取方法要注意的事項(xiàng)。當(dāng)讀取了,我們就要調(diào)用write();方法來(lái)向新文件中寫入數(shù)據(jù),這個(gè)方法也要傳入?yún)?shù),不然的話也會(huì)以一個(gè)字節(jié)一次寫一次的效率寫入新文件中。這二個(gè)方法我們也傳入一個(gè)byte.注意這個(gè)方法除了這個(gè)byte數(shù)組之外還有兩個(gè)參數(shù),他們的作用如下:raf.write(byte ,0,len); 注意

45、:其中byte ;數(shù)組約束了我們一次能存入多少個(gè)字節(jié),但是當(dāng)我們從 源文件中最后一次讀取的字節(jié)量,不足這個(gè)byte數(shù)組約束的字節(jié)量的時(shí)候那么這個(gè)時(shí)候的byte ,的其中一部分會(huì)是我們最后一次新讀取出來(lái)的內(nèi)容, 而還有部分會(huì)是我們上次讀取的內(nèi)容。因?yàn)槲覀兊箶?shù)第二次讀取源文件的 時(shí)候把讀取出來(lái)的內(nèi)容,把倒數(shù)第三次讀取的內(nèi)容在byte,中的內(nèi)容 替換掉。所以我們最后一次我們讀取的時(shí)候,新的內(nèi)容不能替換倒數(shù)第二次讀取的byte數(shù)組中的全部的內(nèi)容。所以我們?cè)谟脀rite();方法把字節(jié)數(shù)組中的內(nèi)容寫入到新文件中的時(shí)候,我們不能把這個(gè)byte 數(shù)組中從0到最后一個(gè)字節(jié)全部寫入。int len = raf2

46、.read(b);raf.write(byte ,0,len);/所以我們用著兩句代碼可以約上其中0 表示從byte數(shù)組的第0個(gè)位置開(kāi)始寫入,len,表示寫入到byte 數(shù)組的len這個(gè)位置。len是用read();方法在源文件中讀取到多少個(gè)字節(jié)返回的一個(gè)值。如果最后一個(gè)讀取,就只讀取到10個(gè)字節(jié),那么len=10那么就只會(huì)寫入0到10個(gè)字節(jié),byte數(shù)組中的其他字節(jié)不會(huì)被寫入。那么這就可以避免,最后一次寫入的時(shí)候會(huì)有點(diǎn)倒數(shù)第二次讀取的部分內(nèi)容。9:我們的write();方法一次只能寫一個(gè)字節(jié)到文件中去,如果我有一個(gè)int 的最大值,int num = Integer.Max. 這個(gè)時(shí)候我們就

47、要注意了: 我們要把整個(gè)int的最大值寫入到文件中,那么就要用>>>這個(gè)符號(hào) ,這個(gè)叫無(wú)符號(hào)有移。 我們就要把 num>>>.來(lái)寫入 raf.write(num>>>24); raf.write(num>>>16); raf.write(num>>>8); raf.write(num>>>0); 當(dāng)然這樣寫非常麻煩。 這時(shí)我們可以用witeInt();方法,還有writDoubel(); writeLong();. 反之:讀取也有readInt();方法第四天1. 遞歸: 有一個(gè)多級(jí)的目

48、錄,用一個(gè)方法來(lái)一次刪除 遞歸的原理就是,再次遇到同樣的情況的時(shí)候,那么就再次調(diào)用這個(gè)方法 而不要再寫循環(huán)。 方法的內(nèi)部再次調(diào)用這個(gè)方法,就叫遞歸 如下代碼: public static void main(String args) File file = new File("tst.txt");deleteFile(file);public static void deleteFile(File file)if(file.isDirectory()/如果這個(gè)文件是目錄/如果是目錄,還要看是否有子項(xiàng)File subs = file.listFiles();/先刪除所有子項(xiàng)f

49、or(File sub : subs)deleteFile(sub);/如果sub下面還有目錄,那么就再次調(diào)用這個(gè)方法file.delete();/如果不是目錄是文件,那么就不會(huì)進(jìn)入if語(yǔ)句,就直接刪除2. 在RandomAccessFile,這個(gè)文件讀寫類中,用個(gè)方法可以獲得我們 在調(diào)用讀寫方法的時(shí)候,產(chǎn)生的指針的移動(dòng)位置。 方法:getFilePointer(); 這個(gè)方法返回的是一個(gè)long值,一個(gè)單位值為一個(gè)字節(jié) 因?yàn)?,我們每次讀寫一個(gè)字節(jié)的時(shí)候,文件中的指針位置就會(huì)對(duì)應(yīng)的 移動(dòng)位置。 注:當(dāng)我們往一個(gè)文件中用write();方法寫入了5個(gè)字節(jié)的內(nèi)容的時(shí)候。那么 這5個(gè)字節(jié)對(duì)應(yīng)的下標(biāo)就

50、是0到5(不包含5)。所以這個(gè)時(shí)候的指針位置 是在5這個(gè)位置。但是當(dāng)我們用read();方法讀取這個(gè)問(wèn)價(jià)內(nèi)容的時(shí)候 就需要把5這個(gè)位置的指針移動(dòng)。不然返回的是-1,沒(méi)有讀取到任何內(nèi)容 。這個(gè)時(shí)候就要用方法seek();這個(gè)方法可以傳入一個(gè)long值來(lái)指定指針 位置。然后再開(kāi)始閱讀。3. RandomAccessFile還有個(gè)方法skipBytes() 這個(gè)方法跟seek();方法的作用差不多。也能指定指針的位置 其作用是跳過(guò)多少個(gè)字節(jié)。在指針當(dāng)前的位置往后跳過(guò)字節(jié)。 傳入的是一個(gè)int值,返回的也是一個(gè)int值 但是注意了。返回的值是實(shí)際上跳過(guò)的字節(jié)數(shù)。因?yàn)橛锌赡芪覀冎付ǖ淖止?jié)數(shù) ,但是文件中

51、沒(méi)有那么多的字節(jié)數(shù)。所以,返回的是實(shí)際跳過(guò)的字節(jié)數(shù)。4. 注意:我們讀寫都在一個(gè)程序中的時(shí)候,那么當(dāng)我們?cè)谶@個(gè)程序中創(chuàng)建了一個(gè) 文件,并向這個(gè)文件中寫入東西的時(shí)候,指針會(huì)移動(dòng),那么當(dāng)我們 再次在這個(gè)程序中寫讀取方法的時(shí)候要移動(dòng)指針。但是當(dāng)我們?cè)谝粋€(gè)新的 程序中寫讀取方法的時(shí)候,不要移動(dòng)指針,因?yàn)檫@個(gè)時(shí)候指針,相對(duì)于 這個(gè)程序來(lái)說(shuō)是從0開(kāi)始的。5.節(jié)點(diǎn)流(低級(jí)流):可以從或向一個(gè)特定的地方(節(jié)點(diǎn))讀寫數(shù)據(jù) 處理流(高級(jí)流):對(duì)一個(gè)已存在的劉的連接和封裝,通過(guò)所封裝的流的功能 調(diào)用實(shí)現(xiàn)數(shù)據(jù)讀寫。 節(jié)點(diǎn)流:有明確的進(jìn)出去向:是字節(jié)流 處理流:不能獨(dú)立存在,是提高我們程序的讀寫效率的, 通常是用于處理另外一個(gè)低級(jí)流用的,所以高級(jí)流的構(gòu)造方法要 傳入另外一個(gè)流作為參數(shù)。6. InputStream,OutputStream, 這兩個(gè)是不能實(shí)例化,他們兩個(gè)是抽象類。是所有輸入輸出流的父類 OututStream:所以字節(jié)輸出流的父類。InputStream:所以字節(jié)輸入流父類。7. InputStream,OutputStream。的第一個(gè)實(shí)現(xiàn)類 FileOutputStream,FileInputStream.這連個(gè)實(shí)現(xiàn)類都是專門用于對(duì)文件 進(jìn)行寫入寫出的流。是兩個(gè)低級(jí)流。是對(duì)字節(jié)進(jìn)行操作的

溫馨提示

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