Java IO編程——File文件操作類

  • 2019 年 11 月 1 日
  • 筆記

   在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中進行項目的開發,而在項目部署的時候基於LinuxUnix系統來進行項目發布以保證生產環節的安全性;

   在不同的作業系統之中會存在有不同的路徑分隔符: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