以下两种创建文件的方法有什么区别?
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
答案 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路径中的相对路径。
路径名,无论是抽象的还是字符串形式,可以是绝对路径名也可以是相对路径名。绝对路径名是完整的,因为不需要其他信息来定位它表示的文件。相反,相对路径名必须根据从其他路径名获取的信息来解释。默认情况下,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()
方法时您没有看到这一点,因为没有空名称的表示。
请注意,课程File
及其相关内容过时。现在,文件IO是使用围绕Files
,Paths
和Path
的NIO完成的。此API更清晰,更直观。它也将按照您当前示例的预期工作:
Files.isDirectory(Paths.get("")); // true
请查看documentation了解更多内容。