File(".").getAbsolutePath() 是如何解决的?

How is File(".").getAbsolutePath() resolved under the hood?

我在想:

  1. 在 Java 中请求当前文件的绝对路径后会发生什么?

    String s = File(".").getAbsolutePath();
    
  2. 解释器如何在文件系统中找到当前文件的路径?有一些 OS 系统调用吗?

  3. 它 return 是 jar 的路径吗?或者有时它可以 return 编译前文件所在的路径?

每个进程都有一个“当前目录”。

在进程中,路径 . 指的是当前目录。

当前目录表示的实际路径是(可以是)创建进程的系统调用的参数(例如参见ProcessBuilder),或者它可以从创建您的进程的进程继承过程。

当前目录是进程的属性,与jar文件所在位置完全无关。两条路径可能巧合。

不要求 . 路径指向可写位置,或者实际上是文件系统中的任何位置。甚至可能没有文件系统。也就是说,路径 . 根本不需要存在。

    1. 对于 ... 有当前工作目录 System.getProperty("user.dir"),在执行时可能不同,如 IDE 和 stand-alone。 . 与罐子的位置无关, 但是 java 是在哪个目录中启动的。

    所以路径“a/./b/../c”将变为“a/c”。由于存在 ... 的磁盘操作系统,因此可能会进行本机调用。另外 Windows 可能想用 \.

    替换 POSIX /
  1. String to File 将始终在 运行 时完成。但是 应用程序启动的位置 ,当前工作目录或 . - 视情况而定,实际上有所不同。 永远不会在编译时,即使是 static File f = new File("./readme.txt"); 在第一次加载 class 时也会创建一个对象。

这里File是物理磁盘文件的class。

更通用的 class、Path 的优越之处在于它还可以在 zip 文件或任何提供文件系统视图的可行 URI 中包含其路径 运行 .

所以我会用Path做进一步的解释。有一个有价值的实用程序 class Files 具有路径操作,允许您将一些文件从 zip 存档中复制到硬盘上的某个位置。

Path.absoluteFile是获取绝对路径的Path版本(取决于文件系统视图)。

符号链接 需要用实际物理路径替换时,带有可选选项的

Path toRealPath​(LinkOption... options) 会执行磁盘操作本机调用(对于文件)。 /a/b.lnk/c 实际上可能是 /a/d/e/c。如果您想检测路径是否意外地转义了某些受限目录,此调用很重要。