Java檔案操作


檔案建立

可以使用File類的createNewFile()方法建立一個新檔案:

File dummyFile = new File("test.txt");
boolean fileCreated  = dummyFile.createNewFile();

如果具有指定名稱的檔案尚不存在,createNewFile()方法將建立一個新的空檔案。如果檔案已成功建立則返回true; 否則返回false。 如果發生I/O錯誤,該方法將丟擲IOException

還可以在預設的臨時檔案目錄或目錄中建立一個臨時檔案。要在預設臨時目錄中建立臨時檔案,請使用File類的createTempFile()靜態方法,該方法接受字首和字尾以生成臨時檔案名。

File  tempFile = File.createTempFile("abc", ".txt");

檔案夾建立

可以使用mkdir()mkdirs()方法建立一個新目錄。僅當路徑名中指定的父目錄已存在時,mkdir()方法才建立目錄。

File newDir  = new File("C:\\users\\home");

只有當C:\users目錄已經存在時,newDir.mkdir()方法才會建立home目錄。newDir.mkdirs()方法將建立users目錄(如果它不存在於C:驅動器中),它將在C:\ users目錄下建立home目錄,也就是說不管C:\\users目錄存在不存在,都會直接建立home目錄。

檔案刪除

要使用File類的delete()方法來刪除檔案/目錄。目錄必須為空時才能刪除它。如果檔案/目錄被刪除,該方法返回true; 否則返回false。還可以延遲刪除檔案,直到JVM通過使用deleteOnExit()方法終止。
如果在程式中建立臨時檔案,比如在程式退出時刪除這些臨時檔案,這是非常有用的。立即刪除dummy.txt檔案,如下程式碼 -

File dummyFile = new File("dummy.txt"); 
dummyFile.delete();

在JVM終止時刪除dummy.txt檔案

File dummyFile = new File("dummy.txt"); 
dummyFile.deleteOnExit();

檔案重新命名

要重新命名檔案,可以使用renameTo()方法,它使用一個File物件來表示新檔案:

boolean fileRenamed = oldFile.renameTo(newFile);

完整的原始碼範例 -

import java.io.File;

public class Main {
  public static void main(String[] argv) {
    // Rename old-dummy.txt to new_dummy.txt
    File oldFile = new File("old_dummy.txt");
    File newFile = new File("new_dummy.txt");

    boolean fileRenamed = oldFile.renameTo(newFile);
    if (fileRenamed) {
      System.out.println(oldFile + "  renamed  to " + newFile);
    } else {
      System.out.println("Renaming " + oldFile + "  to " + newFile
          + "  failed.");
    }

  }
}

如果檔案的重新命名成功,renameTo()方法返回true; 否則返回false。需要檢查返回值,以確保重新命名成功。
上面的程式碼生成以下結果。

Renaming old_dummy.txt  to new_dummy.txt  failed.

範例

File物件是不可變的。 建立後它始終表示相同的路徑名。當重新命名檔案時,舊的File物件仍然代表原始的路徑名。
File物件表示路徑名,而不是檔案系統中的實際檔案。以下程式碼顯示了如何進行檔案建立,刪除和重新命名。

import java.io.File;

public class Main {
  public static void main(String[] args) throws Exception {
    File newFile = new File("my_new_file.txt");
    printFileDetails(newFile);

    // Create a new file
    boolean fileCreated = newFile.createNewFile();
    if (!fileCreated) {
      System.out.println(newFile + "  could   not  be  created.");
    }
    printFileDetails(newFile);

    // Delete the new file
    newFile.delete();

    System.out.println("After deleting the new file:");
    printFileDetails(newFile);

    // recreate the file
    newFile.createNewFile();

    printFileDetails(newFile);

    // Let's tell the JVM to delete this file on exit
    newFile.deleteOnExit();

    System.out.println("After  using deleteOnExit() method:");
    printFileDetails(newFile);

    // Create a new file and rename it
    File firstFile = new File("my_first_file.txt");
    File secondFile = new File("my_second_file.txt");

    fileCreated = firstFile.createNewFile();
    if (fileCreated || firstFile.exists()) {
      printFileDetails(firstFile);
      printFileDetails(secondFile);

      boolean renamedFlag = firstFile.renameTo(secondFile);
      if (!renamedFlag) {
        System.out.println("Could not  rename  " + firstFile);
      }
      printFileDetails(firstFile);
      printFileDetails(secondFile);
    }
  }
  public static void printFileDetails(File f) {
    System.out.println("Absolute Path: " + f.getAbsoluteFile());
    System.out.println("File exists:  " + f.exists());
  }
}

