全部的文檔和源代碼都開源在GitHub: https://github.com/kun213/DailyCode上了。但願咱們能夠一塊兒加油,一塊兒學習,一塊兒交流。java
@git
File類的構造方法github
public File(String parent,String child)
:從父路徑名字符串和子路徑名字符串建立新的 File實例。public File(File parent, String child)
:從父抽象路徑名和子路徑名字符串建立新的 File實例。代碼舉例:算法
/** * File類構造方法 */ public class FileDemo { public static void main(String[] args) { method_3(); } /** * File類構造方法 * File(File parent,String child)傳遞File類型的父路徑,和字符串的子路徑 * 第一個參數是File對象 */ public static void method_3(){ File parent = new File("E:\\JavaEE\\IdeaProjects"); File file = new File(parent,"basic-code"); System.out.println(file); } /** * File類構造方法 * File(String parent,String child)傳遞字符串的父路徑,和字符串的子路徑 * 程序中,分的越開越好 * 單獨操做父路徑,單獨操做子路徑 */ public static void method_2(){ File file = new File("E:\\JavaEE\\IdeaProjects","basic-code"); System.out.println(file); } /** * File類構造方法 * File(String path)傳遞字符串的路徑 */ public static void method_1(){ File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code"); System.out.println(file); } }
注意:數組
File類的獲取方法ide
public String getAbsolutePath()
:返回此File的絕對路徑名字符串。public String getPath()
:將此File轉換爲路徑名字符串。public String getName()
:返回由此File表示的文件或目錄的名稱。public long length()
:返回由此File表示的文件的長度。public File getParentFile()
返回由此File表示的文件或目錄的父目錄,若是沒有父目錄,返回null。代碼舉例:函數
/** * File類的獲取方法 * 基本上都是get開頭 */ public class FileDemo { public static void main(String[] args) { method_5(); } /** * String getPath() 將構造方法中的路徑,轉成字符串 */ public static void method_5(){ File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code"); String path = file.getPath(); System.out.println(path.toString()); } /** * File getAbsoluteFile() 返回File構造方法中路徑的絕對路徑形式 * 返回值是File對象 * * 注意: 直接傳遞文件名,或者文件夾名 * 獲取到的絕對路徑,將從IDEA的工程下計算 */ public static void method_4(){ File file = new File("1.txt"); File abso = file.getAbsoluteFile(); System.out.println(abso); } /** * long length() 獲取File構造方法中路徑表示的文件的字節數 */ public static void method_3(){ File file = new File("E:\\開始學習的Java筆記和代碼\\測試io\\1.txt"); long l = file.length(); System.out.println(l); } /** * File getParentFile() 獲取,構造方法中封裝的路徑的父路徑 * 上一級文件夾 * 方法的返回值是File對象,能夠方法調用鏈 * 若是此路徑名沒有父目錄,則返回 null。 */ public static void method_2(){ File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code"); File parent = file.getParentFile().getParentFile();//方法調用鏈 System.out.println(parent); } /** * String getName() 返回名字 * 獲取了,構造方法中封裝路徑,最後的名稱 * 名稱多是文件夾名,多是文件名 */ public static void method_1(){ File file = new File("E:\\JavaEE\\IdeaProjects\\basic-code"); String name = file.getName(); System.out.println(name); } }
public static void main(String[] args) { // D盤下的bbb.java文件 File f = new File("D:\\bbb.java"); System.out.println(f.getAbsolutePath()); // 項目下的bbb.java文件 File f2 = new File("bbb.java"); System.out.println(f2.getAbsolutePath()); }
public File[] listFiles()
返回一個File數組,表示該File目錄中的全部的子文件或目錄、public File[] listFiles(FileFilter filter)
返回一個File數組,表示該File目錄中的全部的子文件或目錄,filter是文件過濾器,能夠過濾不須要的文件。public static void main(String[] args) { File dir = new File("d:\\java_code"); //獲取當前目錄下的文件以及文件夾對象,只要拿到了文件對象,那麼就能夠獲取更多信息 File[] files = dir.listFiles(); for (File file : files) { System.out.println(file); } }
FileFilter接口學習
文件過濾器接口,此接口的實現類能夠傳遞給方法listFiles(),實現文件的過濾功能測試
FileFilter接口方法:線程
public boolean accept(File path)
:方法參數就是listFiles()方法獲取到的文件或者目錄的路徑。若是方法返回true,表示須要此路徑,不然此路徑將被忽略。
遍歷目錄,獲取全部的Java文件
public static void main(String[] args){ File dir = new File("d:\\demo"); File[] files = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { //判斷若是獲取到的是目錄,直接放行 if(pathname.isDirectory()) return true; //獲取路徑中的文件名,判斷是否java結尾,是就返回true //.toLowerCase是String 中的全部字符都轉換爲小寫 return pathname.getName().toLowerCase().endsWith("java"); } }); for(File file : files){ System.out.println(file); } }
/** * 方法的遞歸調用: 編寫程序上一個手段 * 方法本身調用本身,具備方法語言,均可以使用遞歸 * 解決問題: * 目錄遍歷案例,功能是肯定的,就是制定目錄進行遍歷 * 遍歷的目錄,每次可能不一樣 * * 功能的計算主體明確,計算中的參數每次是變化 * * 方法自身調用注意事項: * 1: 不能是死遞歸,方法不停的進棧,不會出去,內存滿了,溢出 * 2: 遞歸必定要有出口,能結束.可是若是進棧的方法過多也不能夠 * */
分析:分析:n的階乘:n! = n * (n-1) ... 3 * 2 * 1
實現代碼:
public class JieChengDemo { public static void main(String[] args) { int jieCheng = getJieCheng(5); System.out.println(jieCheng); } /** 經過遞歸算法實現. 參數列表:int 返回值類型: int */ public static int getJieCheng(int num){ /* num爲1時,方法返回1, 至關因而方法的出口,num總有是1的狀況 */ if (num == 1){ return 1; }else { /* num不爲1時,方法返回 num +(num-1)的累和 遞歸調用getJieCheng方法 */ return num * getJieCheng(num-1); } }
1~N遞歸求和的代碼執行圖解:
注意:遞歸必定要有條件限定,保證遞歸可以中止下來,不然就是死遞歸。遞歸次數不要太多,不然會發生棧內存溢出,會拋出StackOverflowError錯誤。
函數調用的參數是經過棧空間來傳遞的,在調用過程當中會佔用線程的棧資源。
遞歸調用只有走到最後的結束點後函數才能依次退出,而未到達最後的結束點以前,佔用的棧空間一直沒有釋放,若是遞歸調用次數過多,就可能致使佔用的棧資源超過線程的最大值,從而致使棧溢出,致使程序的異常退出。
根據數據的流向分爲:輸入流和輸出流。
其餘設備
上讀取到內存
中的流。內存
中寫出到其餘設備
上的流。格局數據的類型分爲:字節流和字符流。
使用字節流能夠進行任何文件的複製,由於字節流操做的是組成文件的最小單元-字節。
複製原理圖解:
代碼實現
/** * 字節流複製文件,任意文件 * 不能是文件夾 */ public static void main(String[] args) throws IOException { // 1.建立流對象 // 1.1 指定數據源 FileInputStream fis = new FileInputStream("D:\\test.jpg"); // 1.2 指定目的地 FileOutputStream fos = new FileOutputStream("test_copy.jpg"); // 2.讀寫數據 // 2.1 定義數組 byte[] b = new byte[1024]; // 2.2 定義長度 int len; // 2.3 循環讀取 while ((len = fis.read(b))!=-1) { // 2.4 寫出數據 fos.write(b, 0 , len); } // 3.關閉資源 fos.close(); fis.close(); }
緩衝流:針對基礎流對象進行高效處理的流對象。或者爲基礎流增長功能。
字節緩衝流:BufferedInputStream
,BufferedOutputStream
緩衝流的基本原理,是在建立流對象時,會建立一個內置的默認大小的緩衝區數組,經過緩衝區讀寫,減小系統IO次數,從而提升讀寫的效率。
構造方法
public BufferedInputStream(InputStream in)
:建立一個 新的緩衝輸入流。public BufferedOutputStream(OutputStream out)
: 建立一個新的緩衝輸出流。// 建立字節緩衝輸入流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt")); // 建立字節緩衝輸出流 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));
注意:在使用緩衝流時,必須傳遞基礎流。
代碼實現:緩衝流+數組方式:
public static void main(String[] args) throws FileNotFoundException { // 記錄開始時間 long start = System.currentTimeMillis(); // 建立流對象 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk8.exe")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.exe")); // 讀寫數據 int len = 0; byte[] bytes = new byte[8*1024]; while ((len = bis.read(bytes)) != -1) { bos.write(bytes, 0 , len); } // 記錄結束時間 long end = System.currentTimeMillis(); System.out.println("緩衝流使用數組複製時間:"+(end - start)+" 毫秒"); } 緩衝流使用數組複製時間:666 毫秒 ew BufferedOutputStream(new FileOutputStream("copy.exe")); // 讀寫數據 int len = 0; byte[] bytes = new byte[8*1024]; while ((len = bis.read(bytes)) != -1) { bos.write(bytes, 0 , len); } // 記錄結束時間 long end = System.currentTimeMillis(); System.out.println("緩衝流使用數組複製時間:"+(end - start)+" 毫秒"); } 緩衝流使用數組複製時間:666 毫秒