亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java的異常體系以及File類構(gòu)造方法詳解

 更新時間:2023年05月31日 11:00:12   作者:瑪拉_以琳  
這篇文章主要為大家介紹了Java的異常體系以及File類構(gòu)造方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1. 異常

1.1 異常概念

異常,就是不正常的意思。在生活中:醫(yī)生說,你的身體某個部位有異常,該部位和正常相比有點不同,該部位的功能將受影響.在程序中的意思就是:

  • 異常 :指的是程序在執(zhí)行過程中,出現(xiàn)的非正常的情況,最終會導致JVM的非正常停止。

在Java等面向?qū)ο蟮木幊陶Z言中,異常本身是一個類,產(chǎn)生異常就是創(chuàng)建異常對象并拋出了一個異常對象。Java處理異常的方式是中斷處理。

異常指的并不是語法錯誤,語法錯了,編譯不通過,不會產(chǎn)生字節(jié)碼文件,根本不能運行.

1.2 異常體系

異常機制其實是幫助我們找到程序中的問題,異常的根類是java.lang.Throwable,其下有兩個子類:java.lang.Errorjava.lang.Exception,平常所說的異常指java.lang.Exception。

Throwable體系:

  • Error:嚴重錯誤Error,無法通過處理的錯誤,只能事先避免,好比絕癥。
  • Exception:表示異常,異常產(chǎn)生后程序員可以通過代碼的方式糾正,使程序繼續(xù)運行,是必須要處理的。好比感冒、闌尾炎。

Throwable中的常用方法:

  • public void printStackTrace():打印異常的詳細信息。

    包含了異常的類型,異常的原因,還包括異常出現(xiàn)的位置,在開發(fā)和調(diào)試階段,都得使用printStackTrace。

  • public String getMessage():獲取發(fā)生異常的原因。

    提示給用戶的時候,就提示錯誤原因。

  • public String toString():獲取異常的類型和異常描述信息(不用)。

出現(xiàn)異常,不要緊張,把異常的簡單類名,拷貝到API中去查。![上傳中...]()

1.3 異常分類

我們平常說的異常就是指Exception,因為這類異常一旦出現(xiàn),我們就要對代碼進行更正,修復程序。

異常(Exception)的分類:根據(jù)在編譯時期還是運行時期去檢查異常?

  • 編譯時期異常:checked異常。在編譯時期,就會檢查,如果沒有處理異常,則編譯失敗。(如日期格式化異常)
  • 運行時期異常:runtime異常。在運行時期,檢查異常.在編譯時期,運行異常不會編譯器檢測(不報錯)。(如數(shù)學異常)

1.4 異常的產(chǎn)生過程解析

先運行下面的程序,程序會產(chǎn)生一個數(shù)組索引越界異常ArrayIndexOfBoundsException。我們通過圖解來解析下異常產(chǎn)生的過程。

工具類

public class ArrayTools {
    // 對給定的數(shù)組通過給定的角標獲取元素。
    public static int getElement(int[] arr, int index) {
        int element = arr[index];
        return element;
    }
}

測試類

public class ExceptionDemo {
    public static void main(String[] args) {
        int[] arr = { 34, 12, 67 };
        intnum = ArrayTools.getElement(arr, 4)
        System.out.println("num=" + num);
        System.out.println("over");
    }
}

上述程序執(zhí)行過程圖解:

1.5 拋出異常throw

在編寫程序時,我們必須要考慮程序出現(xiàn)問題的情況。比如,在定義方法時,方法需要接受參數(shù)。那么,當調(diào)用方法使用接受到的參數(shù)時,首先需要先對參數(shù)數(shù)據(jù)進行合法的判斷,數(shù)據(jù)若不合法,就應該告訴調(diào)用者,傳遞合法的數(shù)據(jù)進來。這時需要使用拋出異常的方式來告訴調(diào)用者。

在java中,提供了一個throw關(guān)鍵字,它用來拋出一個指定的異常對象。那么,拋出一個異常具體如何操作呢?

  • 創(chuàng)建一個異常對象。封裝一些提示信息(信息可以自己編寫)。
  • 需要將這個異常對象告知給調(diào)用者。怎么告知呢?怎么將這個異常對象傳遞到調(diào)用者處呢?通過關(guān)鍵字throw就可以完成。throw 異常對象。

    throw用在方法內(nèi),用來拋出一個異常對象,將這個異常對象傳遞到調(diào)用者處,并結(jié)束當前方法的執(zhí)行。

