帶你認識 File 類
一有额、初識 Java IO
Java IO 操作主要指的是使用Java進行輸入、輸出操作,Java 中的所有 IO 操作類都存放在 java.io 包中陆蟆,在開發(fā)時需要導入此包。
在 Java 程序中鸦概,對于數(shù)據(jù)的輸入、輸出操作以流(stream)的方式進行,Java 提供了種類豐富的“流”類窗市,java.io 包中重要的類有5個:File先慷、InputStream、OutputStream咨察、Reader论熙、Writer。用來處理不同種類的數(shù)據(jù)摄狱,在程序開發(fā)過程中通過標準的代碼進出數(shù)據(jù)的輸入或輸出操作脓诡。
以程序為中心,從文件或者網(wǎng)絡上讀取到程序中就用輸入流媒役,從程序中寫出到文件或者網(wǎng)絡上就用輸出流祝谚。
二、文件操作 File 類
1酣衷、File 類的基本介紹
File 類是文件和目錄路徑名的抽象表示交惯,一個 File 對象的建立不等于創(chuàng)建了一個文件或者目錄,而是指與文件或者目錄建立了聯(lián)系穿仪,通過 File 類的對象可以訪問文件的屬性席爽、創(chuàng)建空文件和目錄、以及刪除文件和目錄等操作啊片。
2只锻、File 類的兩個常量和路徑的三種表示形式
File.pathSeparator 表示系統(tǒng)默認路徑分隔符,Windows 中使用“;”表示紫谷,Linux中使用“:”表示炬藤;File.separator 表示系統(tǒng)默認名稱分隔符,Windows 中使用“\”表示碴里,Linux中使用“/”表示。
Windows 中文件路徑的表示方式用“\”來表示上真,在 Java 中需要通過轉移字符“\”來表示咬腋;Linux 中文件路徑表示方式用“/”來表示,當在程序里動態(tài)生成文件路徑的時候可以使用系統(tǒng)默認名稱分隔符 File.separator 來表示睡互。
在開發(fā)中推薦大家使用“”/”來做目錄名稱的分隔符根竿,不管是什么系統(tǒng)都可以使用,比如:
“D:/Download/image/tomcat.png”就珠。
@Test
public void test2()
// 路徑分隔符 windows(;) linux(:)
System.out.println(File.pathSeparator);
// 名稱分隔符 windows(\) linux(/)
System.out.println(File.separator);
// 路徑的幾種表示形式
// windows 的方式
String path = "D:\\Download\\image\\tomcat.png";
// 動態(tài)生成推薦使用這種方式
path = "D:" + File.separator + "Download" + File.separator + "image" + File.separator + "tomcat.png";
// 推薦使用的方式寇壳,什么平臺都能用
path = "D:/Download/image/tomcat.png";
System.out.println(path);
}
3、使用 File 類進行文件的判斷操作
我們在操作文件的時候妻怎,經常會用到文件的判斷操作壳炎,常用的判斷操作有:文件或目錄是否存在、是否是文件逼侦、是否是文件夾匿辩、獲取文件的長度等等腰耙。
@Test
public void test3() {
String path = "D:/Download/image/tomcat.png";
File file = new File(path); // 建立與文件的聯(lián)系
System.out.println("文件是否存在:" + file.exists());
System.out.println("文件是否是文件:" + file.isFile());
System.out.println("文件是否是文件夾:" + file.isDirectory());
// 返回字節(jié)數(shù),如果是文件夾則讀不出來長度
System.out.println("文件的長度是:" + file.length());
System.out.println("文件是否可寫:" + file.canWrite());
System.out.println("文件是否可讀:" + file.canRead());
}
4铲球、使用 File 類進行文件的創(chuàng)建與刪除
文件的創(chuàng)建操作用 createNewFile() 方法挺庞,文件不存在則創(chuàng)建新文件,存在則返回 false稼病;文件的刪除用 delete() 方法选侨,文件不存在返回 false;在開發(fā)中然走,一般創(chuàng)建和刪除文件時都會判斷一下文件是否存在援制。
@Test
public void test4() throws IOException, InterruptedException {
String path = "D:/Download/image/tomcat.jpg";
File file = new File(path); // 建立文件的聯(lián)系
if (!file.exists()) {
boolean flag = file.createNewFile(); // 文件不存在則創(chuàng)建新文件,存在則返回false
System.out.println(flag ? "文件創(chuàng)建成功" : "文件創(chuàng)建失敗");
}
if (file.exists()) {
boolean flag = file.delete(); // 文件不存在返回false
System.out.println(flag ? "文件刪除成功" : "文件刪除失敗");
}
}
5丰刊、使用 File 類進行目錄的操作
目錄的創(chuàng)建操作方法有兩個隘谣,一是 mkdir() 方法,只有父目錄存在的情況下才能創(chuàng)建成功啄巧;二是 mkdirs() 方法寻歧,如果父目錄不存在則可把父目錄一起創(chuàng)建出來。
目錄的刪除依然用 delete() 方法秩仆,如果目錄下面有內容則返回 false码泛;在開發(fā)中,一般使用 mkdirs() 方法創(chuàng)建目錄澄耍。
@Test
public void test5() throws IOException, InterruptedException {
// 本地存在pic目錄噪珊,但是沒有photo和2020目錄
String path = "D:/Download/image/pic/photo/2020";
File file = new File(path);
System.out.println(file.mkdir()); // false
System.out.println(file.mkdirs()); // true
}
6、使用 File 類列出指定目錄下的文件
在日常開發(fā)中齐莲,列出目錄下的文件這個功能經常會用到痢站,用 File[] listFiles() 方法可以列出目錄下的文件或者文件夾,返回的是文件數(shù)組选酗。通過循環(huán)遍歷返回的文件數(shù)組就可以獲取到每一個文件或者文件夾阵难。listFiles() 方法使用的比較多。
還有一個 String[] list() 方法芒填,它可以列出目錄下的文件或者文件夾的名稱呜叫,這個在開發(fā)中不常用。
@Test
public void test6() {
String path = "D:/Download/txt";
File file = new File(path);
if (file.exists()) {
// 列出指定目錄下的文件或目錄的名稱字符串數(shù)組殿衰,不常用
String[] fileNmaes = file.list();
System.out.println(Arrays.deepToString(fileNmaes));
// 列出指定目錄下的文件或目錄的File對象數(shù)組朱庆,常用方法
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
System.out.println(f);
}
}
}
}
程序運行輸出結果:
[123.txt, txt1]
D:\Download\txt\123.txt
D:\Download\txt\txt1
7、綜合案例:列出指定目錄下的全部內容
列出指定目錄下的全部內容和列出指定目錄下的文件闷祥,區(qū)別在于:指定目錄下可能存在文件娱颊,也可能存在文件夾,子文件夾里也可能存在文件和文件夾。因此需要使用遞歸的方法完成维蒙。
開發(fā)思路:首先判斷指定目錄是否是目錄掰吕,如果是目錄的話,通過 listFiles() 方法獲取該目錄下的文件或者文件夾颅痊,循環(huán)取出 File 對象殖熟,調用遞歸方法完成文件路徑的輸出。
遞歸方法:遞歸方法必須要有結束的條件斑响,同時要求遞歸的函數(shù)體內要調用自己菱属。
@Test
public void test7() {
String path = "D:/Download/txt";
File file = new File(path);
print(file);
}
// 遞歸方法輸出指定目錄下的文件內容
public static void print(File file) {
if (file != null && file.exists()) {
if (file.isDirectory()) {
// 如果是目錄的話,首先輸出路徑舰罚,然后繼續(xù)獲取該目錄下的內容
System.out.println(file);
File[] files = file.listFiles();
if (files != null) { // for循環(huán)前判空是個良好的開發(fā)習慣
for (File f : files) {
print(f); // 遞歸的函數(shù)體內要調用自己
}
}
} else {// 直接打印文件的絕對路徑纽门,也就是遞歸結束的條件
System.out.println(file);
}
}
}
File 類是 Java IO 操作最基礎的類,也是唯一的與文件產生關系的類营罢,在所有 IO 操作之前都需要通過 File 類創(chuàng)建文件對象赏陵,從而與要操作的文件路徑建立聯(lián)系,之后才能通過選擇具體的 IO 流進行文件的操作饲漾。
下一篇文章會給大家介紹 IO 流的分類與使用蝙搔,敬請期待......