Java的異常體系以及File類構(gòu)造方法詳解
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.Error
與java.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)制度
隨著技術(shù)的發(fā)展,十進(jìn)制度因其精確性和便捷性在現(xiàn)代應(yīng)用中越來越受到青睞,下面我們就來看看如何使用Java實(shí)現(xiàn)度分秒坐標(biāo)轉(zhuǎn)十進(jìn)制度吧2024-12-12Spring Boot示例分析講解自動(dòng)化裝配機(jī)制核心注解
這篇文章主要分析了Spring Boot 自動(dòng)化裝配機(jī)制核心注解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-07-07java多線程CountDownLatch與線程池ThreadPoolExecutor/ExecutorService案
這篇文章主要介紹了java多線程CountDownLatch與線程池ThreadPoolExecutor/ExecutorService案例,2021-02-02Java實(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ā)布與部署的三種方式
SpringBoot 框架只提供了一套基于可執(zhí)行 jar 包(executable jar)格式的標(biāo)準(zhǔn)發(fā)布形式,但并沒有對(duì)部署做過多的界定,而且為了簡化可執(zhí)行 jar 包的生成,SpringBoot 提供了相應(yīng)的 Maven 項(xiàng)目插件,需要的朋友可以參考下2023-05-05Java獲取Excel中圖片所在的行和列坐標(biāo)位置
這篇文章主要介紹了Java獲取Excel中圖片所在的行和列坐標(biāo)位置,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08SpringBoot使用@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-10spring-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