一、File類概述
包位置:java.io.File
:
File類是文件和目錄路徑名的抽象表示童漩,主要用于文件和目錄的創(chuàng)建弄贿、刪除、獲取矫膨、判斷差凹、遍歷、獲取大胁嘞凇危尿;File類是一個(gè)與操作系統(tǒng)無關(guān)的一個(gè)類
1.File類操作系統(tǒng)相關(guān)分割符靜態(tài)成員變量:(省略static)
-
String pathSeparator
: 操作系統(tǒng)相關(guān)路徑分隔符,字符串表示【windows:分號(hào); linux:冒號(hào):】 -
char pathSeparatorChar
: 操作系統(tǒng)有關(guān)的路徑分隔符馁痴,字符表示 -
String separator
:與系統(tǒng)有關(guān)的默認(rèn)分隔符谊娇,字符串表示÷拊危【文件名稱分隔符 windows:反斜杠\ linux:正斜杠/】 -
char separatorChar
: 系統(tǒng)相關(guān)的默認(rèn)名稱分隔符,字符表示
/*
操作路徑:路徑不能寫死了
C:\develop\a\a.txt windows
C:/develop/a/a.txt linux
"C:"+File.separator+"develop"+File.separator+"a"+File.separator+"a.txt"
*/
System.out.println(File.pathSeparator);//路徑分隔符 windows:分號(hào); linux:冒號(hào):
System.out.println(File.separator);// 文件名稱分隔符 windows:反斜杠\ linux:正斜杠/
2.絕對(duì)路徑與相對(duì)路徑
- 絕對(duì)路徑:從盤符開始的路徑济欢,這是一個(gè)完整的路徑。
- 相對(duì)路徑:相對(duì)于項(xiàng)目目錄的根路徑小渊,這是一個(gè)便捷的路徑法褥,開發(fā)中經(jīng)常使用。(
C:\\Users\itcast\\IdeaProjects\\shungyuan\\123.txt
-->簡(jiǎn)化為:123.txt
(可以省略項(xiàng)目的根目錄))
注意:
- windows操作系統(tǒng)中路徑是不區(qū)分大小寫
- 路徑中的文件名稱分隔符windows使用反斜杠,反斜杠是轉(zhuǎn)義字符,兩個(gè)反斜杠代表一個(gè)普通的反斜杠
\\
二酬屉、構(gòu)造方法
構(gòu)造方法:(省略public)
-
File(String pathname)
: 路徑名字符串 --> 抽象路徑 --> new File 實(shí)例 -
File(String parent, String child)
: 父路徑名字符串+子路徑名字符串 --> new File 實(shí)例 -
File(File parent, String child)
:父抽象路徑名+子路徑名字符串 --> new File 實(shí)例
/** 絕對(duì)路徑與相對(duì)路徑參數(shù):
String pathname:字符串的路徑名稱
1.路徑可以是以文件結(jié)尾,也可以是以文件夾結(jié)尾
2.路徑可以是相對(duì)路徑,也可以是絕對(duì)路徑
3.路徑可以是存在,也可以是不存在
4.創(chuàng)建File對(duì)象,只是把字符串路徑封裝為File對(duì)象,不考慮路徑的真假情況*/
/*絕對(duì)路徑*/
String pathname1 = "G:\\picture\\feifei.jpg";
File file1 = new File(pathname1);
/*相對(duì)路徑*/
String parthname2 = ".\\moduleName\\fiefei.jpg";
File file2 = new File(parthname2);
- 父路徑和子路徑拼接
/**@父路徑和子路徑拼接
好處:
父路徑和子路徑,可以單獨(dú)書寫,使用起來非常靈活;父路徑和子路徑都可以變化*/
String parent3 = "G:\\picture";
String child3 = "feifei.jpg";
File file3 = new File(parent3, child3);
- 父級(jí)File對(duì)象(文件夾路徑) + 總路徑字符串
/** @父級(jí)File對(duì)象(文件夾路徑) + 總路徑字符串
好處:
1.父路徑和子路徑,可以單獨(dú)書寫,使用起來非常靈活;父路徑和子路徑都可以變化
2.父路徑是File類型,可以使用File的方法對(duì)路徑進(jìn)行一些操作,再使用路徑創(chuàng)建對(duì)象*/
File parentDir4 = new File("G:\\picture");
String child4 = "feifei.jpg";
File file4 = new File(parentDir4, child4);
1.一個(gè)File對(duì)象代表硬盤中實(shí)際村子的一個(gè)文件或者目錄
2.無論該路徑下時(shí)候存在文件或者目錄半等,都不影響File對(duì)象的創(chuàng)建。
三、常用功能
1.一般功能(省略public)
-
String getAbsolutePath()
: 返回此File的絕對(duì)路徑名 字符串酱鸭。- 返回盤符到文件后綴名或者末文夾件名之間的字符串
-
String getPath()
: 返回此File轉(zhuǎn)換為路徑名的字符串- 返回構(gòu)造路徑,
new File
對(duì)象時(shí)傳入的參數(shù)形式(相對(duì)或者絕對(duì)) -
toString
方法調(diào)用的就是getPath
方法
- 返回構(gòu)造路徑,
-
String getName()
:返回由此File表示的文件或者目錄的名稱垛吗。- 獲取的就是構(gòu)造方法傳遞路徑的結(jié)尾部分(文件/文件夾)
-
String long length()
:返回由此File表示的文件的長(zhǎng)度凹髓。- 獲取的是構(gòu)造方法指定的文件的大小,以字節(jié)為單位
- 文件夾是沒有大小概念的,不能獲取文件夾的大小
- 如果構(gòu)造方法中給出的路徑不存在,那么length方法返回0
-
String getParent()
:得到父路徑!
2.判斷功能的方法(省略public)
-
boolean exists()
: 返回此File表示的文件或者目錄是否實(shí)際存在 -
boolean isDirectory()
: 判斷此File表示的是否為目錄(文件夾結(jié)尾) -
boolean isFile()
: 判斷此File是否為文件(文件結(jié)尾)怯屉。1.電腦的硬盤中只有文件/文件夾,兩個(gè)方法是互斥
2.這兩個(gè)方法使用前提,路徑必須是存在的,否則都返回false
3.創(chuàng)建刪除功能方法(省略public)
-
boolean createNewFile
: 當(dāng)且僅當(dāng)該名稱的文件尚不存在時(shí)蔚舀,創(chuàng)建一個(gè)新的空文件(構(gòu)造方法的參數(shù))【創(chuàng)建文件的路徑必須存在】。(操作文件夾無效)返回值:布爾值
true:文件不存在,創(chuàng)建文件,返回true
false:文件存在,不會(huì)創(chuàng)建,返回false注意:創(chuàng)建文件的路徑必須存在,否則會(huì)拋出異常锨络,而且必須處理IOException異常
public boolean createNewFile() throws IOException
createNewFile聲明拋出了IOException,我們調(diào)用這個(gè)方法,就必須的處理這個(gè)異常,要么throws,要么trycatch -
boolean delete()
: 刪除由此File表示的文件或者目錄如果此File表示目錄赌躺,則目錄必須為空才能刪除。
- >刪除構(gòu)造方法路徑中給出的文件/文件夾【末尾文件或者末尾文件夾】
- >布爾值
true:文件/文件夾刪除成功
false:文件夾中有內(nèi)容,不會(huì)刪除
構(gòu)造方法中路徑不存在
- >注意:delete方法是直接在硬盤刪除文件/文件夾,不走回收站,刪除要謹(jǐn)慎
boolean mkdir()
: 創(chuàng)建由此File表示的目錄羡儿。(操作文件無效)-
boolean mkdirs()
:【推薦使用】創(chuàng)建由此File表示的目錄礼患,包括任何必須但是不存在的父目錄。返回值:布爾值
true:文件夾不存在,創(chuàng)建文件夾
false:文件夾存在,不會(huì)創(chuàng)建;
構(gòu)造方法中給出的路徑不存在
- >注意:此方法只能創(chuàng)建出文件夾,不能創(chuàng)建文件
4.目錄(目錄對(duì)象)的遍歷(省略public)
-
String[] list()
: 返回String數(shù)組掠归,該File目錄下的所有子文件或目錄缅叠。 -
File[] listFiles()
: 返回一個(gè)File數(shù)組,該File目錄下的所有的子文件或目錄調(diào)用listFiles方法的File對(duì)象虏冻,表示的必須是實(shí)際存在的目錄肤粱,否則返回null,無法進(jìn)行遍歷厨相。
- >注意:
1.如果構(gòu)造方法中給出的目錄的路徑不存在,會(huì)拋出空指針異常
2.如果構(gòu)造方法中給出的路徑不是一個(gè)目錄,也會(huì)拋出空指針異常
返回相關(guān)目錄下文件夾或文件的數(shù)組
File file = new File("day_08");
String[] fileSon = file.list();
System.out.println(Arrays.toString(fileSon));
// [day_08.iml, feifei.jpg, src]
5.文件過濾器優(yōu)化【有文件夾則遞歸尋找】【配合使用->dir.listFiles(lambda)
】
-
java.io.FileFilter
是一個(gè)File
過濾器领曼。該接口的對(duì)象可以傳遞給File
類的listFiles(FileFilter)
作為參數(shù),接口中只有一個(gè)方法-
boolean accept(File pathname)
:測(cè)試pathname是包含在當(dāng)前File目錄中蛮穿,符合則返回true
-
// 創(chuàng)建一個(gè)dir文件
File dir = new File(".\\day_08");
// 使用匿名函數(shù)的方式
File[] array = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() || pathname.getName().endsWith(".java");
}
});
// 使用lambda的方式
File[] array2 = dir.listFiles(
pathname -> pathname.isDirectory()
|| pathname.getName().endsWith(".java"));
6.文件過濾器優(yōu)化【非遞歸尋找】【配合使用->dir.listFiles(lambda)
】
-
java.io.FilenameFilter
接口:實(shí)現(xiàn)此接口的類實(shí)例可用于過濾器文件名庶骄。 -
boolean accept(File dir, String name)
測(cè)試指定文件是否應(yīng)該包含在某一文件列表中。-
File dir
:構(gòu)造方法中傳遞的被遍歷的目錄【文件所在目錄文件践磅,不含末尾文件/文件名】 -
String name
:使用ListFiles方法遍歷目錄,獲取的每一個(gè)文件/文件夾的名稱
-
File[] array = new File(".\\learnSelf").listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
System.out.println(dir); // .\\learnSelf
return name.toLowerCase().endsWith("java");
}
});
for (File file : array) {
System.out.println(file.getName());
}
綜合案例 遞歸訪問一個(gè)文件夾下面所有的文件夾或者文件(有color)
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File(".");
System.out.println(file.getName());
showFile(file, 0, "");
}
public static boolean showFile(File file, int depth, String fatherSpace) {
// 記錄當(dāng)前遞歸是否打印了前置空白,從而顯示得不太寬松
boolean printed = false;
// 遞歸打印當(dāng)前文件夾下的文件和文件夾
File[] filesList = file.listFiles();
File file1;
String current = "";
for (int i = 0; i < filesList.length; i ++) {
file1 = filesList[i];
System.out.print(fatherSpace + " |");
// 計(jì)算下一個(gè)遞歸需要的前置空白
if(i == filesList.length - 1) {
current = fatherSpace + " ";
} else {
current = fatherSpace + " |";
}
if(file1.isDirectory()) {
// 打印當(dāng)前的文件夾名稱
System.out.println("\033[34;1m-[D]\033[0m" + "\033[36;2m" + file1.getName() + "\033[0m");
// 遞歸遍歷此文件夾
printed = showFile(file1, depth + 1, current);
} else {
System.out.println("\033[31;1m-[F]\033[0m" + "\033[35;2m" + file1.getName() + "\033[0m");
}
// 當(dāng)前列表結(jié)束打印一個(gè)父級(jí)空白瓢姻,從而顯得不擁擠
if(i == filesList.length - 1 && !printed) {
System.out.println(fatherSpace);
return true;
}
}
return printed;
}
}