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)