以下两种创建文件的方法有什么区别?
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)
这可能看起来有点不直观,但实际上这就是该类根据其文档应该如何工作的。在文档中它被称为空抽象路径名:
空抽象路径名没有前缀和空名称序列。
从你的构造函数中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)
查看文档了解更多信息。