1. 程式人生 > >Java IO程式設計——File檔案操作類

Java IO程式設計——File檔案操作類

   在Java語言裡面提供有對於檔案作業系統操作的支援,而這個支援就在java.io.File類中進行了定義,也就是說在整個java.io包裡面,File類是唯一 一個與檔案本身操作(建立、刪除、重新命名等)有關的類,而如果要想進行File類的操作,必須要提供有完整的路徑,而後可以呼叫相應的方法進行處理。

1. File類的基本使用

   開啟JDK文件可以發現,File類時Comparable介面的子類,所以File類的物件是可以進行排序處理的。在進行File類處理的時候需要為其設定訪問路徑,那麼對於路徑的配置主要通過File類的構造方法處理:

public class Fileextends Objectimplements Serializable, Comparable<File>

  ·構造方法:public File​(String pathname),設定要操作完整路徑;

  ·構造方法:public File​(File parent,String child),設定父路徑與子目錄;

   如果現在要想進行檔案的基本操作,可以使用如下的方法:

  ·建立新檔案:public boolean createNewFile​()throws IOException;

  ·判斷檔案是否存在:public boolean exists​();

  ·刪除檔案:public boolean delete​();

範例:使用File類建立一個檔案(d:\mldn.txt)

 1 import java.io.File;
 2 public class JavaAPIDemo {
 3     public static void main(String[] args) throws Exception {
 4         File file = new File("d:\\mldn.txt");
 5         if (file.exists()) {
 6             file.delete();// 刪除檔案
 7         } else { // 檔案不存在
 8             System.out.println(file.createNewFile()); // 建立新的檔案
 9         }
10     }
11 }
JavaAPIDemo

通過程式碼可以發現,File類實現的就是檔案本身的處理。


2. File類操作深入

1、在實際的軟體專案開發和執行的過程之中,往往都會在Windows中進行專案的開發,而在專案部署的時候基於Linux或Unix系統來進行專案釋出以保證生產環節的安全性;

   在不同的作業系統之中會存在有不同的路徑分隔符:Windows分隔符“\”、Linux分隔符"/",所以在最初進行開發的時候就必須考慮不同系統環境下的分隔符的問題,所以為了解決此問題,File類提供有一個常量:public static final String separator;

範例:正常的路徑編寫

File file = new File("d:" + File.separator + "mldn.txt");

  但是隨著系統的適應性的不斷加強,對於當前的路徑操作,也可以隨意使用了。

File file = new File("d:/mldn.txt");
 1 //完整程式碼
 2 import java.io.File;
 3 public class JavaAPIDemo {
 4     public static void main(String[] args) throws Exception {
 5         File file = new File("d:" + File.separator + "mldn.txt");
 6         if (file.exists()) {
 7             file.delete();// 刪除檔案
 8         } else { // 檔案不存在
 9             System.out.println(file.createNewFile()); // 建立新的檔案
10         }
11     }
12 }
JavaAPIDemo

2、在進行檔案建立的時候有一個重要的前提:檔案的父路徑必須首先存在。

·如何獲取父路徑:public File getParentFile​();

 

·建立多級目錄:public boolean mkdirs​();

 1 import java.io.File;
 2 public class JavaAPIDemo {
 3     public static void main(String[] args) throws Exception {
 4         File file = new File("d:" + File.separator + "hello" + File.separator + "demo" + File.separator + "message"
 5                 + File.separator + "pluto.txt");
 6         if (!file.getParentFile().exists()) {    // 父路徑不存在
 7             file.getParentFile().mkdirs() ; // 建立父路徑
 8         }
 9         if (file.exists()) {
10             file.delete();// 刪除檔案
11         } else { // 檔案不存在
12             System.out.println(file.createNewFile()); // 建立新的檔案
13         }
14     }
15 }
JavaAPIDemo

注:這種判斷並且建立父目錄的操作在很多的情況下可能只需要一次,但是如果將這個判斷一直都停留在程式碼裡面,那麼就會造成時間複雜度的提升,所以這個時候如果要想提升效能,請先保證目錄以及建立。

3. 獲取檔案資訊

   除了可以進行檔案的操作之外也可以通過File類來獲取一些檔案本身提供的資訊,可以獲取如下內容:

·檔案是否可讀:public boolean canRead​();

·檔案是否可寫:public boolean canWrite​();

·獲取檔案長度:public long length​(),該方法返回的是long資料型別、位元組長度;

·最後一次修改日期時間:public long lastModified​();

·判斷是否為目錄:public boolean isDirectory​();