使用格式:

throw new 異常類名(參數(shù));

例如:

throw new NullPointerException("要訪問的arr數(shù)組不存在");
throw new ArrayIndexOutOfBoundsException("該索引在數(shù)組中不存在,已超出范圍");

學習完拋出異常的格式后,我們通過下面程序演示下throw的使用。

public class ThrowDemo {
    public static void main(String[] args) {
        //創(chuàng)建一個數(shù)組 
        int[] arr = {2,4,52,2};
        //根據(jù)索引找對應的元素 
        int index = 4;
        int element = getElement(arr, index);
        System.out.println(element);
        System.out.println("over");
    }
    /*
     * 根據(jù) 索引找到數(shù)組中對應的元素
     */
    public static int getElement(int[] arr,int index){ 
           //判斷  索引是否越界
        if(index<0 || index>arr.length-1){
             /*
             判斷條件如果滿足,當執(zhí)行完throw拋出異常對象后,方法已經(jīng)無法繼續(xù)運算。
             這時就會結(jié)束當前方法的執(zhí)行,并將異常告知給調(diào)用者。這時就需要通過異常來解決。 
              */
             throw new ArrayIndexOutOfBoundsException("哥們,角標越界了```");
        }
        int element = arr[index];
        return element;
    }
}

 注意:如果產(chǎn)生了問題,我們就會throw將問題描述類即異常進行拋出,也就是將問題返回給該方法的調(diào)用者。

那么對于調(diào)用者來說,該怎么處理呢?一種是進行捕獲處理,另一種就是繼續(xù)講問題聲明出去,使用throws聲明處理。

1.6 聲明異常throws

聲明異常:將問題標識出來,報告給調(diào)用者。如果方法內(nèi)通過throw拋出了編譯時異常,而沒有捕獲處理(稍后講解該方式),那么必須通過throws進行聲明,讓調(diào)用者去處理。

關(guān)鍵字throws運用于方法聲明之上,用于表示當前方法不處理異常,而是提醒該方法的調(diào)用者來處理異常(拋出異常).

聲明異常格式:

修飾符 返回值類型 方法名(參數(shù)) throws 異常類名1,異常類名2…{   }

聲明異常的代碼演示:

public class ThrowsDemo {
    public static void main(String[] args) throws FileNotFoundException {
        read("a.txt");
    }
    // 如果定義功能時有問題發(fā)生需要報告給調(diào)用者。可以通過在方法上使用throws關(guān)鍵字進行聲明
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

throws用于進行異常類的聲明,若該方法可能有多種異常情況產(chǎn)生,那么在throws后面可以寫多個異常類,用逗號隔開。

public class ThrowsDemo2 {
    public static void main(String[] args) throws IOException {
        read("a.txt");
    }
    public static void read(String path)throws FileNotFoundException, IOException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
        if (!path.equals("b.txt")) {
            throw new IOException();
        }
    }
}

1.7 捕獲異常try…catch

如果異常出現(xiàn)的話,會立刻終止程序,所以我們得處理異常:

  • 該方法不處理,而是聲明拋出,由該方法的調(diào)用者來處理(throws)。
  • 在方法中使用try-catch的語句塊來處理異常。

try-catch的方式就是捕獲異常。

  • 捕獲異常:Java中對異常有針對性的語句進行捕獲,可以對出現(xiàn)的異常進行指定方式的處理。

捕獲異常語法如下:

try{
     編寫可能會出現(xiàn)異常的代碼
}catch(異常類型  e){
     處理異常的代碼
     //記錄日志/打印異常信息/繼續(xù)拋出異常
}

try:該代碼塊中編寫可能產(chǎn)生異常的代碼。

catch:用來進行某種異常的捕獲,實現(xiàn)對捕獲到的異常進行處理。

注意:try和catch都不能單獨使用,必須連用。

演示如下:

