2019獨角獸企業重金招聘Python工程師標準>>>
遞歸思想
兔子問題
package?cn.itcast_02;/**?有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問第二十個月的兔子對數為多少?*?分析:我們要想辦法找規律*? 兔子對數*?第一個月:? 1*?第二個月: 1*?第三個月: 2*?第四個月: 3 *?第五個月: 5*?第六個月: 8*?...*?*?由此可見兔子對象的數據是:*? 1,1,2,3,5,8...*?規則:*? A:從第三項開始,每一項是前兩項之和*? B:而且說明前兩項是已知的*?*?如何實現這個程序呢?*? A:數組實現*? B:變量的變化實現*? C:遞歸實現*?*?假如相鄰的兩個月的兔子對數是a,b*?第一個相鄰的數據:a=1,b=1*?第二個相鄰的數據:a=1,b=2*?第三個相鄰的數據:a=2,b=3*?第四個相鄰的數據:a=3,b=5*?看到了:下一次的a是以前的b,下一次是以前的a+b */
public?class?DiGuiDemo2?{public?static?void?main(String[]?args)?{//?定義一個數組int[]?arr?=?new?int[20];arr[0]?=?1;arr[1]?=?1;//?arr[2]?=?arr[0]?+?arr[1];//?arr[3]?=?arr[1]?+?arr[2];//?...for?(int?x?=?2;?x?<?arr.length;?x++)?{arr[x]?=?arr[x?-?2]?+?arr[x?-?1];}System.out.println(arr[19]);//?6765System.out.println("----------------");int?a?=?1;int?b?=?1;for?(int?x?=?0;?x?<?18;?x++)?{//?臨時變量存儲上一次的aint?temp?=?a;a?=?b;b?=?temp?+?b;}System.out.println(b);System.out.println("----------------");System.out.println(fib(20));}/**?方法:?返回值類型:int?參數列表:int?n?出口條件:?第一個月是1,第二個月是1?規律:?從第三個月開始,每一個月是前兩個月之和*/public?static?int?fib(int?n)?{if?(n?==?1?||?n?==?2)?{return?1;}?else?{return?fib(n?-?1)?+?fib(n?-?2);}}
}
遞歸輸出指定目錄下所有的java文件的絕對路徑案例
package?cn.itcast_03;import?java.io.File;/**?需求:請大家把E:\JavaSE目錄下所有的java結尾的文件的絕對路徑給輸出在控制臺。*?*?分析:*? A:封裝目錄*? B:獲取該目錄下所有的文件或者文件夾的File數組*? C:遍歷該File數組,得到每一個File對象*? D:判斷該File對象是否是文件夾*? 是:回到B*? 否:繼續判斷是否以.java結尾*? 是:就輸出該文件的絕對路徑*? 否:不搭理它*/
public?class?FilePathDemo?{public?static?void?main(String[]?args)?{//?封裝目錄File?srcFolder?=?new?File("E:\\JavaSE");//?遞歸功能實現getAllJavaFilePaths(srcFolder);}private?static?void?getAllJavaFilePaths(File?srcFolder)?{//?獲取該目錄下所有的文件或者文件夾的File數組File[]?fileArray?=?srcFolder.listFiles();//?遍歷該File數組,得到每一個File對象for?(File?file?:?fileArray)?{//?判斷該File對象是否是文件夾if?(file.isDirectory())?{getAllJavaFilePaths(file);}?else?{//?繼續判斷是否以.java結尾if?(file.getName().endsWith(".java"))?{//?就輸出該文件的絕對路徑System.out.println(file.getAbsolutePath());}}}}
}
遞歸刪除帶內容的目錄案例
package?cn.itcast_03;import?java.io.File;/**?需求:遞歸刪除帶內容的目錄*?*?目錄我已經給定:demo*?*?分析:*? A:封裝目錄*? B:獲取該目錄下的所有文件或者文件夾的File數組*? C:遍歷該File數組,得到每一個File對象*? D:判斷該File對象是否是文件夾*? 是:回到B*? 否:就刪除*/
public?class?FileDeleteDemo?{public?static?void?main(String[]?args)?{//?封裝目錄File?srcFolder?=?new?File("demo");//?遞歸實現deleteFolder(srcFolder);}private?static?void?deleteFolder(File?srcFolder)?{//?獲取該目錄下的所有文件或者文件夾的File數組File[]?fileArray?=?srcFolder.listFiles();if?(fileArray?!=?null)?{//?遍歷該File數組,得到每一個File對象for?(File?file?:?fileArray)?{//?判斷該File對象是否是文件夾if?(file.isDirectory())?{deleteFolder(file);}?else?{System.out.println(file.getName()?+?"---"?+?file.delete());}}System.out.println(srcFolder.getName()?+?"---"?+?srcFolder.delete());}}
}
IO流
????什么情況下使用哪種流呢? ??
??如果數據所在的文件通過windows自帶的記事本打開并能讀懂里面的內容,就用字符流。其他用字節流。?
? ??如果你什么都不知道,就用字節流 ? ? ?
FileOutputStream寫入數據
package?cn.itcast_01;import?java.io.File;
import?java.io.FileNotFoundException;
import?java.io.FileOutputStream;
import?java.io.IOException;/**?IO流的分類:*? 流向:*? 輸入流 讀取數據*? 輸出流?寫出數據*? 數據類型:*? 字節流*? 字節輸入流 讀取數據 InputStream*? 字節輸出流 寫出數據 OutputStream*? 字符流*? 字符輸入流 讀取數據 Reader*? 字符輸出流 寫出數據 Writer*?*? 注意:一般我們在探討IO流的時候,如果沒有明確說明按哪種分類來說,默認情況下是按照數據類型來分的。*?*?需求:我要往一個文本文件中輸入一句話:"hello,io"*?*?分析:*? A:這個操作最好是采用字符流來做,但是呢,字符流是在字節流之后才出現的,所以,今天我先講解字節流如何操作。*? B:由于我是要往文件中寫一句話,所以我們要采用字節輸出流。*?*?通過上面的分析后我們知道要使用:OutputStream*?但是通過查看API,我們發現該流對象是一個抽象類,不能實例化。*?所以,我們要找一個具體的子類。*?而我們要找的子類是什么名字的呢?這個時候,很簡單,我們回想一下,我們是不是要往文件中寫東西。*?文件是哪個單詞:File*?然后用的是字節輸出流,聯起來就是:FileOutputStream*?注意:每種基類的子類都是以父類名作為后綴名。*? XxxOutputStream*? XxxInputStream*? XxxReader*? XxxWriter*?查看FileOutputStream的構造方法:*? FileOutputStream(File?file)?* FileOutputStream(String?name)**?字節輸出流操作步驟:*? A:創建字節輸出流對象*? B:寫數據*? C:釋放資源*/
public?class?FileOutputStreamDemo?{public?static?void?main(String[]?args)?throws?IOException?{//?創建字節輸出流對象//?FileOutputStream(File?file)//?File?file?=?new?File("fos.txt");//?FileOutputStream?fos?=?new?FileOutputStream(file);//?FileOutputStream(String?name)FileOutputStream?fos?=?new?FileOutputStream("fos.txt");/**?創建字節輸出流對象了做了幾件事情:*?A:調用系統功能去創建文件*?B:創建fos對象*?C:把fos對象指向這個文件*///寫數據fos.write("hello,IO".getBytes());fos.write("java".getBytes());//釋放資源//關閉此文件輸出流并釋放與此流有關的所有系統資源。fos.close();/**?為什么一定要close()呢?*?A:讓流對象變成垃圾,這樣就可以被垃圾回收器回收了*?B:通知系統去釋放跟該文件相關的資源*///java.io.IOException:?Stream?Closed//fos.write("java".getBytes());}
}
FileOutputStream的write()的三個方法
package?cn.itcast_01;import?java.io.FileOutputStream;
import?java.io.IOException;/**?字節輸出流操作步驟:*?A:創建字節輸出流對象*?B:調用write()方法*?C:釋放資源*?*?public?void?write(int?b):寫一個字節*?public?void?write(byte[]?b):寫一個字節數組*?public?void?write(byte[]?b,int?off,int?len):寫一個字節數組的一部分*/
public?class?FileOutputStreamDemo2?{public?static?void?main(String[]?args)?throws?IOException?{//?創建字節輸出流對象//?OutputStream?os?=?new?FileOutputStream("fos2.txt");?//?多態FileOutputStream?fos?=?new?FileOutputStream("fos2.txt");//?調用write()方法//fos.write(97);?//97?--?底層二進制數據 --?通過記事本打開?--?找97對應的字符值?--?a//?fos.write(57);//?fos.write(55);//public?void?write(byte[]?b):寫一個字節數組byte[]?bys={97,98,99,100,101};fos.write(bys);//public?void?write(byte[]?b,int?off,int?len):寫一個字節數組的一部分fos.write(bys,1,3);//釋放資源fos.close();}
}
FileOutputStream寫出數據實現換行和追加寫入
package?cn.itcast_01;import?java.io.FileOutputStream;
import?java.io.IOException;/**?如何實現數據的換行?*? 為什么現在沒有換行呢?因為你值寫了字節數據,并沒有寫入換行符號。*? 如何實現呢?寫入換行符號即可唄。*? 剛才我們看到了有寫文本文件打開是可以的,通過windows自帶的那個不行,為什么呢?*? 因為不同的系統針對不同的換行符號識別是不一樣的?*? windows:\r\n*? linux:\n*? Mac:\r*? 而一些常見的個高級記事本,是可以識別任意換行符號的。*?*?如何實現數據的追加寫入?*? 用構造方法帶第二個參數是true的情況即可*/
public?class?FileOutputStreamDemo3?{public?static?void?main(String[]?args)?throws?IOException?{//?創建字節輸出流對象//?FileOutputStream?fos?=?new?FileOutputStream("fos3.txt");//?創建一個向具有指定?name?的文件中寫入數據的輸出文件流。如果第二個參數為?true,則將字節寫入文件末尾處,而不是寫入文件開始處。FileOutputStream?fos?=?new?FileOutputStream("fos3.txt",?true);//?寫數據for?(int?x?=?0;?x?<?10;?x++)?{fos.write(("hello"?+?x).getBytes());fos.write("\r\n".getBytes());}//?釋放資源fos.close();}
}
FileOutputStream寫出數據加入異常處理
package?cn.itcast_01;import?java.io.FileNotFoundException;
import?java.io.FileOutputStream;
import?java.io.IOException;/**?加入異常處理的字節輸出流操作*/
public?class?FileOutputStreamDemo4?{public?static?void?main(String[]?args)?{//?分開做異常處理//?FileOutputStream?fos?=?null;//?try?{//?fos?=?new?FileOutputStream("fos4.txt");//?}?catch?(FileNotFoundException?e)?{//?e.printStackTrace();//?}////?try?{//?fos.write("java".getBytes());//?}?catch?(IOException?e)?{//?e.printStackTrace();//?}////?try?{//?fos.close();//?}?catch?(IOException?e)?{//?e.printStackTrace();//?}//?一起做異常處理//?try?{//?FileOutputStream?fos?=?new?FileOutputStream("fos4.txt");//?fos.write("java".getBytes());//?fos.close();//?}?catch?(FileNotFoundException?e)?{//?e.printStackTrace();//?}?catch?(IOException?e)?{//?e.printStackTrace();//?}//?改進版//?為了在finally里面能夠看到該對象就必須定義到外面,為了訪問不出問題,還必須給初始化值FileOutputStream?fos?=?null;try?{//?fos?=?new?FileOutputStream("z:\\fos4.txt");fos?=?new?FileOutputStream("fos4.txt");fos.write("java".getBytes());}?catch?(FileNotFoundException?e)?{e.printStackTrace();}?catch?(IOException?e)?{e.printStackTrace();}?finally?{//?如果fos不是null,才需要close()if?(fos?!=?null)?{//?為了保證close()一定會執行,就放到這里了try?{fos.close();}?catch?(IOException?e)?{e.printStackTrace();}}}}
}
FileInputStream讀取數據
package?cn.itcast_02;import?java.io.FileInputStream;
import?java.io.IOException;/**?字節輸入流操作步驟:*?A:創建字節輸入流對象*?B:調用read()方法讀取數據,并把數據顯示在控制臺*?C:釋放資源*?*?讀取數據的方式:*?A:int?read():一次讀取一個字節*?B:int?read(byte[]?b):一次讀取一個字節數組*/
public?class?FileInputStreamDemo?{public?static?void?main(String[]?args)?throws?IOException?{//?FileInputStream(String?name)//?FileInputStream?fis?=?new?FileInputStream("fis.txt");FileInputStream?fis?=?new?FileInputStream("FileOutputStreamDemo.java");//?//?調用read()方法讀取數據,并把數據顯示在控制臺//?//?第一次讀取//?int?by?=?fis.read();//?System.out.println(by);//?System.out.println((char)?by);////?//?第二次讀取//?by?=?fis.read();//?System.out.println(by);//?System.out.println((char)?by);////?//?第三次讀取//?by?=?fis.read();//?System.out.println(by);//?System.out.println((char)?by);//?//?我們發現代碼的重復度很高,所以我們要用循環改進//?//?而用循環,最麻煩的事情是如何控制循環判斷條件呢?//?//?第四次讀取//?by?=?fis.read();//?System.out.println(by);//?//?第五次讀取//?by?=?fis.read();//?System.out.println(by);//?//通過測試,我們知道如果你讀取的數據是-1,就說明已經讀取到文件的末尾了//?用循環改進//?int?by?=?fis.read();//?while?(by?!=?-1)?{//?System.out.print((char)?by);//?by?=?fis.read();//?}//?最終版代碼int?by?=?0;//?讀取,賦值,判斷while?((by?=?fis.read())?!=?-1)?{System.out.print((char)?by);}//?釋放資源fis.close();}
}
字節流復制文本文件案例
package?cn.itcast_03;import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;/**?復制文本文件。*?*?數據源:從哪里來*?a.txt -- 讀取數據 -- FileInputStream *?*?目的地:到哪里去*?b.txt -- 寫數據 -- FileOutputStream*?*?java.io.FileNotFoundException:?a.txt?(系統找不到指定的文件。)*?*?這一次復制中文沒有出現任何問題,為什么呢?*?上一次我們出現問題的原因在于我們每次獲取到一個字節數據,就把該字節數據轉換為了字符數據,然后輸出到控制臺。*?而這一次呢?確實通過IO流讀取數據,寫到文本文件,你讀取一個字節,我就寫入一個字節,你沒有做任何的轉換。*?它會自己做轉換。*/
public?class?CopyFileDemo?{public?static?void?main(String[]?args)?throws?IOException?{//?封裝數據源FileInputStream?fis?=?new?FileInputStream("a.txt");//?封裝目的地FileOutputStream?fos?=?new?FileOutputStream("b.txt");int?by?=?0;while?((by?=?fis.read())?!=?-1)?{fos.write(by);}//?釋放資源(先關誰都行)fos.close();fis.close();}
}
計算機是如何識別把兩個字節拼接為中文的呢
package?cn.itcast_03;import?java.util.Arrays;/**?計算機是如何識別什么時候該把兩個字節轉換為一個中文呢?*?在計算機中中文的存儲分兩個字節:*? 第一個字節肯定是負數。*? 第二個字節常見的是負數,可能有正數。但是沒影響。*/
public?class?StringDemo?{public?static?void?main(String[]?args)?{//?String?s?=?"abcde";//?//?[97,?98,?99,?100,?101]String?s?=?"我愛你中國";//?[-50,?-46,?-80,?-82,?-60,?-29,?-42,?-48,?-71,?-6]byte[]?bys?=?s.getBytes();System.out.println(Arrays.toString(bys));}
}
字節流復制文本文件案例
package?cn.itcast_03;import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;/**?需求:把c盤下的a.txt的內容復制到d盤下的b.txt中*?*?數據源:*? c:\\a.txt -- 讀取數據-- FileInputStream*?目的地:*? d:\\b.txt -- 寫出數據 -- FileOutputStream*/
public?class?CopyFileDemo2?{public?static?void?main(String[]?args)?throws?IOException?{//?封裝數據源FileInputStream?fis?=?new?FileInputStream("c:\\a.txt");//?封裝目的地FileOutputStream?fos?=?new?FileOutputStream("d:\\b.txt");//?復制數據int?by?=?0;while?((by?=?fis.read())?!=?-1)?{fos.write(by);}//?釋放資源fos.close();fis.close();}
}
字節流復制圖片案例
package?cn.itcast_03;import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;/**?需求:把e:\\林青霞.jpg內容復制到當前項目目錄下的mn.jpg中*?*?數據源:*? e:\\林青霞.jpg --讀取數據--FileInputStream*?目的地:*? mn.jpg--寫出數據--FileOutputStream*/
public?class?CopyImageDemo?{public?static?void?main(String[]?args)?throws?IOException?{//?封裝數據源FileInputStream?fis?=?new?FileInputStream("e:\\林青霞.jpg");//?封裝目的地FileOutputStream?fos?=?new?FileOutputStream("mn.jpg");//?復制數據int?by?=?0;while?((by?=?fis.read())?!=?-1)?{fos.write(by);}//?釋放資源fos.close();fis.close();}
}
字節流復制視頻案例
package?cn.itcast_03;import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;/**?需求:把e:\\哥有老婆.mp4復制到當前項目目錄下的copy.mp4中*?*?數據源:*? e:\\哥有老婆.mp4--讀取數據--FileInputStream*?目的地:*? copy.mp4--寫出數據--FileOutputStream*/
public?class?CopyMp4Demo?{public?static?void?main(String[]?args)?throws?IOException?{//?封裝數據源FileInputStream?fis?=?new?FileInputStream("e:\\哥有老婆.mp4");//?封裝目的地FileOutputStream?fos?=?new?FileOutputStream("copy.mp4");//?復制數據int?by?=?0;while?((by?=?fis.read())?!=?-1)?{fos.write(by);}//?釋放資源fos.close();fis.close();}
}
FileInputStream讀取數據一次一個字節數組
package?cn.itcast_02;import?java.io.FileInputStream;
import?java.io.IOException;/**?一次讀取一個字節數組:int?read(byte[]?b)*?返回值其實是實際讀取的字節個數。*/
public?class?FileInputStreamDemo2?{public?static?void?main(String[]?args)?throws?IOException?{//?創建字節輸入流對象//?FileInputStream?fis?=?new?FileInputStream("fis2.txt");FileInputStream?fis?=?new?FileInputStream("FileOutputStreamDemo.java");//?讀取數據//?定義一個字節數組//?第一次讀取//?byte[]?bys?=?new?byte[5];//?int?len?=?fis.read(bys);//?//?System.out.println(len);//?//?System.out.println(new?String(bys));//?//?System.out.println(new?String(bys,?0,?len));//?System.out.print(new?String(bys,?0,?len));////?//?第二次讀取//?len?=?fis.read(bys);//?//?System.out.println(len);//?//?System.out.println(new?String(bys));//?//?System.out.println(new?String(bys,?0,?len));//?System.out.print(new?String(bys,?0,?len));////?//?第三次讀取//?len?=?fis.read(bys);//?//?System.out.println(len);//?//?System.out.println(new?String(bys));//?//?System.out.println(new?String(bys,?0,?len));//?System.out.print(new?String(bys,?0,?len));////?//?第四次讀取//?len?=?fis.read(bys);//?//?System.out.println(len);//?//?System.out.println(new?String(bys,?0,?len));//?System.out.print(new?String(bys,?0,?len));//?//?代碼重復了,用循環改進//?//?但是,我不知道結束條件//?//?len?=?fis.read(bys);//?//?System.out.println(len);//?//?len?=?fis.read(bys);//?//?System.out.println(len);//?//?如果讀取到的實際長度是-1,就說明沒有數據了//?byte[]?bys?=?new?byte[115];?//?0//?int?len?=?0;//?while?((len?=?fis.read(bys))?!=?-1)?{//?System.out.print(new?String(bys,?0,?len));//?//?System.out.print(new?String(bys));?//千萬要帶上len的使用//?}//?最終版代碼//?數組的長度一般是1024或者1024的整數倍byte[]?bys?=?new?byte[1024];int?len?=?0;while?((len?=?fis.read(bys))?!=?-1)?{System.out.print(new?String(bys,?0,?len));}//?釋放資源fis.close();}
}
FileInputStream讀取數據的兩種方式比較圖解
字節復制文本文件案例
package?cn.itcast_04;import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;/**?需求:把c:\\a.txt內容復制到d:\\b.txt中*?*?數據源:*? c:\\a.txt -- 讀取數據 -- FileInputStream*?目的地:*? d:\\b.txt -- 寫出數據 -- FileOutputStream*/
public?class?CopyFileDemo?{public?static?void?main(String[]?args)?throws?IOException?{//?封裝數據源FileInputStream?fis?=?new?FileInputStream("c:\\a.txt");FileOutputStream?fos?=?new?FileOutputStream("d:\\b.txt");//?復制數據byte[]?bys?=?new?byte[1024];int?len?=?0;while?((len?=?fis.read(bys))?!=?-1)?{fos.write(bys,?0,?len);}//?釋放資源fos.close();fis.close();}
}
字節流復制視頻案例
package?cn.itcast_04;import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;/**?需求:把e:\\哥有老婆.mp4復制到當前項目目錄下的copy.mp4中*?*?數據源:*? e:\\哥有老婆.mp4--讀取數據--FileInputStream*?目的地:*? copy.mp4--寫出數據--FileOutputStream*/
public?class?CopyMp4Demo?{public?static?void?main(String[]?args)?throws?IOException?{//?封裝數據源FileInputStream?fis?=?new?FileInputStream("e:\\哥有老婆.mp4");//?封裝目的地FileOutputStream?fos?=?new?FileOutputStream("copy.mp4");//?復制數據byte[]?bys?=?new?byte[1024];int?len?=?0;while?((len?=?fis.read(bys))?!=?-1)?{fos.write(bys,?0,?len);}//?釋放資源fos.close();fis.close();}
}
BufferedOutputStream寫出數據
package?cn.itcast_05;import?java.io.BufferedOutputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;/**?通過定義數組的方式確實比以前一次讀取一個字節的方式快很多,所以,看來有一個緩沖區還是非常好的。*?既然是這樣的話,那么,java開始在設計的時候,它也考慮到了這個問題,就專門提供了帶緩沖區的字節類。*?這種類被稱為:緩沖區類(高效類)*?寫數據:BufferedOutputStream*?讀數據:BufferedInputStream*?*?構造方法可以指定緩沖區的大小,但是我們一般用不上,因為默認緩沖區大小就足夠了。*?*?為什么不傳遞一個具體的文件或者文件路徑,而是傳遞一個OutputStream對象呢?*?原因很簡單,字節緩沖區流僅僅提供緩沖區,為高效而設計的。但是呢,真正的讀寫操作還得靠基本的流對象實現。*/
public?class?BufferedOutputStreamDemo?{public?static?void?main(String[]?args)?throws?IOException?{//?BufferedOutputStream(OutputStream?out)//?FileOutputStream?fos?=?new?FileOutputStream("bos.txt");//?BufferedOutputStream?bos?=?new?BufferedOutputStream(fos);//?簡單寫法BufferedOutputStream?bos?=?new?BufferedOutputStream(new?FileOutputStream("bos.txt"));//?寫數據bos.write("hello".getBytes());//?釋放資源bos.close();}
}
package?cn.itcast_05;import?java.io.BufferedInputStream;
import?java.io.FileInputStream;
import?java.io.IOException;/**?注意:雖然我們有兩種方式可以讀取,但是,請注意,這兩種方式針對同一個對象在一個代碼中只能使用一個。*/
public?class?BufferedInputStreamDemo?{public?static?void?main(String[]?args)?throws?IOException?{//?BufferedInputStream(InputStream?in)BufferedInputStream?bis?=?new?BufferedInputStream(new?FileInputStream("bos.txt"));//?讀取數據//?int?by?=?0;//?while?((by?=?bis.read())?!=?-1)?{//?System.out.print((char)?by);//?}//?System.out.println("---------");byte[]?bys?=?new?byte[1024];int?len?=?0;while?((len?=?bis.read(bys))?!=?-1)?{System.out.print(new?String(bys,?0,?len));}//?釋放資源bis.close();}
}
字節流四種方式復制MP4并測試效率
package?outdemo;import?java.io.BufferedInputStream;
import?java.io.BufferedOutputStream;
import?java.io.FileInputStream;
import?java.io.FileOutputStream;
import?java.io.IOException;
/**?需求:把F:\\technology\\720.mp4復制到當前項目目錄下的copy.mp4中*?*?字節流四種方式復制文件:*?基本字節流一次讀寫一個字節: 共耗時:193370毫秒*?基本字節流一次讀寫一個字節數組:?共耗時:192毫秒*?高效字節流一次讀寫一個字節:?共耗時:1222毫秒*?高效字節流一次讀寫一個字節數組:?共耗時:172毫秒*/public?class?CopyMp4?{public?static?void?main(String[]?args)?throws?IOException?{method1("F:\\technology\\720.mp4","copy1.mp4");method2("F:\\technology\\720.mp4","copy2.mp4");method3("F:\\technology\\720.mp4","copy3.mp4");method4("F:\\technology\\720.mp4","copy4.mp4");}//?高效字節流一次讀寫一個字節數組:private?static?void?method4(String?srcString,?String?destString)?throws?IOException?{long?start?=?System.currentTimeMillis();BufferedInputStream?fis?=?new?BufferedInputStream(new?FileInputStream(srcString));BufferedOutputStream?fos?=?new?BufferedOutputStream(new?FileOutputStream(destString));byte[]?by?=?new?byte[20480000];int?len?=?0;while?((len=fis.read(by))!=-1){fos.write(by,0,len);}fos.close();fis.close();long?end?=?System.currentTimeMillis();System.out.println("Buffer?數組--共耗時:"?+?(end?-?start)?+?"毫秒");}//?高效字節流一次讀寫一個字節:private?static?void?method3(String?srcString,?String?destString)?throws?IOException?{long?start?=?System.currentTimeMillis();BufferedInputStream?fis?=?new?BufferedInputStream(new?FileInputStream(srcString));BufferedOutputStream?fos?=?new?BufferedOutputStream(new?FileOutputStream(destString));int?byt?=?0;while?((byt=fis.read())!=-1){fos.write(byt);}fos.close();fis.close();long?end?=?System.currentTimeMillis();System.out.println("Buffer?字節--共耗時:"?+?(end?-?start)?+?"毫秒");}//?基本字節流一次讀寫一個字節數組private?static?void?method2(String?srcString,?String?destString)?throws?IOException?{long?start?=?System.currentTimeMillis();FileInputStream?fis?=?new?FileInputStream(srcString);FileOutputStream?fos?=?new?FileOutputStream(destString);byte[]?by?=?new?byte[20480000];int?byt?=?0;while?((byt=fis.read(by))!=-1){fos.write(by,0,byt);}fos.close();fis.close();long?end?=?System.currentTimeMillis();System.out.println("字節?數組--共耗時:"?+?(end?-?start)?+?"毫秒");}//?基本字節流一次讀寫一個字節private?static?void?method1(String?srcString,?String?destString)?throws?IOException?{long?start?=?System.currentTimeMillis();FileInputStream?fis?=?new?FileInputStream(srcString);FileOutputStream?fos?=?new?FileOutputStream(destString);int?by?=?0;while?((by=fis.read())!=-1){fos.write(by);}fos.close();fis.close();long?end?=?System.currentTimeMillis();System.out.println("字節--共耗時:"?+?(end?-?start)?+?"毫秒");}}
day20 總結
1:遞歸(理解)(1)方法定義中調用方法本身的現象舉例:老和尚給小和尚講故事,我們學編程(2)遞歸的注意事項;A:要有出口,否則就是死遞歸B:次數不能過多,否則內存溢出C:構造方法不能遞歸使用(3)遞歸的案例:A:遞歸求階乘B:兔子問題C:遞歸輸出指定目錄下所有指定后綴名的文件絕對路徑D:遞歸刪除帶內容的目錄(小心使用)2:IO流(掌握)(1)IO用于在設備間進行數據傳輸的操作 (2)分類:A:流向輸入流 讀取數據輸出流 寫出數據B:數據類型字節流 字節輸入流字節輸出流字符流字符輸入流字符輸出流注意:a:如果我們沒有明確說明按照什么分,默認按照數據類型分。b:除非文件用windows自帶的記事本打開我們能夠讀懂,才采用字符流,否則建議使用字節流。(3)FileOutputStream寫出數據A:操作步驟a:創建字節輸出流對象b:調用write()方法c:釋放資源B:代碼體現:FileOutputStream?fos?=?new?FileOutputStream("fos.txt");fos.write("hello".getBytes());fos.close();C:要注意的問題?a:創建字節輸出流對象做了幾件事情?b:為什么要close()?c:如何實現數據的換行?d:如何實現數據的追加寫入?(4)FileInputStream讀取數據A:操作步驟a:創建字節輸入流對象b:調用read()方法c:釋放資源B:代碼體現:FileInputStream?fis?=?new?FileInputStream("fos.txt");//方式1int?by?=?0;while((by=fis.read())!=-1)?{System.out.print((char)by);}//方式2byte[]?bys?=?new?byte[1024];int?len?=?0;while((len=fis.read(bys))!=-1)?{System.out.print(new?String(bys,0,len));}fis.close();(5)案例:2種實現A:復制文本文件B:復制圖片C:復制視頻(6)字節緩沖區流A:BufferedOutputStreamB:BufferedInputStream(7)案例:4種實現A:復制文本文件B:復制圖片C:復制視頻3:自學字符流IO流分類字節流:InputStreamFileInputStreamBufferedInputStreamOutputStreamFileOutputStreamBufferedOutputStream字符流:ReaderFileReaderBufferedReaderWriterFileWriterBufferedWriter
轉載于:https://my.oschina.net/u/2356966/blog/617863
總結
以上是生活随笔為你收集整理的day20-----------IO流(传智视频)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。