Java之File與遞歸
阿新 • • 發佈:2018-07-20
必須 文件的 nta 傳智 public 抽象 static accep 繼續
File類的使用和遞歸思想
File類
概述
文件: 存儲數據
文件夾: 管理文件與文件夾
構造方法
- public File(String pathname) :通過將給定的路徑名字符串轉換為抽象路徑名來創建新的 File實例。
- public File(String parent, String child) :從父路徑名字符串和子路徑名字符串創建新的 File實例。
- public File(File parent, String child) :從父抽象路徑名和子路徑名字符串創建新的 File實例。
常用方法
創建方法
- public boolean createNewFile() : 創建文件,存在返回false,不存在創建文件返回true
- boolean mkdir() : 創建文件夾,存在返回false,不存在創建文件夾返回true
- boolean mkdirs() : 創建多級文件夾,存在返回false,不存在創建多級文件夾返回true
刪除方法
- boolean delete() : 刪除文件或者文件夾,文件存在返回true,文件不存在返回false;
可以刪除空的文件夾,如果文件夾下有子文件或者子文件夾,刪除不掉
判斷方法
- public boolean exists() :此File表示的文件或目錄是否實際存在。
- public boolean isDirectory() :此File表示的是否為目錄(文件夾)。
- public boolean isFile() :此File表示的是否為文件。
路徑問題
絕對路徑 : 以盤符開頭
相對路徑 : 相對於本項目
- public String getAbsolutePath() :返回此File的絕對路徑名字符串。
- public String getParent() : 獲取父路徑,在創建對象時制定了父路徑才能獲取,沒有指定返回null(相對路徑返回null).
- public String getPath() :將此File轉換為路徑名字符串(獲取構建時的路徑)。
- public String getName() :返回由此File表示的文件或目錄的名稱。
- public long length() :返回由此File表示的文件的長度。
高級方法
- public String[] list() :返回一個String數組,表示該File目錄中的所有子文件或目錄。
- public File[] listFiles() :返回一個File數組,表示該File目錄中的所有的子文件或目錄。
遞歸
概述
遞歸就是方法內部自己調用自己.
註意事項
- 必須有出口,否則會出現棧內存溢出的錯誤.
- 遞歸的次數不宜過多.否則容易出現棧內存溢出
- 構造方法不能遞歸
理解
對於遞歸,可以使用棧來理解,入棧和出棧,對於整個程序的流程,首先,main方法入棧,接著遞歸方法入棧,方法內調用自己,
繼續入棧,知道出口進行返回出棧,層層出棧,這個就是底層的原理吧.
計算n的階乘
import java.util.Scanner;
/**
* 求n階乘
* 1.手動輸入計算的值
* 2.創建遞歸方法進行計算
* @author WZLOVE
* @create 2018-07-20 14:34
*/
public class Demo1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("請輸入您要計算的值是:");
int n = in.nextInt();
in.close();
long result = getRecursive(n);
System.out.println("您輸入的值的階乘計算結果為:" + result);
}
public static long getRecursive(int n){
// 定義出口
if( n == 1 ){
return 1;
}
return n * getRecursive( n - 1 );
}
}
打印多級目錄
package com.wzlove.recursive;
import java.io.File;
/**
* 遍歷多級目錄
*
* @author WZLOVE
* @create 2018-07-20 15:11
*/
public class Demo2 {
public static void main(String[] args) {
// 程序的健壯性測試
// File file = null;
// File file = new File("E:\\");
// 測試路徑
File file = new File("G:\\工作區間\\Intellij IDEA\\JavaSE");
printDirsAndFiles(file);
}
public static void printDirsAndFiles(File file){
// 程序的健壯性
if(file == null || !file.exists()){
return ;
}
// 如果是文件,直接輸出
if(file.isFile()){
System.out.println(file.getAbsolutePath());
}
// 如果是文件夾,進行遍歷遞
File[] files = file.listFiles();
// 如果沒有訪問權限,直接返回
if(files == null){
return ;
}
for (File file1 : files) {
if(file1.isFile()){
System.out.println(file1.getAbsolutePath());
} else {
System.out.println(file1.getAbsolutePath());
printDirsAndFiles(file1);
}
}
}
}
打印某個目錄下的所有.java文件
兩種方法,第一種:
package com.wzlove.recursive;
import java.io.File;
/**
* 搜索G:\工作區間\Intellij IDEA\JavaSE 目錄中的.java 文件。
* 1.創建File的對象,傳遞File的虛擬路徑
* 2.遞歸方法
* 3.進行健壯性判斷:
* * null的判斷
* * 文件不存在
* * 如果路徑是文件,這三種情況都是直接返回
* * 如果路徑合法
* (1) 判斷有無權限,有繼續向下,無直接返回
* (2) 返回該文件夾下的所有文件和文件夾
* (3) 增強for循環進行遍歷
* 如果是文件,判斷是否滿足要求(遞歸的出口)
* 如果是文件夾,進行遞歸調用
*
* @author WZLOVE
* @create 2018-07-20 16:27
*/
public class Demo3 {
public static void main(String[] args) {
File file = new File("G:\\工作區間\\Intellij IDEA\\JavaSE");
printAllJavaFiles(file);
}
public static void printAllJavaFiles(File file){
if(file == null || !file.exists() || file.isFile()){
return ;
}
File[] files = file.listFiles();
if(files == null){
return ;
}
for (File file1 : files) {
if(file1.isFile()){
if(file1.getName().endsWith(".java")){
System.out.println(file1.getAbsolutePath());
}
}else{
printAllJavaFiles(file1);
}
}
}
}
第二種,要使用到文件過濾器:
File[] listFiles(FileFilter filter) 返回一個抽象路徑名數組,表示由此抽象路徑名表示的滿足指定過濾器的目錄中的文件和目錄。
package com.wzlove.recursive; import java.io.File; import java.io.FileFilter; /** * * @author WZLOVE * @create 2018-07-20 16:27 */ public class Demo4 { public static void main(String[] args) { File file = new File("G:\\工作區間\\Intellij IDEA\\傳智播客\\JavaSE"); printAllJavaFiles(file); } public static void printAllJavaFiles(File file){ if(file == null || !file.exists() || file.isFile()){ return ; } // 使用listFiles(FileFilter) /** * File[] listFiles(FileFilter filter) * 返回一個抽象路徑名數組,表示由此抽象路徑名表示的滿足指定過濾器的目錄中的文件和目錄。 */ File[] files = file.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if(pathname.isFile() && pathname.getName().endsWith(".java")){ // 是以.java文件結尾的文件 return true; } // 如果是文件夾,也進行返回 if(pathname.isDirectory()){ return true; } // 其余情況返回false return false; } }); for (File file1 : files) { if(file1.isFile()){ System.out.println(file1.getAbsolutePath()); }else{ printAllJavaFiles(file1); } } } }
Java之File與遞歸