public class TryCatchDemo {
    public static void main(String[] args) {
        try {// 當產(chǎn)生異常時,必須有處理方式。要么捕獲,要么聲明。
            read("b.txt");
        } catch (FileNotFoundException e) {// 括號中需要定義什么呢?
              //try中拋出的是什么異常,在括號中就定義什么異常類型
            System.out.println(e);
        }
        System.out.println("over");
    }
    /*
     *
     * 我們 當前的這個方法中 有異常  有編譯期異常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

如何獲取異常信息:

Throwable類中定義了一些查看方法:

  • public String getMessage():獲取異常的描述信息,原因(提示給用戶的時候,就提示錯誤原因。
  • public String toString():獲取異常的類型和異常描述信息(不用)。
  • public void printStackTrace():打印異常的跟蹤棧信息并輸出到控制臺。

? 包含了異常的類型,異常的原因,還包括異常出現(xiàn)的位置,在開發(fā)和調(diào)試階段,都得使用printStackTrace。

在開發(fā)中呢也可以在catch將編譯期異常轉(zhuǎn)換成運行期異常處理。

多個異常使用捕獲又該如何處理呢?

  • 多個異常分別處理。
  • 多個異常一次捕獲,多次處理。
  • 多個異常一次捕獲一次處理。

一般我們是使用一次捕獲多次處理方式,格式如下:

try{
     編寫可能會出現(xiàn)異常的代碼
}catch(異常類型A  e){  當try中出現(xiàn)A類型異常,就用該catch來捕獲.
     處理異常的代碼
     //記錄日志/打印異常信息/繼續(xù)拋出異常
}catch(異常類型B  e){  當try中出現(xiàn)B類型異常,就用該catch來捕獲.
     處理異常的代碼
     //記錄日志/打印異常信息/繼續(xù)拋出異常
}

 注意:這種異常處理方式,要求多個catch中的異常不能相同,并且若catch中的多個異常之間有子父類異常的關(guān)系,那么子類異常要求在上面的catch處理,父類異常在下面的catch處理。

1.8 finally 代碼塊

finally:有一些特定的代碼無論異常是否發(fā)生,都需要執(zhí)行。另外,因為異常會引發(fā)程序跳轉(zhuǎn),導致有些語句執(zhí)行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執(zhí)行的。

什么時候的代碼必須最終執(zhí)行?

當我們在try語句塊中打開了一些物理資源(磁盤文件/網(wǎng)絡連接/數(shù)據(jù)庫連接等),我們都得在使用完之后,最終關(guān)閉打開的資源。

finally的語法:

try...catch....finally:自身需要處理異常,最終還得關(guān)閉資源。

注意:finally不能單獨使用。

比如在我們之后學習的IO流中,當打開了一個關(guān)聯(lián)文件的資源,最后程序不管結(jié)果如何,都需要把這個資源關(guān)閉掉。

finally代碼參考如下:

public class TryCatchDemo4 {
    public static void main(String[] args) {
        try {
            read("a.txt");
        } catch (FileNotFoundException e) {
            //抓取到的是編譯期異常  拋出去的是運行期 
            throw new RuntimeException(e);
        } finally {
            System.out.println("不管程序怎樣,這里都將會被執(zhí)行。");
        }
        System.out.println("over");
    }
    /*
     *
     * 我們 當前的這個方法中 有異常  有編譯期異常
     */
    public static void read(String path) throws FileNotFoundException {
        if (!path.equals("a.txt")) {//如果不是 a.txt這個文件 
            // 我假設  如果不是 a.txt 認為 該文件不存在 是一個錯誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
    }
}

 當只有在try或者catch中調(diào)用退出JVM的相關(guān)方法,此時finally才不會執(zhí)行,否則finally永遠會執(zhí)行。

1.9 異常注意事項

