Java 從入門到進階之路(二十八)
在之前的文章我們都是通過 Java 在記憶體中應用,本章開始我們來看一下 Java 在系統文件(硬碟)上的操作。
系統文件就是我們電腦中的文件,簡單來說就是像 Windows 系統中 C D E 等各類盤符中的文件。Java 在系統文件的操作需要通過 File 來完成。
接下來我們通過一個簡單的實例來看一下 Java 在作業系統文件中的基本操作。
如上圖,我們先在項目目錄下創建一個 fileDemo.txt 的文件,通過電腦可以查看到它的一些屬性,如名稱,大小,是否可讀可寫等,接下來我們通過程式碼來對該文件進行一些操作。
1 package FileDemo; 2 3 import java.io.File; 4 5 /** 6 * java.io.File 7 * 8 * @author wjt 9 * File 可以表示一個文件或目錄 10 * 使用 File 可以: 11 * 1、訪問其表示的文件或目錄的屬性(如:名字,長度等) 12 * 2、可以創建或刪除一個文件或目錄 13 * 3、可以訪問一個目錄的所有子項資訊 14 * 但是 File 不能訪問一個文件的數據內容 15 */ 16 public class FileDemo1 { 17 public static void main(String[] args) { 18 // File.separator 相當於 / ,為了兼容 Windows 和 Linux 等系統 19 File file = new File("." + File.separator + "fileDemo.txt"); 20 String name = file.getName(); // 文件名 21 long len = file.length(); // 文件名的長度 22 boolean canRead = file.canRead(); // 文件是否可讀 23 boolean canWrite = file.canWrite(); // 文件是否可寫 24 boolean isHidden = file.isHidden(); // 文件是否隱藏 25 System.out.println("name: " + name); // name: fileDemo.txt 26 System.out.println("len: " + len); // len: 11 27 System.out.println("canRead: " + canRead); // canRead: true 28 System.out.println("canWrite: " + canWrite); // canWrite: true 29 System.out.println("isHidden: " + isHidden); // isHidden: false 30 } 31 }
通過對比我們可以看出程式碼運行對文件所做的列印內容和電腦屬性所展示的文件名,大小,可讀寫性等是一樣的。
接下來我們再來看一下如何創建一個文件
1 package FileDemo; 2 3 import java.io.File; 4 import java.io.IOException; 5 6 /** 7 * 創建一個文件 8 * 9 * @author wjt 10 */ 11 public class FileDemo2 { 12 public static void main(String[] args) throws IOException { 13 /** 14 * 在當前目錄下創建文件 fileDemo2.txt 15 * 默認路徑就是當前路徑,即 "./",所以可以不寫 16 */ 17 File file = new File("fileDemo2.txt"); 18 if (!file.exists()) { // 判斷是否存在該文件 19 file.createNewFile(); 20 System.out.println("創建完畢!"); 21 } else { 22 System.out.println("文件已存在!"); 23 } 24 } 25 }
在上面都程式碼中,我們可以通過 file.exists() 來判斷文件是否存在,然後通過 file.createNewFile() 來創建文件,需要注意都是該方法需要拋出異常,然後我們就可以在當前目錄下創建我們需要都文件來。
既然能創建文件,納悶我們就能刪除文件,如下:
1 /** 2 * 刪除一個文件 3 * 4 * @author wjt 5 */ 6 public class FileDemo3 { 7 public static void main(String[] args) { 8 /** 9 * 刪除當前目錄中都 fileDemo2.txt 文件 10 */ 11 File file = new File("fileDemo2.txt"); 12 if (file.exists()) { // 判斷是否存在該文件 13 file.delete(); 14 System.out.println("刪除完畢"); 15 } else { 16 System.out.println("文件不存在"); 17 } 18 } 19 }
在上面都程式碼中,我們可以通過 file.delete() 方法來對文件進行刪除,需要注意對是這裡的刪除是真的刪了,在電腦的回收站里是找不到的,不像電腦的刪除操作,所以在進行此操作時需要特別注意!
既然可以創建文件,那麼我們也就能創建文件目錄,如下:
1 /** 2 * 創建一個目錄 3 * 4 * @author wjt 5 */ 6 public class FileDemo4 { 7 public static void main(String[] args) { 8 // 創建一個單級目錄 9 File dir1 = new File("demo"); 10 if (!dir1.exists()) { 11 dir1.mkdir(); 12 System.out.println("創建目錄完畢!"); 13 } else { 14 System.out.println("該目錄已存在!"); 15 } 16 // 創建一個多級目錄 ./a/b/c 17 File dir2 = new File("a" + File.separator + "b" + File.separator + "c"); 18 if (!dir2.exists()) { 19 // mkdirs() 在創建當前目錄的同時將所有不存在的父目錄一起創建出出來 20 dir2.mkdirs(); 21 System.out.println("創建目錄完畢!"); 22 } else { 23 System.out.println("該目錄已存在!"); 24 } 25 } 26 }
創建文件和創建目錄方法上大同小異,只不過是換成了 mkdir() 方法,但是需要注意對是在創建多級目錄時所需要調用的方法是 mkdirs() 來進行創建。
同樣的我們也可以對創建對目錄進行刪除,如下:
1 /** 2 * 刪除目錄 3 * @author wjt 4 */ 5 public class FileDemo5 { 6 public static void main(String[] args) { 7 File dir1 = new File("demo"); 8 if(dir1.exists()){ 9 dir1.delete(); 10 System.out.println("目錄刪除成功!"); 11 }else { 12 System.out.println("目錄不存在!"); 13 } 14 15 File dir2 = new File("a"); 16 if(dir2.exists()){ 17 dir2.delete(); 18 System.out.println("目錄刪除成功!"); 19 }else { 20 System.out.println("文件不存在!"); 21 } 22 } 23 }
刪除目錄和刪除文件所用對方法都是 delete(),我們通過該方法將剛才創建的目錄 demo 和 a 進行刪除,可以發現 demo 目錄被刪除成功了,a 目錄雖然也列印了 「目錄刪除成功」,但是並沒有真正的刪除掉,這是因為 a 目錄並不是一個空目錄,如果想要刪該目錄,需要老老實實一級一級進行刪除!如下程式碼:
1 /** 2 * 獲取一個目錄中所有的子項 3 * 4 * @author wjt 5 */ 6 public class FileDemo6 { 7 public static void main(String[] args) { 8 // 獲取當前目錄中的所有子項 9 File dir = new File("."); 10 /** 11 * boolean isFile() 判斷是否為一個文件 12 * boolean isDirectory() 判斷是否為一個目錄 13 */ 14 if (dir.isDirectory()) { 15 /** 16 * File[] listFiles() 獲取所有子項 17 */ 18 File[] subs = dir.listFiles(); 19 for (File sub : subs) { 20 if (sub.isFile()) { 21 System.out.print("文件:"); 22 } else { 23 System.out.print("目錄:"); 24 } 25 System.out.println(sub.getName()); 26 // 文件:demo.iml 27 // 目錄:out 28 // 目錄:a 29 // 文件:fileDemo.txt 30 // 目錄:.idea 31 // 目錄:src 32 } 33 } 34 } 35 }
在上面的程式碼中,我們可以獲取到某一個目錄下所有到文件和目錄,那麼我們就可以實現一個方法來對指定目錄進行刪除,如下
1 /** 2 * 刪除多級目錄 3 */ 4 public class FileDemo7 { 5 public static void main(String[] args) { 6 File dir = new File("a"); 7 delete(dir); 8 } 9 10 public static void delete(File file) { 11 if (file.isDirectory()) { 12 // 將其所有子項刪除 13 File[] subs = file.listFiles(); 14 for (File sub : subs) { 15 // 遞歸調用 16 delete(sub); 17 } 18 } 19 file.delete(); 20 } 21 }
通過上面對方法我們可以將多級目錄進行刪除,其中我們用到了遞歸操作!遞歸操作開銷還是挺大對,在程式中應盡量避免!
我們在上面的程式碼中用到了 listFiles() 方法來獲取當前目錄下所有的文件和目錄,當然我們也可以通過該方法獲取到我們想要的文件或目錄,如下:
1 /** 2 * 獲取一個目錄中符合條件對部分子項 3 * 使用重載對 listFiles 方法,需要傳入一個額外的文件過濾器 4 * 文件過濾器是一個介面:FileFilter 5 * 6 * @author wjt 7 */ 8 public class FileDemo8 { 9 public static void main(String[] args) { 10 File dir = new File("."); 11 // 獲取名字以 "." 開頭的子項 12 File[] subs = dir.listFiles(new FileFilter() { 13 @Override 14 public boolean accept(File file) { 15 return file.getName().startsWith("."); 16 } 17 }); 18 for (File sub : subs) { 19 System.out.println(sub.getName()); // .idea 20 } 21 } 22 }