2013-12-11 32 views
2

我無法想到方法java.io.File.exists()或Java 7 java.nio.file.Files.exists(Path)中的等效方法的實際用例。看起來在所有情況下(或canRead(),canWrite()等)都會優選isFile()isDirectory()Java File.exists()與File.isFile()

例如,在How do I check if a file exists in Java?中,接受的答案看起來很愚蠢,因爲第二個答案指出。

任何人都可以舉一個例子,知道事物是否存在,沒有知道事物是文件還是目錄?

編輯:我明白File.exists()做什麼。我的問題是,將功能永遠幫助某人?我正在尋找一個例子,「__ _ _ _ _時使用File.exists(),因爲在這種情況下File.isFile()File.isDirectory()都不會添加任何值。」

回答

4

接聽改爲@ jaco0646的最後一個問題:

使用File.exists()特殊文件喜歡命名管道,插座或設備文件的時候。

這些都不是普通的文件,也沒有目錄,也沒有符號鏈接這樣既File.isFile()File.isDirectory()將返回falseFile.exists()將返回true。例如/dev/null(在Unix兼容的操作系統上)是一個設備文件。

理論上可能是處理大量文件時可見的性能差異。這也取決於文件系統,JVM實現細節,OS等。

例如,在Android File.exists()中使用access()系統調用來實現,而File.isFile()/File.isDirectory()使用stat()。在這種情況下,處理stat()輸出需要比access()更多的用戶空間邏輯。

+0

奇怪的是,在文檔中提到設備或管道的唯一方法是['length'](http://docs.oracle.com/javase/8/docs/api/java/io/File.html#length - )。 – jaco0646

1

我能想到的唯一用例是鎖文件或類似的文件。文件是普通文件還是目錄的時間並不重要,僅僅存在具有該名稱的內容足以觸發程序行爲。

也可能檢查緩存是否存在。緩存可以由不同的提供者實現,其中一些使用目錄結構,其中一些使用zip文件(順便說一句,我正在做這件事 - 我不是說這是一個好的想法)。

1

那麼能夠在參數中設置LinkOptions是個方便。此調用的實際API是

static java.nio.file.Files.exists(Path path, LinkOption... options) 

您可能不想遵循指定的文件路徑中的符號鏈接。在這種情況下,調用Files.exists(路徑) - 使用鏈接選項NOFOLLOW_LINKS,然後設置。

當你不想在你的空間創建比你需要的更多的對象(比如瞬態文件對象)時,最好還是有靜態方法。