JAvaSE學(xué)習(xí)筆記02_第1頁
JAvaSE學(xué)習(xí)筆記02_第2頁
JAvaSE學(xué)習(xí)筆記02_第3頁
JAvaSE學(xué)習(xí)筆記02_第4頁
JAvaSE學(xué)習(xí)筆記02_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

5、st才有,Collection中就沒11. List集合的add方法;傳入兩個值。如果在已有的元素的下標下添加一個元素 那么會把原有的元素往后擠。12. List集合的remove方法;傳入一個下標刪除一個元素。返回值就是我們 刪除的那個元素。這個可以告訴我們刪除了什么元素,因為我們只傳入了下標 Collection刪除的remove方法沒有返回值,因為 在Collection中的remove方法是根據(jù)傳入一個元素來刪除的,不是因為 傳入下標來刪除元素。13. List的subList();方法傳入兩個下標截取一定范圍的元素。 返回的又是一個新的集合,所以我們接收要用新的集合來接收 如:Lis

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

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

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

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

10、rray是數(shù)組類的實現(xiàn)類,Arrays是工具類 用這個類重寫了toString();的toString();方法。 System.out.println(Arrays.toString(傳入一個數(shù)組);18. 集合的復(fù)制 所有的集合的實現(xiàn)類都支持一個構(gòu)造方法,該構(gòu)造方法傳入一個Collection 那么該構(gòu)造方法創(chuàng)建出來的集合默認就添加了給定集合中的所有的元素,這樣的構(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)險。19.集合的工具了Collections Collection是集合的父接口,Collections是集合的父接口20. 集合的排序方法。使用集合的工具類Collections中的sort();方法 Collections.sort();該方法傳入一個集合21.Comparable 接口,實現(xiàn)他的compareTo();方法。這個方法返回一個int值 這個int中大于0的時候,說明當前對象大于給定的值,小于0說明當前對象 小于給定值,等于0的時候說明當前對象等于給定的值。 注Comparable接口的作用。是對一些不是

12、具體的值進行排序用的 如以下代碼: public class Point implements Comparable<Point>private int x; /實現(xiàn)這個接口傳入一個泛型,讓這個接口的實現(xiàn)方法private int y; /能直接用這個類型進行比較。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; 實現(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); 如果我們沒有在實體類中實現(xiàn)Comparable接口,那么我們出入的值就沒法比較 如果我們實現(xiàn)了這個接口,實現(xiàn)了它的方法。這個方法就是用于這些比較的 其中:int len = this.x*this.x+this.y*this.y; int lenl = o.x*o.x+o.y*o.y; return len-lenl; 我們通過返回的值來進行比較。原理是由x,y值。兩個值變成一個點 這個點到原點的距離做比較。這個通過原理得到的值來比較大小。

15、22. 如果傳入集合中的是中文的字符串的話,排序方法是 調(diào)用Collections.sort();/的重載方法,出入兩個參數(shù) 第一個參數(shù)是要排序的集合,第二個參數(shù)是比較規(guī)則 如下代碼:實現(xiàn)字符串的排序,我們用字符串長度排序 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.隊列 Queue LinkedList是隊列的實現(xiàn)類,ArrayList不是 隊列添加元素用offer();方法 Queue<String

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

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

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

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

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

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

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

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

25、map的鍵值對。是用來約束 Entry中的數(shù)據(jù)的類型的。所以在這我們都要用遍歷器,先遍歷Set集合得到Entry<String,Integer>然后再從Entry中得到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<> 因為有序,所以效

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

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

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

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

31、息去找文件了。25.File對目錄的操作 File dir = new File(“文件名”); 通過File的isDirectory();方法判斷這個文件是否是一個目錄26. File中創(chuàng)建目錄通過方法:mkdir(); 最好也是用exists();方法判斷下這個目錄是不是存在。27.File中刪除目錄通過方法:delete();這個與刪除文本文件一樣28.File中的mkdir();與mkdirs();方法的區(qū)別在于。mkdir();方法只能一次創(chuàng)建 一個目錄。而mkdirs();能一次創(chuàng)建多級目錄 如: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目錄成功");/這個方法能幫我們把f目錄的上級沒有的目錄都創(chuàng)建出來29. File中創(chuàng)建多級目錄的方法已經(jīng)講了 但是我們用delete刪除一個目錄的時候,如果這個目錄中有類容就會刪除不掉。第三天1.怎

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

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

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

36、File();方法創(chuàng)建就會不成功 我們就要用方法,file.getParentFile();返回的就是一個目錄,然后再 判斷這個錄存不存在,不存在就可以先創(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)建文件時,首先要判斷當前這個文件所在的父目錄是否存在。 * ,因為若不存在,會拋出異常 */這個時候就要先判斷父目錄是不是存在,如果不存在那么就先把父目錄創(chuàng)建出來File parent = file.getParentFile();if(!parent.exists()parent.mkdirs();if(!file.exists()file.createNewFile();4. RandomAccessFile類:是一個常用的讀寫文件內(nèi)容的類 這個類的讀寫是基于指針的操作,這個類總是在當前指針的位置讀寫字節(jié) 使用方法:RandomAccessFile(“一個文件名,路徑”,”r或rw”);

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

39、時候write();方法會值寫入低8位,那就是8個1進去。那么當我們用read(); 方法讀取文件的時候讀取的就是8個1.而8個1代表的值就是2557. 把一個源文件中的內(nèi)容,讀取并賦值到一個新的文件中: 方法如下代碼 /原文件只需要能讀就可以 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這個文件的內(nèi)容只讀,的讀取出來,用read();方法read();方法每次讀一個字節(jié)。我們再把這個字節(jié)值,賦值給變量a。 然后在于write();方法,把a寫入到zheng2.txt這個文件中注:因為這個方法每次只讀一個字節(jié)和寫一個字節(jié)。所以效率非常的慢 若想提高讀寫效率,那么在讀寫數(shù)據(jù)的時候,就必須減少讀寫次數(shù), 就不要一次只讀寫一個字節(jié)了。 在這wri

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

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

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

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

45、:其中byte ;數(shù)組約束了我們一次能存入多少個字節(jié),但是當我們從 源文件中最后一次讀取的字節(jié)量,不足這個byte數(shù)組約束的字節(jié)量的時候那么這個時候的byte ,的其中一部分會是我們最后一次新讀取出來的內(nèi)容, 而還有部分會是我們上次讀取的內(nèi)容。因為我們倒數(shù)第二次讀取源文件的 時候把讀取出來的內(nèi)容,把倒數(shù)第三次讀取的內(nèi)容在byte,中的內(nèi)容 替換掉。所以我們最后一次我們讀取的時候,新的內(nèi)容不能替換倒數(shù)第二次讀取的byte數(shù)組中的全部的內(nèi)容。所以我們在用write();方法把字節(jié)數(shù)組中的內(nèi)容寫入到新文件中的時候,我們不能把這個byte 數(shù)組中從0到最后一個字節(jié)全部寫入。int len = raf2

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

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

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

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

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

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

溫馨提示

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

最新文檔

評論

0/150

提交評論