Java:File類、遞迴、查詢檔案
1、File類-概述
1)java.io.File
這個類可以表示磁碟上的一個檔案/目錄,可以獲取檔案/目錄的一些屬性資訊:
檔案/目錄的名字
檔案的大小
檔案/目錄的最後修改時間
檔案/目錄是否可讀、是否可寫
2、File類-File類的構造方法
public File(String pathname)
:通過將給定的路徑名字串轉換為抽象路徑名來建立新的 File例項。(路徑可以不存在)public File(String parent, String child)
:從父路徑名字串和子路徑名字串建立新的 File例項。public File(File parent, String child)
//1.構造方法:File(String pathName) File file1 = new File("d:\\demo03.txt");//檔名--絕對路徑 File file2 = new File("d:\\單級目錄");//目錄名--絕對路徑 File file3 = new File("demo02.txt");//檔名--相對路徑 File file4 = new File("d:\\jfewjfkeljfdsljfkljfksljfdkslajfdkslafjs");//不存在 //2.構造方法:File(String parent,String child)
3、File類-絕對路徑和相對路徑
1)、絕對路徑:是帶碟符的全路徑;
2)、絕對路徑:不帶碟符的,從專案根目錄下找;
4、File類-File類的常用方法-獲取的方法
public String getAbsolutePath()
public String getPath()
:返回此File物件封裝的路徑名字串public String getName()
:返回由此File表示的檔案或目錄的名稱。public long length()
:返回由此File表示的檔案的長度(不能用於目錄)public static void main(String[] args) { File file1 = new File("d:\\demo03.txt");//絕對路徑--檔案存在 File file2 = new File("demo03.txt");//相對路徑--檔案不存在 System.out.println("file1的絕對路徑:" +file1.getAbsolutePath()); System.out.println("file2的絕對路徑:" +file2.getAbsolutePath()); System.out.println("file1封裝的路徑:" + file1.getPath()); System.out.println("file2封裝的路徑:" + file2.getPath()); System.out.println("file1的檔名:" + file1.getName()); System.out.println("file2的檔名:" + file2.getName()); System.out.println("file1的檔案大小:" + file1.length()); }
5、File類-File類的常用方法-判斷的方法
public boolean exists()
:此File表示的檔案或目錄是否實際存在。public boolean isDirectory()
:此File表示的是否為目錄。public boolean isFile()
:此File表示的是否為檔案。public static void main(String[] args) { File file1 = new File("d:\\demo03.txt");//絕對路徑--檔案存在 File file2 = new File("demo03.txt");//相對路徑--檔案不存在 System.out.println("file1是否存在:" + file1.exists());//true System.out.println("file2是否存在:" + file2.exists());//false System.out.println("file1是否是目錄:" + file1.isDirectory());//false System.out.println("file2是否是目錄:" + file2.isDirectory());//false System.out.println("file1是否是檔案:" + file1.isFile());//true System.out.println("file2是否是檔案:" + file2.isFile());//false File file3 = new File("d:\\單級目錄"); System.out.println("file3是否存在:" + file3.exists());//true System.out.println("file3是否是檔案:" + file3.isFile());//false System.out.println("file3是否是目錄:" + file3.isDirectory());//true } }
6、File類-File類的常用方法-建立和刪除的方法
public boolean createNewFile()
:當且僅當具有該名稱的檔案尚不存在時,建立一個新的空檔案。(建立成功返回true,建立失敗,返回false)public boolean delete()
:刪除由此File表示的檔案或目錄。(徹底刪除,只能刪除空目錄和檔案)public boolean mkdir()
:建立由此File表示的目錄。(建立單級目錄)public boolean mkdirs()
:建立由此File表示的目錄,包括任何必需但不存在的父目錄。(建立多級目錄)public static void main(String[] args) throws IOException { File file1 = new File("demo05.txt"); System.out.println("建立檔案:" + file1.createNewFile()); File file2 = new File("aaa"); System.out.println("建立檔案:" + file2.createNewFile()); File file3 = new File("bbb"); System.out.println("建立目錄:" + file3.mkdir()); File file4 = new File("demo05_2.txt"); System.out.println("建立目錄:" + file4.mkdir()); File file5 = new File("demo05\\demo04\\demo03"); System.out.println("建立多級目錄:" + file5.mkdirs()); System.out.println("刪掉demo05.txt : " + file1.delete()); System.out.println("刪除空目錄:" + file3.delete());//不能刪除非空目錄 }
7、File類-練習-遍歷單級目錄
public File[] listFies()
:獲取此目錄下的所有檔案/目錄下的檔案物件,並存為陣列
public static void main(String[] args) {
File file = new File("d:\\");
File[] fileArray = file.listFiles();
for (File f : fileArray) {
System.out.println((f.isFile()? "檔案:" : "目錄:") + f.getAbsolutePath());
}
}
注意:listFiles在以下情況下返回null:
1)、當前的File物件表示的是一個檔案;
2)、當前的File物件表示的是一個系統目錄;
3)、當前的File物件表示的目錄不存在
如果File物件是一個存在的空目錄,listFile會返回一個0長度的陣列
8、遞迴-前奏-方法呼叫解析
public class Demo {
public static void main(String[] args) {
f1();
System.out.println("a");
}
private static void f1() {
f2();
System.out.println("b");
}
private static void f2() {
f3();
System.out.println("c");
}
private static void f3() {
System.out.println("d");
}
}
執行結果為dcba
9、遞迴-遞迴的概念-示例-圖示
遞迴:方法的遞迴呼叫,指方法呼叫自己本身
public class Demo {
private static int count = 0;
public static void main(String[] args) {
f1();
}
private static void f1() {
count++;
System.out.println("f1... count = " + count);
f1();
}
}
注意:
1)遞迴的層次不能太深,否則“棧溢位”
2)、必須要有出口,否則就是“死遞迴”
3)、構造方法不能使用遞迴呼叫
public class Demo {
private static int count = 0;
public static void main(String[] args) {
f1();
}
private static void f1() {
count++;
System.out.println("f1... count = " + count);
if (count == 3) {
return;//設定出口
}
f1();
}
}
10、遞迴-練習-遞迴求階乘
求階乘:如5!=5 * 4 * 3 * 2 * 1
使用迴圈:
int result = 1;
for(int i = 1 ;i <= 5; i++){
result = result * i;
}
System.out.println("結果是:" + result);
使用遞迴:
public static void main(String[] args){
int num = 5;
System.out.println(num + " 的階乘為:" + jieCheng5(num));
}
public static int jieCheng5(int num){
if(num == 1){
return 1;//出口
}
return num * jieCheng5(num - 1);
}
11、遞迴-練習-遞迴遍歷多級目錄
public class Demo {
public static void main(String[] args) {
//需求:將d:\\aaa2目錄下所有的檔案查找出來,並列印其絕對路徑
/*
1).封裝初始目錄:
---------------遞迴方法--------------
2).獲取此目錄下所有的子檔案/子目錄的File[]陣列
3).遍歷陣列,判斷是否是檔案:
是:列印
否:從步驟2 到這裡形成遞迴
*/
//1).封裝初始目錄:
File dir = new File("d:\\aaa2");
listFiles(dir);
}
private static void listFiles(File dir)
//2).獲取此目錄下所有的子檔案/子目錄的File[]陣列
File[] fileArray = dir.listFiles();
//3).遍歷陣列,判斷是否是檔案:
if (fileArray != null) {
for (File f : fileArray) {
if (f.isFile()) {
System.out.println(f.getAbsolutePath());
}else{
listFiles(f);
}
}
}
}
}
12、案例-檔案搜尋-第一版-自過濾
public class Demo {
public static void main(String[] args) {
//1.封裝初始目錄
Scanner sc = new Scanner(System.in);
System.out.println("請輸入查詢路徑:");
String path = sc.nextLine();
System.out.println("請輸入要搜尋的字尾名(例如:avi):");
String suffix = sc.next();
File dir = new File(path);
listFiles(dir,suffix);
}
private static void listFiles(File dir,String suffix) {
//2.列出此目錄下所有的子檔案/子目錄的陣列
File[] fileArray = dir.listFiles();
//3.遍歷
if (fileArray != null) {
for (File f : fileArray) {
if (f.isFile() && f.getName().endsWith("." + suffix)) {
System.out.println(f.getAbsolutePath());
}else{
listFiles(f,suffix);
}
}
}
}
}
13、案例-檔案搜尋-檔案過濾器說明
public static void main(String[] args) {
File f = new File("d:\\aaa2");
File[] fileArray = f.listFiles(new FileFilter() {//過濾器
@Override
public boolean accept(File pathname) {//篩網--listFiles方法會將f的每個子檔案/子目錄都走一下這個篩網
if (pathname.isFile() && pathname.getName().endsWith(".txt")) {
return true;//保留--會儲存到陣列中
}
return false;//丟棄
}
});
System.out.println("陣列大小:" + fileArray.length);
}
14、案例-檔案搜尋-過濾器
public class Demo {
public static void main(String[] args) {
//搜尋:"D:\20180903(76期)_就業班(上午)"目錄下所有的.avi檔案
File dir = new File("D:\\20180903(76期)_就業班(上午)");
listFiles(dir);
}
private static void listFiles(File dir) {
File[] fileArray = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if((pathname.isFile() && pathname.getName().endsWith(".avi")) || pathname.isDirectory()){
return true;
}
return false;
}
});
//遍歷
if (fileArray != null) {
for (File f : fileArray) {
if (f.isFile()) {
System.out.println(f.getAbsolutePath());
}else{
listFiles(f);//遞迴呼叫
}
}
}
}
}
15、案例-檔案搜尋-Lambda表示式
public class Demo {
public static void main(String[] args) {
//搜尋:"D:\20180903(76期)_就業班(上午)"目錄下所有的.avi檔案
File dir = new File("D:\\20180903(76期)_就業班(上午)");
listFiles(dir);
}
private static void listFiles(File dir) {
File[] fileArray = dir.listFiles((File pathname) -> {
if((pathname.isFile() &&
pathname.getName().endsWith(".avi"))
|| pathname.isDirectory()){
return true;
}
return false;
}
);
//遍歷
if (fileArray != null) {
for (File f : fileArray) {
if (f.isFile()) {
System.out.println(f.getAbsolutePath());
}else{
listFiles(f);//遞迴呼叫
}
}
}
}
}
複習
[ ] 能夠說出File物件的建立方式
File file = new File("路徑"); File file = new File("父路徑","子路徑"); File parent = new File("父路徑"); File file = new File(parent,"子路徑");
[ ] 能夠說出File類獲取名稱的方法名稱
getName();
[ ] 能夠說出File類獲取絕對路徑的方法名稱
getAbsolutePath();//獲取絕對路徑 getPath();//獲取封裝的檔案路徑
[ ] 能夠說出File類獲取檔案大小的方法名稱
length();
[ ] 能夠說出File類判斷是否是檔案的方法名稱
isFile();
[ ] 能夠說出File類判斷是否是資料夾的方法名稱
isDirectory();
[ ] 能夠辨別相對路徑和絕對路徑
絕對路徑:從碟符開始的路徑
相對路徑:從當前資料夾開始
[ ] 能夠遍歷資料夾
File file = new File("路徑"); File[] fileArray = file.listFile(); for(File f:fileArray){ System.out.println(f.getAbsolutePath();); }
[ ] 能夠解釋遞迴的含義
方法自己呼叫自己
[ ] 能夠使用遞迴的方式計算5的階乘
Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); System.out.println(num+"的階乘為:"+jianCheng(num)); public int jianCheng(int num){ if(num == 1){ return 1; }else{ return num * janCheng(num - 1); } }
[ ] 能夠說出使用遞迴會記憶體溢位隱患的原因
沒有出口的遞迴,一直壓棧,沒有彈棧