在之前的文章我們都是通過 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 }