上面的程式碼生成以下結果。

Absolute Path: F:\website\yiibai\worksp\my_new_file.txt
File exists:  false
Absolute Path: F:\website\yiibai\worksp\my_new_file.txt
File exists:  true
After deleting the new file:
Absolute Path: F:\website\yiibai\worksp\my_new_file.txt
File exists:  false
Absolute Path: F:\website\yiibai\worksp\my_new_file.txt
File exists:  true
After  using deleteOnExit() method:
Absolute Path: F:\website\yiibai\worksp\my_new_file.txt
File exists:  true
Absolute Path: F:\website\yiibai\worksp\my_first_file.txt
File exists:  true
Absolute Path: F:\website\yiibai\worksp\my_second_file.txt
File exists:  false
Absolute Path: F:\website\yiibai\worksp\my_first_file.txt
File exists:  false
Absolute Path: F:\website\yiibai\worksp\my_second_file.txt
File exists:  true

檔案屬性

File類包含可獲取/設定檔案和目錄的屬性的方法。可以分別使用setReadOnly()setReadable()setWritable()setExecutable()方法將檔案設定為唯讀,可讀,可寫和可執行。
也可以使用lastModified()setLastModified()方法來獲取和設定檔案的最後修改日期和時間。使用isHidden()方法檢查檔案是否被隱藏。

檔案大小

可以使用File類的length()方法獲取檔案的大小(以位元組為單位)。如下程式碼 -

File myFile  = new File("myfile.txt");
long  fileLength = myFile.length();

如果File物件表示不存在的檔案,則length()方法返回零。length()方法的返回型別是long,而不是int

列出檔案和目錄

可以使用File類的listRoots()靜態方法獲取檔案系統中可用根目錄的列表。它返回一個File物件陣列。

File[] roots = File.listRoots();

以下程式碼顯示如何列出所有可用的根目錄。

import java.io.File;

public class Main {
  public static void main(String[] args) {
    File[] roots = File.listRoots();
    System.out.println("List  of  root directories:");
    for (File f : roots) {
      System.out.println(f.getPath());
    }
  }
}

可以使用File類的list()listFiles()方法列出目錄中的所有檔案和目錄。list()方法返回一個String陣列,而listFiles()方法返回一個File陣列。

還可以使用這些方法作為檔案過濾器從返回的結果中排除一些檔案和目錄。以下程式碼顯示如何列出目錄中的所有檔案和目錄。

import java.io.File;

public class Main {
    public static void main(String[] args) {
        // Change the dirPath value to list files from your directory
        String dirPath = "C:\\";

        File dir = new File(dirPath);
        File[] list = dir.listFiles();

        for (File f : list) {
            if (f.isFile()) {
                System.out.println(f.getPath() + "  (File)");
            } else if (f.isDirectory()) {
                System.out.println(f.getPath() + "  (Directory)");
            }
        }
    }
}

上面的程式碼生成以下結果。

