[英]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使用圍繞Files
, Paths
和Path
NIO完成。 該API更加簡潔直觀。 它也可以在當前示例中按預期工作:
Files.isDirectory(Paths.get("")); // true
請查看文檔以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.