簡體   English   中英

空文件構造函數既不是文件也不是目錄

[英]Empty File constructor is neither file nor directory

以下兩種創建文件的方法有什么區別?

new File(System.getProperty("user.dir"));
new File("");

Java將第一個標識為目錄,第二個既不是文件也不是目錄 為什么會這樣?


碼:

public class MainClass {
    public static void main(String[] args) throws Exception {       
        System.out.println("File Created with CurrentDir taken From System Props");
        File f1 = new File(System.getProperty("user.dir"));
        System.out.println("Absolute Path: " + f1.getAbsolutePath());
        System.out.println("isDirectory: " + f1.isDirectory());
        System.out.println("isFile: " + f1.isFile());

        System.out.println();

        System.out.println("File Created with Empty String Path");
        File f2 = new File("");
        System.out.println("Absolute Path: " + f2.getAbsolutePath());
        System.out.println("isdirectory: " + f2.isDirectory());
        System.out.println("isFile: " + f2.isFile());       
    }
}

輸出:

File Created with CurrentDir taken From System Props
Absolute Path: D:\Java Workspace\my_Workspace\JavaTest
isDirectory: true
isFile: false

File Created with Empty String Path
Absolute Path: D:\Java Workspace\my_Workspace\JavaTest
isdirectory: false
isFile: false

使用空字符串創建文件會導致創建一個實際上不存在的文件實例,並且其絕對路徑名是“空抽象路徑名”。

-> 這就是為什么第二個既不是文件又不是目錄的原因

其背后的原因(可能為您帶來一些混亂的輸出)是位於javadocs中的定義:

如果此抽象路徑名是空的抽象路徑名,則返回由系統屬性user.dir命名的當前用戶目錄的路徑名字符串。

您可以在這里找到有關此主題的更多信息https://docs.oracle.com/javase/6/docs/api/java/io/File.html

new File(“”)創建具有相對(空)路徑的新文件。 由於此文件不存在,因此isDirectory()和isFile()都返回false(對應於javadoc)。

從javadoc

布爾java.io.File.isDirectory()

...

返回:當且僅當此抽象路徑名表示的文件存在並且為目錄時,才返回true;否則,返回true。 否則為假

isFile()也是如此。 只要您的文件不存在,兩個方法都將返回false。

您需要區分Java對象File和計算機上實際存在的文件。

在第一種情況下: new File(System.getProperty("user.dir")) 您創建一個Java對象File並給他一個路徑: System.getProperty("user.dir") 稍后,當您調用函數.getAbsolutePath()它將返回給定的路徑。 然后,當您調用.isDirectory()它會告訴您true,因為存在與此Java對象File相對應的目錄。


在第二種情況下, new File("")會創建一個Java對象File,並為其提供路徑: "" 由於給定的路徑不是絕對路徑,因此系統會將其解析為來自user.dir路徑的相對路徑。

文檔

路徑名,無論是抽象路徑還是字符串形式,都可以是絕對路徑或相對路徑。 絕對路徑名是完整的,因為不需要其他信息即可找到它表示的文件。 相反,相對路徑名必須根據從其他路徑名獲取的信息來解釋。 默認情況下,java.io包中的類始終針對當前用戶目錄解析相對路徑名。 該目錄由系統屬性user.dir命名,通常是在其中調用Java虛擬機的目錄。

稍后,當調用函數.getAbsolutePath()它將返回給定的路徑,因此是用戶dir +空字符串的路徑: D:\\Java Workspace\\iTAW_Workspace\\JavaTest\\<empty> 然后,當您調用.isDirectory()它會告訴您false,因為沒有與此路徑相對應的目錄。 isFile()相同原因)

說明

看起來似乎有點不直觀,但是實際上這正是該類根據其文檔 應該如何工作的方式 在文檔中稱為空抽象路徑名

空的抽象路徑名沒有前綴和空的名稱序列

從您的構造函數File#File(String)

通過將給定的路徑名​​字符串轉換為抽象路徑名來創建新的File實例。 如果給定的字符串為空字符串,則結果為空的抽象路徑名

因此, File類實際上將空名稱解釋為實際名稱。 當您測試File#isDirectory()File#isFile()它將檢查是否存在文件或目錄,例如

D:\Java Workspace\iTAW_Workspace\JavaTest\<empty>

請注意我寫的<empty> ,它指示它實際上是在搜索空名稱的文件。 顯然,這樣的文件不存在,因此結果始終為false 同樣,它不會檢查

D:\Java Workspace\iTAW_Workspace\JavaTest\

而是此目錄中的空文件 ,該文件不存在。

不幸的是,在使用File#toAbsolutePath()方法時,您看不到此內容,因為沒有表示空名稱的表示形式。


蔚來

請注意,類File及其相關的所有內容都已過時 如今,文件IO使用圍繞FilesPathsPath NIO完成。 該API更加簡潔直觀。 它也可以在當前示例中按預期工作:

Files.isDirectory(Paths.get("")); // true

請查看文檔以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM