欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1. 異常

1.1 異常概念

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

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

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

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

1.2 異常體系

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

Throwable體系:

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

Throwable中的常用方法:

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

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

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

    提示給用戶的時(shí)候,就提示錯(cuò)誤原因。

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

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

1.3 異常分類

我們平常說的異常就是指Exception,因?yàn)檫@類異常一旦出現(xiàn),我們就要對(duì)代碼進(jìn)行更正,修復(fù)程序。

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

  • 編譯時(shí)期異常:checked異常。在編譯時(shí)期,就會(huì)檢查,如果沒有處理異常,則編譯失敗。(如日期格式化異常)
  • 運(yùn)行時(shí)期異常:runtime異常。在運(yùn)行時(shí)期,檢查異常.在編譯時(shí)期,運(yùn)行異常不會(huì)編譯器檢測(不報(bào)錯(cuò))。(如數(shù)學(xué)異常)

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

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

工具類

public class ArrayTools {
    // 對(duì)給定的數(shù)組通過給定的角標(biāo)獲取元素。
    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

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

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

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

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

使用格式:

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

例如:

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

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

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

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

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

1.6 聲明異常throws

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

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

聲明異常格式:

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

聲明異常的代碼演示:

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

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

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這個(gè)文件 
            // 我假設(shè)  如果不是 a.txt 認(rèn)為 該文件不存在 是一個(gè)錯(cuò)誤 也就是異常  throw
            throw new FileNotFoundException("文件不存在");
        }
        if (!path.equals("b.txt")) {
            throw new IOException();
        }
    }
}

1.7 捕獲異常try…catch

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

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

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

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

捕獲異常語法如下:

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

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

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

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

演示如下:

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

如何獲取異常信息:

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

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

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

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

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

  • 多個(gè)異常分別處理。
  • 多個(gè)異常一次捕獲,多次處理。
  • 多個(gè)異常一次捕獲一次處理。

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

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

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

1.8 finally 代碼塊

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

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

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

finally的語法:

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

注意:finally不能單獨(dú)使用。

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

finally代碼參考如下:

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

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

1.9 異常注意事項(xiàng)

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

1.10 概述

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

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

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

什么是自定義異常類:

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

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

異常類如何定義:

  • 自定義一個(gè)編譯期異常: 自定義類 并繼承于java.lang.Exception。
  • 自定義一個(gè)運(yùn)行時(shí)期的異常類:自定義類 并繼承于java.lang.RuntimeException。

1.11 自定義異常的練習(xí)

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

首先定義一個(gè)登陸異常類LoginException:

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

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

public class Demo {
    // 模擬數(shù)據(jù)庫中已存在賬號(hào)
    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();
        }
    }
    //判斷當(dāng)前注冊賬號(hào)是否存在
    //因?yàn)槭蔷幾g期異常,又想調(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實(shí)例。
  • public File(String parent, String child) :從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例。
  • public File(File parent, String child) :從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例。
  • 構(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);
// 通過父級(jí)File對(duì)象和子路徑字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);

小貼士:

一個(gè)File對(duì)象代表硬盤中實(shí)際存在的一個(gè)文件或者目錄。

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

2.3 常用方法

獲取功能的方法

  • public String getAbsolutePath() :返回此File的絕對(duì)路徑名字符串。
  • 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("文件絕對(duì)路徑:"+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("目錄絕對(duì)路徑:"+f2.getAbsolutePath());
        System.out.println("目錄構(gòu)造路徑:"+f2.getPath());
        System.out.println("目錄名稱:"+f2.getName());
        System.out.println("目錄長度:"+f2.length());
    }
}
輸出結(jié)果:
文件絕對(duì)路徑:d:\aaa\bbb.java
文件構(gòu)造路徑:d:\aaa\bbb.java
文件名稱:bbb.java
文件長度:636字節(jié)
目錄絕對(duì)路徑:d:\aaa
目錄構(gòu)造路徑:d:\aaa
目錄名稱:aaa
目錄長度:4096

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

絕對(duì)路徑和相對(duì)路徑

  • 絕對(duì)路徑:從盤符開始的路徑,這是一個(gè)完整的路徑。
  • 相對(duì)路徑:相對(duì)于項(xiàng)目目錄的路徑,這是一個(gè)便捷的路徑,開發(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());
        // 項(xiàng)目下的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表示的文件或目錄是否實(shí)際存在。
  • 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() :當(dāng)且僅當(dāng)具有該名稱的文件尚不存在時(shí),創(chuàng)建一個(gè)新的空文件。
  • 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)建多級(jí)目錄
          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() :返回一個(gè)String數(shù)組,表示該File目錄中的所有子文件或目錄。
  • public File[] listFiles() :返回一個(gè)File數(shù)組,表示該File目錄中的所有的子文件或目錄。
public class FileFor {
    public static void main(String[] args) {
        File dir = new File("d:\\java_code");
          //獲取當(dāng)前目錄下的文件以及文件夾的名稱。
        String[] names = dir.list();
        for(String name : names){
            System.out.println(name);
        }
        //獲取當(dāng)前目錄下的文件以及文件夾對(duì)象,只要拿到了文件對(duì)象,那么就可以獲取更多信息
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }
}

小貼士:

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

綜合練習(xí)

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

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

代碼實(shí)現(xiàn):

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

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

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

代碼示例:

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

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

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

代碼示例:

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

練習(xí)4:刪除多級(jí)文件夾

需求: 如果我們要?jiǎng)h除一個(gè)有內(nèi)容的文件夾

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

2.再刪除自己

代碼示例:

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

練習(xí)5:統(tǒng)計(jì)大小

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

代碼示例:

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

練習(xí)6:統(tǒng)計(jì)文件個(gè)數(shù)

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

打印格式如下:
        txt:3個(gè)
        doc:4個(gè)
        jpg:6個(gè)

代碼示例:

public class Test6 {
    public static void main(String[] args) throws IOException {
        /*
            需求:統(tǒng)計(jì)一個(gè)文件夾中每種文件的個(gè)數(shù)并打印。(考慮子文件夾)
            打印格式如下:
            txt:3個(gè)
            doc:4個(gè)
            jpg:6個(gè)
        */
        File file = new File("D:\\aaa\\src");
        HashMap<String, Integer> hm = getCount(file);
        System.out.println(hm);
    }
    /*
    * 作用:
    *       統(tǒng)計(jì)一個(gè)文件夾中每種文件的個(gè)數(shù)
    * 參數(shù):
    *       要統(tǒng)計(jì)的那個(gè)文件夾
    * 返回值:
    *       用來統(tǒng)計(jì)map集合
    *       鍵:后綴名 值:次數(shù)
    *
    *       a.txt
    *       a.a.txt
    *       aaa(不需要統(tǒng)計(jì)的)
    *
    *
    * */
    public static HashMap<String,Integer> getCount(File src){
        //1.定義集合用來統(tǒng)計(jì)
        HashMap<String,Integer> hm = new HashMap<>();
        //2.進(jìn)入src文件夾
        File[] files = src.listFiles();
        //3.遍歷數(shù)組
        for (File file : files) {
            //4.判斷,如果是文件,統(tǒng)計(jì)
            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里面是子文件中每一種文件的個(gè)數(shù)
                HashMap<String, Integer> sonMap = getCount(file);
                //hm:  txt=1  jpg=2  doc=3
                //sonMap: txt=3 jpg=1
                //遍歷sonMap把里面的值累加到hm當(dāng)中
                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)造方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Java異常File類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)現(xiàn)度分秒坐標(biāo)轉(zhuǎn)十進(jìn)制度

    Java實(shí)現(xiàn)度分秒坐標(biāo)轉(zhuǎn)十進(jìn)制度

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

    Spring Boot示例分析講解自動(dòng)化裝配機(jī)制核心注解

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

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

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

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

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

    Java實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)的三種方法

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

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

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

    Java獲取Excel中圖片所在的行和列坐標(biāo)位置

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

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

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

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

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

    Spring Boot日志控制詳解

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

最新評(píng)論