  • 運行時異常被拋出可以不處理。即不捕獲也不聲明拋出。
  • 如果父類拋出了多個異常,子類覆蓋父類方法時,只能拋出相同的異?;蛘呤撬淖蛹?。
  • 父類方法沒有拋出異常,子類覆蓋父類該方法時也不可拋出異常。此時子類產(chǎn)生該異常,只能捕獲處理,不能聲明拋出
  • 當多異常處理時,捕獲處理,前邊的類不能是后邊類的父類
  • 在try/catch后可以追加finally代碼塊,其中的代碼一定會被執(zhí)行,通常用于資源回收。

1.10 概述

為什么需要自定義異常類:

我們說了Java中不同的異常類,分別表示著某一種具體的異常情況,那么在開發(fā)中總是有些異常情況是SUN沒有定義好的,此時我們根據(jù)自己業(yè)務的異常情況來定義異常類。,例如年齡負數(shù)問題,考試成績負數(shù)問題。

在上述代碼中,發(fā)現(xiàn)這些異常都是JDK內(nèi)部定義好的,但是實際開發(fā)中也會出現(xiàn)很多異常,這些異常很可能在JDK中沒有定義過,例如年齡負數(shù)問題,考試成績負數(shù)問題.那么能不能自己定義異常呢?

什么是自定義異常類:

在開發(fā)中根據(jù)自己業(yè)務的異常情況來定義異常類.

自定義一個業(yè)務邏輯異常: LoginException。一個登陸異常類。

異常類如何定義:

  • 自定義一個編譯期異常: 自定義類 并繼承于java.lang.Exception。
  • 自定義一個運行時期的異常類:自定義類 并繼承于java.lang.RuntimeException

1.11 自定義異常的練習

要求:我們模擬登陸操作,如果用戶名已存在,則拋出異常并提示:親,該用戶名已經(jīng)被注冊。

首先定義一個登陸異常類LoginException:

// 業(yè)務邏輯異常
public class LoginException extends Exception {
    /**
     * 空參構(gòu)造
     */
    public LoginException() {
    }
    /**
     *
     * @param message 表示異常提示
     */
    public LoginException(String message) {
        super(message);
    }
}

模擬登陸操作,使用數(shù)組模擬數(shù)據(jù)庫中存儲的數(shù)據(jù),并提供當前注冊賬號是否存在方法用于判斷。

public class Demo {
    // 模擬數(shù)據(jù)庫中已存在賬號
    private static String[] names = {"bill","hill","jill"};
    public static void main(String[] args) {     
        //調(diào)用方法
        try{
            // 可能出現(xiàn)異常的代碼
            checkUsername("nill");
            System.out.println("注冊成功");//如果沒有異常就是注冊成功
        } catch(LoginException e) {
            //處理異常
            e.printStackTrace();
        }
    }
    //判斷當前注冊賬號是否存在
    //因為是編譯期異常,又想調(diào)用者去處理 所以聲明該異常
    public static boolean checkUsername(String uname) throws LoginException {
        for (String name : names) {
            if(name.equals(uname)){//如果名字在這里面 就拋出登陸異常
                throw new LoginException("親"+name+"已經(jīng)被注冊了!");
            }
        }
        return true;
    }
}

2. File類

2.1 概述

java.io.File 類是文件和目錄路徑名的抽象表示,主要用于文件和目錄的創(chuàng)建、查找和刪除等操作。

2.2 構(gòu)造方法

  • public File(String pathname) :通過將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建新的 File實例。
  • public File(String parent, String child) :從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實例。
  • public File(File parent, String child) :從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實例。
  • 構(gòu)造舉例,代碼如下:
// 文件路徑名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname); 
// 文件路徑名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2); 
// 通過父路徑和子路徑字符串
 String parent = "d:\\aaa";
 String child = "bbb.txt";
 File file3 = new File(parent, child);
// 通過父級File對象和子路徑字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);

小貼士:

一個File對象代表硬盤中實際存在的一個文件或者目錄。

無論該路徑下是否存在文件或者目錄,都不影響File對象的創(chuàng)建。

2.3 常用方法

獲取功能的方法

