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)