C:\$GetCurrent  (Directory)
C:\$RECYCLE.BIN  (Directory)
C:\.rnd  (File)
C:\AVScanner.ini  (File)
C:\Boot  (Directory)
C:\bootmgr  (File)
C:\BOOTNXT  (File)
C:\BOOTSECT.BAK  (File)
C:\Documents and Settings  (Directory)
C:\drivers  (Directory)
C:\file-for-download.txt  (File)
C:\grldr  (File)
C:\grldr.bak  (File)
C:\HaxLogs.txt  (File)
C:\inetpub  (Directory)
C:\Intel  (Directory)
C:\LibAntiPrtSc_ERROR.log  (File)
C:\LibAntiPrtSc_INFORMATION.log  (File)
C:\mydata  (Directory)
C:\OKDOS  (Directory)
C:\okldr  (File)
C:\okldr.mbr  (File)
C:\oraclebackup  (Directory)
C:\PerfLogs  (Directory)
C:\Program Files  (Directory)
C:\Program Files (x86)  (Directory)
C:\ProgramData  (Directory)
C:\Python27  (Directory)
C:\Python34  (Directory)
C:\Recovery  (Directory)
C:\report.rpt  (File)
C:\setup.log  (File)
C:\setupinfidb.db  (File)
C:\swapfile.sys  (File)
C:\System Volume Information  (Directory)
C:\TEMP  (Directory)
C:\Tencent  (Directory)
C:\Users  (Directory)
C:\Windows  (Directory)
C:\Windows10Upgrade  (Directory)

檔案過濾器

要從列表中排除擴充套件名為.SYS的所有檔案,可以使用由FileFilter介面的範例表示的檔案過濾器來實現。
它包含一個accept()方法,它將File作為引數列出,如果有檔案列出則返回true。 返回false不會列出檔案。

以下程式碼建立一個檔案過濾器,將過濾擴充套件名為.SYS的檔案。

FileFilter filter = file ->  {
    if (file.isFile()) {
        String fileName   = file.getName().toLowerCase();
        if (fileName.endsWith(".sys"))  {
            return false;
        }
    }
    return true;
};

以下程式碼建立兩個檔案過濾器 - 一個僅過濾檔案,另一個僅過濾目錄:

// Filters only  files
FileFilter fileOnlyFilter = File::isFile;

// Filters only  directories
FileFilter  dirOnlyFilter = File::isDirectory;

以下程式碼顯示如何使用FileFilter過濾檔案。

import java.io.File;
import java.io.FileFilter;

public class Main {
    public static void main(String[] args) {
        String dirPath = "C:\\";
        File dir = new File(dirPath);
        // Create a file filter to exclude any .SYS file
        FileFilter filter = file -> {
            if (file.isFile()) {
                String fileName = file.getName().toLowerCase();
                if (fileName.endsWith(".sys")) {
                    return false;
                }
            }
            return true;
        };
        File[] list = dir.listFiles(filter);
        for (File f : list) {
            if (f.isFile()) {
                System.out.println(f.getPath() + "  (File)");
            } else if (f.isDirectory()) {
                System.out.println(f.getPath() + "  (Directory)");
            }
        }
    }
}

上面的程式碼生成以下結果。

C:\$GetCurrent  (Directory)
C:\$RECYCLE.BIN  (Directory)
C:\.rnd  (File)
C:\AVScanner.ini  (File)
C:\Boot  (Directory)
C:\bootmgr  (File)
C:\BOOTNXT  (File)
C:\BOOTSECT.BAK  (File)
C:\Documents and Settings  (Directory)
C:\drivers  (Directory)
C:\file-for-download.txt  (File)
C:\grldr  (File)
C:\grldr.bak  (File)
C:\HaxLogs.txt  (File)
C:\inetpub  (Directory)
C:\Intel  (Directory)
C:\LibAntiPrtSc_ERROR.log  (File)
C:\LibAntiPrtSc_INFORMATION.log  (File)
C:\mydata  (Directory)
C:\OKDOS  (Directory)
C:\okldr  (File)
C:\okldr.mbr  (File)
C:\oraclebackup  (Directory)
C:\PerfLogs  (Directory)
C:\Program Files  (Directory)
C:\Program Files (x86)  (Directory)
C:\ProgramData  (Directory)
C:\Python27  (Directory)
C:\Python3  (Directory)
C:\Python34  (Directory)
C:\Recovery  (Directory)
C:\report.rpt  (File)
C:\SecurityScanner.dll  (File)
C:\setup.log  (File)
C:\setupinfidb.db  (File)
C:\System Volume Information  (Directory)
C:\TEMP  (Directory)
C:\Tencent  (Directory)
C:\Users  (Directory)
C:\Windows  (Directory)
C:\Windows10Upgrade  (Directory)