  • public String getAbsolutePath() :返回此File的絕對路徑名字符串。
  • public String getPath() :將此File轉(zhuǎn)換為路徑名字符串。
  • public String getName() :返回由此File表示的文件或目錄的名稱。

public long length() :返回由此File表示的文件的長度。

方法演示,代碼如下:

public class FileGet {
    public static void main(String[] args) {
        File f = new File("d:/aaa/bbb.java");     
        System.out.println("文件絕對路徑:"+f.getAbsolutePath());
        System.out.println("文件構(gòu)造路徑:"+f.getPath());
        System.out.println("文件名稱:"+f.getName());
        System.out.println("文件長度:"+f.length()+"字節(jié)");
        File f2 = new File("d:/aaa");     
        System.out.println("目錄絕對路徑:"+f2.getAbsolutePath());
        System.out.println("目錄構(gòu)造路徑:"+f2.getPath());
        System.out.println("目錄名稱:"+f2.getName());
        System.out.println("目錄長度:"+f2.length());
    }
}
輸出結(jié)果:
文件絕對路徑:d:\aaa\bbb.java
文件構(gòu)造路徑:d:\aaa\bbb.java
文件名稱:bbb.java
文件長度:636字節(jié)
目錄絕對路徑:d:\aaa
目錄構(gòu)造路徑:d:\aaa
目錄名稱:aaa
目錄長度:4096

 API中說明:length(),表示文件的長度。但是File對象表示目錄,則返回值未指定。

絕對路徑和相對路徑

  • 絕對路徑:從盤符開始的路徑,這是一個完整的路徑。
  • 相對路徑:相對于項目目錄的路徑,這是一個便捷的路徑,開發(fā)中經(jīng)常使用。
public class FilePath {
    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());
    }
}
輸出結(jié)果:
D:\bbb.java
D:\idea_project_test4\bbb.java

判斷功能的方法

  • public boolean exists() :此File表示的文件或目錄是否實際存在。
  • public boolean isDirectory() :此File表示的是否為目錄。
  • public boolean isFile() :此File表示的是否為文件。

方法演示,代碼如下:

public class FileIs {
    public static void main(String[] args) {
        File f = new File("d:\\aaa\\bbb.java");
        File f2 = new File("d:\\aaa");
          // 判斷是否存在
        System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());
        System.out.println("d:\\aaa 是否存在:"+f2.exists());
          // 判斷是文件還是目錄
        System.out.println("d:\\aaa 文件?:"+f2.isFile());
        System.out.println("d:\\aaa 目錄?:"+f2.isDirectory());
    }
}
輸出結(jié)果:
d:\aaa\bbb.java 是否存在:true
d:\aaa 是否存在:true
d:\aaa 文件?:false
d:\aaa 目錄?:true

創(chuàng)建刪除功能的方法

  • public boolean createNewFile() :當且僅當具有該名稱的文件尚不存在時,創(chuàng)建一個新的空文件。
  • public boolean delete() :刪除由此File表示的文件或目錄。
  • public boolean mkdir() :創(chuàng)建由此File表示的目錄。
  • public boolean mkdirs() :創(chuàng)建由此File表示的目錄,包括任何必需但不存在的父目錄。

方法演示,代碼如下:

public class FileCreateDelete {
    public static void main(String[] args) throws IOException {
        // 文件的創(chuàng)建
        File f = new File("aaa.txt");
        System.out.println("是否存在:"+f.exists()); // false
        System.out.println("是否創(chuàng)建:"+f.createNewFile()); // true
        System.out.println("是否存在:"+f.exists()); // true
         // 目錄的創(chuàng)建
          File f2= new File("newDir");    
        System.out.println("是否存在:"+f2.exists());// false
        System.out.println("是否創(chuàng)建:"+f2.mkdir());    // true
        System.out.println("是否存在:"+f2.exists());// true
        // 創(chuàng)建多級目錄
          File f3= new File("newDira\\newDirb");
        System.out.println(f3.mkdir());// false
        File f4= new File("newDira\\newDirb");
        System.out.println(f4.mkdirs());// true
          // 文件的刪除
           System.out.println(f.delete());// true
          // 目錄的刪除
        System.out.println(f2.delete());// true
        System.out.println(f4.delete());// false
    }
}

 API中說明:delete方法,如果此File表示目錄,則目錄必須為空才能刪除。

2.4 目錄的遍歷

  • public String[] list() :返回一個String數(shù)組,表示該File目錄中的所有子文件或目錄。
  • public File[] listFiles() :返回一個File數(shù)組,表示該File目錄中的所有的子文件或目錄。