·判斷是否為檔案:public boolean isFile​();

 1 //my.jpg可以修改為該盤的任一個檔案,須帶上字尾名
 2 import java.io.File;
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 class MathUtil {//將位元組Bytes數目轉換為MB
 6     private MathUtil() {
 7     }
 8 
 9     public static double round(double num, int scale) {
10         return Math.round(Math.pow(10, scale) * num) / Math.pow(10, scale);
11     }
12 }
13 public class JavaAPIDemo {
14     public static void main(String[] args) throws Exception {
15         File file = new File("d:" + File.separator + "my.jpg");
16         System.out.println("檔案是否可讀:" + file.canRead());
17         System.out.println("檔案是否可寫:" + file.canWrite());
18         System.out.println("檔案大小:" + MathUtil.round(file.length() / (double) 1024 / 1024, 2));
19         System.out.println(
20                 "最後的修改時間:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified())));
21         System.out.println("是目錄嗎?" + file.isDirectory());
22         System.out.println("是檔案嗎?" + file.isFile());
23     }
24 }
JavaAPIDemo

既然可以判斷給定的路徑是檔案還是目錄,那麼就可以進一步的判斷,如果發現是目錄,則應該列出目錄中的全部內容:

   ·列出目錄內容:public File[] listFiles​();

 1 import java.io.File;
 2 public class JavaAPIDemo {
 3     public static void main(String[] args) throws Exception {
 4         File file = new File("d:" + File.separator);
 5         if (file.isDirectory()) {    // 當前是一個目錄
 6             File result [] = file.listFiles() ; // 列出目錄中的全部內容
 7             for (int x = 0 ; x < result.length ; x ++) {
 8                 System.out.println(result[x]);
 9             }
10         }
11     }
12 }
JavaAPIDemo

這些資訊的獲得都是檔案或目錄本身的操作,都是不涉及到檔案內容處理的。

4. File操作案例:列出指定目錄中的全部檔案

由開發者任意設定一個目錄的路徑,而後將這個目錄中所有的檔案的資訊全部列出,包括子目錄中的所有檔案,在這樣的處理情況下最好的做法就是利用遞迴的形式來完成。

範例:列出指定目錄的全部檔案

 1 import java.io.File;
 2 public class JavaAPIDemo {
 3     public static void main(String[] args) throws Exception {
 4         File file = new File("D:" + File.separator) ;    // 是一個目錄
 5         long start = System.currentTimeMillis();
 6         listDir(file) ;
 7         long end = System.currentTimeMillis();
 8         System.out.println("時間是:"+(end-start));
 9     }
10     public static void listDir(File file) {
11         if (file.isDirectory()) {    // 是一個目錄
12             File results [] = file.listFiles() ; // 列出目錄中的全部內容
13             if (results != null) {
14                 for (int x = 0 ; x < results.length ; x ++) {
15                     listDir(results[x]) ; // 繼續依次判斷
16                 }
17             }
18         }
19         System.out.println(file);    // 獲得完整路徑
20     }
21 }
JavaAPIDemo

如果現在將路徑輸出變為刪除操作,那麼就徹底刪除路徑。

 1 //慎重,小心使用 mldnjava問目錄,若該目錄不存在,也可以使用改盤的其他資料夾
 2 import java.io.File;
 3 public class JavaAPIDemo {
 4     public static void main(String[] args) throws Exception {
 5         File file = new File("D:" + File.separator + "mldnjava") ;    // 是一個目錄
 6         listDir(file) ;
 7     }
 8     public static void listDir(File file) {
 9         if (file.isDirectory()) {    // 是一個目錄
10             File results [] = file.listFiles() ; // 列出目錄中的全部內容
11             if (results != null) {
12                 for (int x = 0 ; x < results.length ; x ++) {
13                     listDir(results[x]) ; // 繼續依次判斷
14                 }
15             }
16         }
17         file.delete() ;
18     }
19 }
JavaAPIDemo

5. File操作案例:批量修改檔名稱

編寫程式,程式執行時輸入目錄名稱,並把該目錄下的所有檔名字尾修改為.txt。

 

·對於這些的操作必須設定一些假設的約定,能夠重新命名的檔案都是有後綴的,如果沒有後綴的路徑,則為其追加路徑,如果有後綴的路徑,則必須以最後一個“.”進行擷取。

 1 import java.io.File;
 2 public class JavaAPIDemo {
 3     public static void main(String[] args) throws Exception {
 4         File file = new File("D:" + File.separator + "test") ;    // 是一個目錄
 5         long start = System.currentTimeMillis() ;
 6         renameDir(file) ;
 7         long end = System.currentTimeMillis() ;
 8         System.out.println("本次操作所花費的時間:" + (end - start));
 9     }
10     public static void renameDir(File file) {
11         if (file.isDirectory()) {    // 是一個目錄
12             File results [] = file.listFiles() ; // 列出子目錄中的內容
13             if (results != null) {
14                 for (int x = 0 ; x < results.length ; x ++) {
15                     renameDir(results[x]) ;
16                 }
17             }
18         } else {
19             if (file.isFile()) {    // 如果是檔案則必須進行重新命名
20                 String fileName = null ; 
21                 if (file.getName().contains(".")) {
22                     fileName = file.getName().substring(0,file.getName().lastIndexOf(".")) + ".txt" ;
23                 } else {
24                     fileName = file.getName() + ".txt" ;
25                 }
26                 File newFile = new File(file.getParentFile(),fileName) ; // 新的檔名稱
27                 file.renameTo(newFile) ; // 重新命名
28             }
29         }
30     }
31 }
JavaAPIDemo

&n