空文件构造函数既不是文件也不是目录

Ama*_*mal 5 java file-io file

以下两种创建文件的方法有什么区别?

new File(System.getProperty("user.dir"));
new File("");
Run Code Online (Sandbox Code Playgroud)

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());       
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

Zab*_*uza 2

解释

这可能看起来有点不直观,但实际上这就是该类根据其文档应该如何工作的。在文档中它被称为空抽象路径名:

空抽象路径名没有前缀和空名称序列

从你的构造函数中File#File(String)

通过将给定路径名字符串转换为抽象路径名来创建新的 File 实例。如果给定字符串是空字符串,则结果是空抽象路径名

所以该类File实际上将空名称解释为实际名称。当您测试时File#isDirectory()File#isFile()它会检查是否存在类似的文件或目录

D:\Java Workspace\iTAW_Workspace\JavaTest\<empty>
Run Code Online (Sandbox Code Playgroud)

请注意,<empty>我写的内容表明它实际上在此处搜索名称为空的文件。显然这样的文件不可能存在,因此结果将始终是false. 再说一次,它不检查

D:\Java Workspace\iTAW_Workspace\JavaTest\
Run Code Online (Sandbox Code Playgroud)

而是该目录中不存在的空文件。

不幸的是,您在使用该方法时看不到这一点File#toAbsolutePath(),因为没有空名称的表示。


蔚来

请注意,该类File以及与其相关的所有内容都已过时。如今,文件 IO 是使用 NIO 围绕Files,Paths和完成的Path。这个 API 更加干净和直观。它也将按照您当前示例的预期工作:

Files.isDirectory(Paths.get("")); // true
Run Code Online (Sandbox Code Playgroud)

查看文档了解更多信息。