public class FileFor {
    public static void main(String[] args) {
        File dir = new File("d:\\java_code");
          //獲取當前目錄下的文件以及文件夾的名稱。
        String[] names = dir.list();
        for(String name : names){
            System.out.println(name);
        }
        //獲取當前目錄下的文件以及文件夾對象,只要拿到了文件對象,那么就可以獲取更多信息
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }
}

小貼士:

調(diào)用listFiles方法的File對象,表示的必須是實際存在的目錄,否則返回null,無法進行遍歷。

綜合練習

練習1:創(chuàng)建文件夾

? 在當前模塊下的aaa文件夾中創(chuàng)建一個a.txt文件

代碼實現(xiàn):

public class Test1 {
    public static void main(String[] args) throws IOException {
        //需求:在當前模塊下的aaa文件夾中創(chuàng)建一個a.txt文件
        //1.創(chuàng)建a.txt的父級路徑
        File file = new File("myfile\\aaa");
        //2.創(chuàng)建父級路徑
        //如果aaa是存在的,那么此時創(chuàng)建失敗的。
        //如果aaa是不存在的,那么此時創(chuàng)建成功的。
        file.mkdirs();
        //3.拼接父級路徑和子級路徑
        File src = new File(file,"a.txt");
        boolean b = src.createNewFile();
        if(b){
            System.out.println("創(chuàng)建成功");
        }else{
            System.out.println("創(chuàng)建失敗");
        }
    }
}

練習2:查找文件(不考慮子文件夾)

? 定義一個方法找某一個文件夾中,是否有以avi結(jié)尾的電影(暫時不需要考慮子文件夾)

代碼示例:

public class Test2 {
    public static void main(String[] args) {
        /*需求:
             定義一個方法找某一個文件夾中,是否有以avi結(jié)尾的電影。
            (暫時不需要考慮子文件夾)
        */
        File file = new File("D:\\aaa\\bbb");
        boolean b = haveAVI(file);
        System.out.println(b);
    }
    /*
    * 作用:用來找某一個文件夾中,是否有以avi結(jié)尾的電影
    * 形參:要查找的文件夾
    * 返回值:查找的結(jié)果  存在true  不存在false
    * */
    public static boolean haveAVI(File file){// D:\\aaa
        //1.進入aaa文件夾,而且要獲取里面所有的內(nèi)容
        File[] files = file.listFiles();
        //2.遍歷數(shù)組獲取里面的每一個元素
        for (File f : files) {
            //f:依次表示aaa文件夾里面每一個文件或者文件夾的路徑
            if(f.isFile() && f.getName().endsWith(".avi")){
                return true;
            }
        }
        //3.如果循環(huán)結(jié)束之后還沒有找到,直接返回false
        return false;
    }
}

練習3:(考慮子文件夾)

? 找到電腦中所有以avi結(jié)尾的電影。(需要考慮子文件夾)

代碼示例:

public class Test3 {
    public static void main(String[] args) {
        /* 需求:
        找到電腦中所有以avi結(jié)尾的電影。(需要考慮子文件夾)
        套路:
            1,進入文件夾
            2,遍歷數(shù)組
            3,判斷
            4,判斷
        */
        findAVI();
    }
    public static void findAVI(){
        //獲取本地所有的盤符
        File[] arr = File.listRoots();
        for (File f : arr) {
            findAVI(f);
        }
    }
    public static void findAVI(File src){//"C:\\
        //1.進入文件夾src
        File[] files = src.listFiles();
        //2.遍歷數(shù)組,依次得到src里面每一個文件或者文件夾
        if(files != null){
            for (File file : files) {
                if(file.isFile()){
                    //3,判斷,如果是文件,就可以執(zhí)行題目的業(yè)務邏輯
                    String name = file.getName();
                    if(name.endsWith(".avi")){
                        System.out.println(file);
                    }
                }else{
                    //4,判斷,如果是文件夾,就可以遞歸
                    //細節(jié):再次調(diào)用本方法的時候,參數(shù)一定要是src的次一級路徑
                    findAVI(file);
                }
            }
        }
    }
}

練習4:刪除多級文件夾

需求: 如果我們要刪除一個有內(nèi)容的文件夾

1.先刪除文件夾里面所有的內(nèi)容

