Java中檢查文件是否為空
1. 概述
我們經常遇到需要在 Java 應用程序中處理文件的場景。有時,我們想在進行進一步操作之前確定文件是否為空。
在本教程中,我們將探索一些有效且簡單的方法來檢查 Java 中的文件是否為空。
2.問題介紹
在我們深入實現之前,讓我們先了解一下文件為空意味著什麼。
在文件操作的上下文中,空文件是指不包含數據或大小為零字節的文件。
在處理輸入或輸出操作(例如讀取或解析文件)時,驗證文件是否為空特別有用。
Java 標準庫提供了獲取文件大小的方法。然而,我們需要注意一些陷阱。
為簡單起見,我們將使用單元測試斷言來驗證我們的方法是否按預期工作。此外,JUnit 5 的 TempDirectory 擴展允許我們輕鬆地在單元測試中創建和清理臨時目錄。由於我們的測試與文件相關,因此我們將使用此擴展來支持我們的驗證。
3.使用File.length()
方法
我們知道,我們可以通過檢查文件的大小來確定文件是否為空。 Java 標準 IO 庫提供了**File.length()
方法來計算文件的大小(以字節為單位)** 。
因此,我們可以通過檢查File.length()
是否返回0
來解決我們的問題:
@Test
void whenTheFileIsEmpty_thenFileLengthIsZero(@TempDir Path tempDir) throws IOException {
File emptyFile = tempDir.resolve("an-empty-file.txt")
.toFile();
emptyFile.createNewFile();
assertTrue(emptyFile.exists());
assertEquals(0, emptyFile.length());
}
調用File.length()
來檢查文件是否為空很方便。但有一個陷阱。讓我們通過另一個測試來理解它:
@Test
void whenFileDoesNotExist_thenFileLengthIsZero(@TempDir Path tempDir) {
File aNewFile = tempDir.resolve("a-new-file.txt")
.toFile();
assertFalse(aNewFile.exists());
assertEquals(0, aNewFile.length());
}
在上面的測試中,我們照常初始化了一個File
對象。但是,我們沒有創建該文件。換句話說,文件tempDir/a-new-file.txt
不存在。
因此測試表明,當我們對不存在的文件調用File.length()
時,它也會返回0
。通常,當我們談論一個空文件時,該文件必須存在。因此,僅通過File.length()
單獨應用空檢查是不可靠的。
接下來,讓我們創建一個方法來解決該問題:
boolean isFileEmpty(File file) {
if (!file.exists()) {
throw new IllegalArgumentException("Cannot check the file length. The file is not found: " + file.getAbsolutePath());
}
return file.length() == 0;
}
在上面的方法中,如果文件不存在,我們將引發IllegalArgumentException
。有些人可能認為FileNotFoundException
是更合適的一種。在這裡,我們沒有選擇FileNotFoundException
,因為它是一個受檢查的異常。如果我們在調用isFileEmpty()
方法時拋出此異常,則必須處理該異常。另一方面, IllegalArgumentException
是一個未經檢查的異常,表示file
參數無效。
現在,無論文件是否存在, isFileEmpty()
方法都會執行此操作:
@Test
void whenTheFileDoesNotExist_thenIsFilesEmptyThrowsException(@TempDir Path tempDir) {
File aNewFile = tempDir.resolve("a-new-file.txt")
.toFile();
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> isFileEmpty(aNewFile));
assertEquals(ex.getMessage(), "Cannot check the file length. The file is not found: " + aNewFile.getAbsolutePath());
}
@Test
void whenTheFileIsEmpty_thenIsFilesEmptyReturnsTrue(@TempDir Path tempDir) throws IOException {
File emptyFile = tempDir.resolve("an-empty-file.txt")
.toFile();
emptyFile.createNewFile();
assertTrue(isFileEmpty(emptyFile));
}
4.使用java.nio.file.Files.size()
方法
我們已經使用File.length().
File.length()
來自標準 Java IO。或者,如果我們使用 Java 版本 7 或更高版本,我們可以使用 Java NIO API 解決問題。例如, java.nio.file.Files.size()
返回文件的大小,這也可以幫助我們檢查文件是否為空。
值得一提的是,如果文件不存在,Java NIO 的Files.size()
會拋出NoSuchFileException
:
@Test
void whenTheFileIsEmpty_thenFilesSizeReturnsTrue(@TempDir Path tempDir) throws IOException {
Path emptyFilePath = tempDir.resolve("an-empty-file.txt");
Files.createFile(emptyFilePath);
assertEquals(0, Files.size(emptyFilePath));
}
@Test
void whenTheFileDoesNotExist_thenFilesSizeThrowsException(@TempDir Path tempDir) {
Path aNewFilePath = tempDir.resolve("a-new-file.txt");
assertThrows(NoSuchFileException.class, () -> Files.size(aNewFilePath));
}
5. 結論
在本文中,我們探索了兩種在 Java 中檢查文件是否為空的方法:
- 使用 Java 標準 IO 中的
File.length()
- 使用 Java NIO 中的
Files.size()
與往常一樣,本文中提供的所有代碼片段都可以在 GitHub 上找到。