第一章 File類(lèi)
1.1 概述
java.io.File
類(lèi)是文件和目錄路徑名的抽象表示榕茧,主要用于文件和目錄的創(chuàng)建、查找和刪除等操作客给。
1.2 構(gòu)造方法
-
public File(String pathname)
:通過(guò)將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來(lái)創(chuàng)建新的 File實(shí)例用押。 -
public File(String parent, String child)
:從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例。 -
public File(File parent, String child)
:從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例靶剑。 - 如:
/*
注意:
路徑可以是存在,也可以是不存在
創(chuàng)建File對(duì)象,只是把字符串路徑封裝為File對(duì)象蜻拨,不考慮路徑的真假情況
*/
// 文件路徑名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname);
// 文件路徑名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2);
// 通過(guò)父路徑和子路徑字符串
String parent = "d:\\aaa";
String child = "bbb.txt";
File file3 = new File(parent, child);
// 通過(guò)父級(jí)File對(duì)象和子路徑字符
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);
小貼士:
- 一個(gè)File對(duì)象代表硬盤(pán)中實(shí)際存在的一個(gè)文件或者目錄。
- 無(wú)論該路徑下是否存在文件或者目錄桩引,都不影響File對(duì)象的創(chuàng)建缎讼。
1.3 常用方法
獲取功能的方法
-
public String getAbsolutePath()
:返回此File的絕對(duì)路徑名字符串。 -
public String getPath()
:將此File轉(zhuǎn)換為路徑名字符串坑匠。 -
public String getName()
:返回由此File表示的文件或目錄的名稱(chēng)血崭。 -
public long length()
:返回由此File表示的文件的長(zhǎng)度。 -
static String pathSeparator
:與系統(tǒng)有關(guān)的路徑分隔符厘灼,為了方便夹纫,它被表示為一個(gè)字符串。 -
static char pathSeparatorChar
:與系統(tǒng)有關(guān)的路徑分隔符设凹。 -
static String separator
:與系統(tǒng)有關(guān)的默認(rèn)名稱(chēng)分隔符舰讹,為了方便,它被表示為一個(gè)字符串闪朱。 -
static char separatorChar
:與系統(tǒng)有關(guān)的默認(rèn)名稱(chēng)分隔符月匣。 - 如:
/*
注意:
1.路徑是不區(qū)分大小寫(xiě)
2.路徑中的文件名稱(chēng)分隔符windows使用反斜杠匈睁,反斜杠是轉(zhuǎn)義字符,兩個(gè)反斜杠代表一個(gè)普通的反斜杠
*/
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("文件名稱(chēng):"+f.getName());
System.out.println("文件長(zhǎng)度:"+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("目錄名稱(chēng):"+f2.getName());
System.out.println("目錄長(zhǎng)度:"+f2.length());
}
}
輸出結(jié)果:
文件絕對(duì)路徑:d:\aaa\bbb.java
文件構(gòu)造路徑:d:\aaa\bbb.java
文件名稱(chēng):bbb.java
文件長(zhǎng)度:636字節(jié)
目錄絕對(duì)路徑:d:\aaa
目錄構(gòu)造路徑:d:\aaa
目錄名稱(chēng):aaa
目錄長(zhǎng)度:4096
API中說(shuō)明:length()桶错,表示文件的長(zhǎng)度。但是File對(duì)象表示目錄胀蛮,則返回值未指定院刁,可能輸出0。
絕對(duì)路徑和相對(duì)路徑
- 絕對(duì)路徑:從盤(pán)符開(kāi)始的路徑粪狼,這是一個(gè)完整的路徑退腥。
- 相對(duì)路徑:相對(duì)于項(xiàng)目目錄的路徑,這是一個(gè)便捷的路徑再榄,開(kāi)發(fā)中經(jīng)常使用狡刘。
public class FilePath {
public static void main(String[] args) {
// D盤(pán)下的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)具有該名稱(chē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
// 目錄的刪除
/*
注意:
delete方法是直接在硬盤(pán)刪除文件/文件夾,不走回收站姑荷,刪除要謹(jǐn)慎盒延。
*/
System.out.println(f2.delete());// true
System.out.println(f4.delete());// false
}
}
API中說(shuō)明:delete方法,如果此File表示目錄鼠冕,則目錄必須為空才能刪除添寺。
1.4 目錄的遍歷
-
public String[] list()
:返回一個(gè)String數(shù)組,表示該File目錄中的所有子文件或目錄供鸠。 -
public File[] listFiles()
:返回一個(gè)File數(shù)組畦贸,表示該File目錄中的所有的子文件或目錄。
public class FileFor {
/*
注意:
list方法和listFiles方法遍歷的是構(gòu)造方法中給出的目錄
如果構(gòu)造方法中給出的目錄的路徑不存在,會(huì)拋出空指針異常
如果構(gòu)造方法中給出的路徑不是一個(gè)目錄,也會(huì)拋出空指針異常
*/
public static void main(String[] args) {
File dir = new File("d:\\java_code");
//獲取當(dāng)前目錄下的文件以及文件夾的名稱(chē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,無(wú)法進(jìn)行遍歷繁堡。
第二章 遞歸搜索文件
2.1 文件搜索
搜索D:\aaa
目錄中的.java
文件沈善。
分析:
- 目錄搜索乡数,使用遞歸,遍歷所有目錄闻牡。
- 遍歷目錄時(shí)净赴,獲取的子文件,通過(guò)文件名稱(chēng)罩润,判斷是否符合條件玖翅。
代碼實(shí)現(xiàn):
public class DiGuiDemo3 {
public static void main(String[] args) {
// 創(chuàng)建File對(duì)象
File dir = new File("D:\\aaa");
// 調(diào)用打印目錄方法
printDir(dir);
}
public static void printDir(File dir) {
// 獲取子文件和目錄
File[] files = dir.listFiles();
// 循環(huán)打印
for (File file : files) {
if (file.isFile()) {
// 是文件,判斷文件名并輸出文件絕對(duì)路徑
if (file.getName().endsWith(".java")) {
System.out.println("文件名:" + file.getAbsolutePath());
}
}
else {
// 是目錄割以,繼續(xù)遍歷,形成遞歸
printDir(file);
}
}
}
}
2.2 文件過(guò)濾器優(yōu)化
java.io.FileFilter
是一個(gè)接口金度,是File的過(guò)濾器。該接口的對(duì)象可以傳遞給File類(lèi)的listFiles(FileFilter)
作為參數(shù)严沥,接口中只有一個(gè)方法猜极。
boolean accept(File pathname)
:測(cè)試pathname是否應(yīng)該包含在當(dāng)前File目錄中,符合則返回true消玄。
分析:
- 接口作為參數(shù)跟伏,需要傳遞子類(lèi)對(duì)象,重寫(xiě)其中方法翩瓜。我們選擇匿名內(nèi)部類(lèi)方式酬姆,比較簡(jiǎn)單。
-
accept
方法奥溺,參數(shù)為File辞色,表示當(dāng)前File下所有的子文件和子目錄。保留住則返回true浮定,過(guò)濾掉則返回 false相满。 - 通過(guò)過(guò)濾器的作用,
listFiles(FileFilter)
返回的數(shù)組元素中桦卒,子文件對(duì)象都是符合條件的立美,直接打印。
代碼實(shí)現(xiàn):
public class DiGuiDemo4 {
public static void main(String[] args) {
File dir = new File("D:\\aaa");
printDir2(dir);
}
public static void printDir2(File dir) {
// 匿名內(nèi)部類(lèi)方式,創(chuàng)建過(guò)濾器子類(lèi)對(duì)象
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".java")||pathname.isDirectory();
}
});
// 循環(huán)打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
}
else {
printDir2(file);
}
}
}
}
2.3 Lambda優(yōu)化
分析:FileFilter
是只有一個(gè)方法的接口方灾,因此可以用lambda表達(dá)式簡(jiǎn)寫(xiě)建蹄。
lambda格式:
()‐>{ }
代碼實(shí)現(xiàn):
public static void printDir3(File dir) {
// lambda的改寫(xiě)
File[] files = dir.listFiles(f ‐>{
return f.getName().endsWith(".java") || f.isDirectory();
});
// 循環(huán)打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
}
else {
printDir3(file);
}
}
}