2.再刪除自己

代碼示例:

public class Test4 {
    public static void main(String[] args) {
        /*
           刪除一個多級文件夾
           如果我們要刪除一個有內(nèi)容的文件夾
           1.先刪除文件夾里面所有的內(nèi)容
           2.再刪除自己
        */
        File file = new File("D:\\aaa\\src");
        delete(file);
    }
    /*
    * 作用:刪除src文件夾
    * 參數(shù):要刪除的文件夾
    * */
    public static void delete(File src){
        //1.先刪除文件夾里面所有的內(nèi)容
        //進入src
        File[] files = src.listFiles();
        //遍歷
        for (File file : files) {
            //判斷,如果是文件,刪除
            if(file.isFile()){
                file.delete();
            }else {
                //判斷,如果是文件夾,就遞歸
                delete(file);
            }
        }
        //2.再刪除自己
        src.delete();
    }
}

練習5:統(tǒng)計大小

? 需求:統(tǒng)計一個文件夾的總大小

代碼示例:

public class Test5 {
    public static void main(String[] args) {
       /*需求:
            統(tǒng)計一個文件夾的總大小
      */
        File file = new File("D:\\aaa\\src");
        long len = getLen(file);
        System.out.println(len);//4919189
    }
    /*
    * 作用:
    *       統(tǒng)計一個文件夾的總大小
    * 參數(shù):
    *       表示要統(tǒng)計的那個文件夾
    * 返回值:
    *       統(tǒng)計之后的結(jié)果
    *
    * 文件夾的總大?。?
    *       說白了,文件夾里面所有文件的大小
    * */
    public static long getLen(File src){
        //1.定義變量進行累加
        long len = 0;
        //2.進入src文件夾
        File[] files = src.listFiles();
        //3.遍歷數(shù)組
        for (File file : files) {
            //4.判斷
            if(file.isFile()){
                //我們就把當前文件的大小累加到len當中
                len = len + file.length();
            }else{
                //判斷,如果是文件夾就遞歸
                len = len + getLen(file);
            }
        }
        return len;
    }
}

練習6:統(tǒng)計文件個數(shù)

需求:統(tǒng)計一個文件夾中每種文件的個數(shù)并打印。(考慮子文件夾)

打印格式如下:
        txt:3個
        doc:4個
        jpg:6個

代碼示例:

public class Test6 {
    public static void main(String[] args) throws IOException {
        /*
            需求:統(tǒng)計一個文件夾中每種文件的個數(shù)并打印。(考慮子文件夾)
            打印格式如下:
            txt:3個
            doc:4個
            jpg:6個
        */
        File file = new File("D:\\aaa\\src");
        HashMap<String, Integer> hm = getCount(file);
        System.out.println(hm);
    }
    /*
    * 作用:
    *       統(tǒng)計一個文件夾中每種文件的個數(shù)
    * 參數(shù):
    *       要統(tǒng)計的那個文件夾
    * 返回值:
    *       用來統(tǒng)計map集合
    *       鍵:后綴名 值:次數(shù)
    *
    *       a.txt
    *       a.a.txt
    *       aaa(不需要統(tǒng)計的)
    *
    *
    * */
    public static HashMap<String,Integer> getCount(File src){
        //1.定義集合用來統(tǒng)計
        HashMap<String,Integer> hm = new HashMap<>();
        //2.進入src文件夾
        File[] files = src.listFiles();
        //3.遍歷數(shù)組
        for (File file : files) {
            //4.判斷,如果是文件,統(tǒng)計
            if(file.isFile()){
                //a.txt
                String name = file.getName();
                String[] arr = name.split("\\.");
                if(arr.length >= 2){
                    String endName = arr[arr.length - 1];
                    if(hm.containsKey(endName)){
                        //存在
                        int count = hm.get(endName);
                        count++;
                        hm.put(endName,count);
                    }else{
                        //不存在
                        hm.put(endName,1);
                    }
                }
            }else{
                //5.判斷,如果是文件夾,遞歸
                //sonMap里面是子文件中每一種文件的個數(shù)
                HashMap<String, Integer> sonMap = getCount(file);
                //hm:  txt=1  jpg=2  doc=3
                //sonMap: txt=3 jpg=1
                //遍歷sonMap把里面的值累加到hm當中
                Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
                for (Map.Entry<String, Integer> entry : entries) {
                    String key = entry.getKey();
                    int value = entry.getValue();
                    if(hm.containsKey(key)){
                        //存在
                        int count = hm.get(key);
                        count = count + value;
                        hm.put(key,count);
                    }else{
                        //不存在
                        hm.put(key,value);
                    }
                }
            }
        }
        return hm;
    }
}

