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

时间:2018-06-12 09:16:57

标签: java file file-io

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

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

4 个答案:

答案 0 :(得分:2)

使用空字符串创建文件会导致创建实际上不存在的文件实例,其绝对路径名为“空抽象路径名”。

- > 这就是为什么第二个既不是文件也不是目录

背后的原因,对你来说可能有点令人困惑的输出,定义在javadocs中:

  

如果这个抽象路径名是空的抽象路径名,那么   当前用户目录的路径名字符串,由   系统属性user.dir,返回。

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

答案 1 :(得分:1)

new File("")创建具有相对(空)路径的新文件。由于此文件不存在,因此isDirectory()和isFile()都返回false(对应于javadoc)。

来自javadoc

  

boolean java.io.File.isDirectory()

     

...

     

返回:当且仅当,返回true   此抽象路径名表示的文件存在且是一个目录;   否则是假的

isFile()也是如此。只要你的文件不存在,两种方法都会返回false。

答案 2 :(得分:1)

您需要区分Java对象文件和计算机上实际存在的文件。

在第一种情况下:new File(System.getProperty("user.dir"))。您创建一个Java对象文件并给他一个路径:System.getProperty("user.dir")。稍后当您调用函数.getAbsolutePath()时,它会返回您给出的路径。然后,当您调用.isDirectory()时,它会告诉您为true,因为有一个与此Java对象文件对应的目录。

在第二种情况下,new File("")它创建一个Java对象文件,并为其指定路径:""。由于给定的路径不是绝对路径,系统会将其解析为user.dir路径中的相对路径。

来自documentation

  

路径名,无论是抽象的还是字符串形式,可以是绝对路径名也可以是相对路径名。绝对路径名是完整的,因为不需要其他信息来定位它表示的文件。相反,相对路径名必须根据从其他路径名获取的信息来解释。默认情况下,java.io包中的类始终解析当前用户目录的相对路径名。此目录由系统属性user.dir命名,通常是调用Java虚拟机的目录。

稍后当您调用函数.getAbsolutePath()时,它会返回您给出的路径,因此用户dir的路径为+空字符串:D:\Java Workspace\iTAW_Workspace\JavaTest\<empty>。然后,当您调用.isDirectory()时,它会告诉您错误,因为没有与此路径对应的目录。 (isFile()

的原因相同

答案 3 :(得分:1)

说明

它可能看起来有点非直观,但实际上,根据documentation,该类应该如何工作。它在文档中称为空抽象路径名

  

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

来自您的构造函数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()方法时您没有看到这一点,因为没有空名称的表示。

NIO

请注意,课程File及其相关内容过时。现在,文件IO是使用围绕FilesPathsPath的NIO完成的。此API更清晰,更直观。它也将按照您当前示例的预期工作:

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

请查看documentation了解更多内容。