以上就是Java的異常體系以及File類構(gòu)造方法詳解的詳細內(nèi)容,更多關(guān)于Java異常File類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實現(xiàn)度分秒坐標轉(zhuǎn)十進制度

    Java實現(xiàn)度分秒坐標轉(zhuǎn)十進制度

    隨著技術(shù)的發(fā)展,十進制度因其精確性和便捷性在現(xiàn)代應用中越來越受到青睞,下面我們就來看看如何使用Java實現(xiàn)度分秒坐標轉(zhuǎn)十進制度吧
    2024-12-12
  • Spring Boot示例分析講解自動化裝配機制核心注解

    Spring Boot示例分析講解自動化裝配機制核心注解

    這篇文章主要分析了Spring Boot 自動化裝配機制核心注解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-07-07
  • java多線程CountDownLatch與線程池ThreadPoolExecutor/ExecutorService案例

    java多線程CountDownLatch與線程池ThreadPoolExecutor/ExecutorService案

    這篇文章主要介紹了java多線程CountDownLatch與線程池ThreadPoolExecutor/ExecutorService案例,
    2021-02-02
  • Java 十大排序算法之選擇排序刨析

    Java 十大排序算法之選擇排序刨析

    選擇排序是一種簡單直觀的排序算法,無論什么數(shù)據(jù)進去都是 O(n&sup2;) 的時間復雜度。所以用到它的時候,數(shù)據(jù)規(guī)模越小越好。唯一的好處可能就是不占用額外的內(nèi)存空間了吧
    2021-11-11
  • Java實現(xiàn)隨機抽獎的三種方法

    Java實現(xiàn)隨機抽獎的三種方法

    在Java中實現(xiàn)隨機抽獎的方法,通常我們會使用java.util.Random類來生成隨機數(shù),然后基于這些隨機數(shù)來選擇中獎者,以下將給出幾種常見的隨機抽獎實現(xiàn)方式,需要的朋友可以參考下
    2024-09-09
  • 關(guān)于SpringBoot微服務發(fā)布與部署的三種方式

    關(guān)于SpringBoot微服務發(fā)布與部署的三種方式

    SpringBoot 框架只提供了一套基于可執(zhí)行 jar 包(executable jar)格式的標準發(fā)布形式,但并沒有對部署做過多的界定,而且為了簡化可執(zhí)行 jar 包的生成,SpringBoot 提供了相應的 Maven 項目插件,需要的朋友可以參考下
    2023-05-05
  • Java獲取Excel中圖片所在的行和列坐標位置

    Java獲取Excel中圖片所在的行和列坐標位置

    這篇文章主要介紹了Java獲取Excel中圖片所在的行和列坐標位置,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • SpringBoot使用@Async注解實現(xiàn)異步調(diào)用

    SpringBoot使用@Async注解實現(xiàn)異步調(diào)用

    這篇文章主要介紹了SpringBoot使用@Async注解實現(xiàn)異步調(diào)用,異步調(diào)用是相對于同步調(diào)用而言的,同步調(diào)用是指程序按預定順序一步步執(zhí)行,每一步必須等到上一步執(zhí)行完后才能執(zhí)行,異步調(diào)用則無需等待,程序執(zhí)行完即可執(zhí)行,可以減少程序執(zhí)行時間,需要的朋友可以參考下
    2023-10-10
  • spring-boot List轉(zhuǎn)Page的方法步驟

    spring-boot List轉(zhuǎn)Page的方法步驟

    這篇文章主要介紹了spring-boot List轉(zhuǎn)Page的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Spring Boot日志控制詳解

    Spring Boot日志控制詳解

    這篇文章主要為大家詳細介紹了Spring Boot日志控制的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論