File(".").getAbsolutePath() 是如何解决的?
How is File(".").getAbsolutePath() resolved under the hood?
我在想:
在 Java 中请求当前文件的绝对路径后会发生什么?
String s = File(".").getAbsolutePath();
解释器如何在文件系统中找到当前文件的路径?有一些 OS 系统调用吗?
它 return 是 jar 的路径吗?或者有时它可以 return 编译前文件所在的路径?
每个进程都有一个“当前目录”。
在进程中,路径 .
指的是当前目录。
当前目录表示的实际路径是(可以是)创建进程的系统调用的参数(例如参见ProcessBuilder
),或者它可以从创建您的进程的进程继承过程。
当前目录是进程的属性,与jar文件所在位置完全无关。两条路径可能巧合。
不要求 .
路径指向可写位置,或者实际上是文件系统中的任何位置。甚至可能没有文件系统。也就是说,路径 .
根本不需要存在。
-
- 对于
.
和 ..
有当前工作目录 System.getProperty("user.dir")
,在执行时可能不同,如 IDE 和 stand-alone。 .
与罐子的位置无关,
但是 java
是在哪个目录中启动的。
所以路径“a/./b/../c”将变为“a/c”。由于存在 ...
的磁盘操作系统,因此可能会进行本机调用。另外 Windows 可能想用 \
.
替换 POSIX /
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
。如果您想检测路径是否意外地转义了某些受限目录,此调用很重要。
我在想:
在 Java 中请求当前文件的绝对路径后会发生什么?
String s = File(".").getAbsolutePath();
解释器如何在文件系统中找到当前文件的路径?有一些 OS 系统调用吗?
它 return 是 jar 的路径吗?或者有时它可以 return 编译前文件所在的路径?
每个进程都有一个“当前目录”。
在进程中,路径 .
指的是当前目录。
当前目录表示的实际路径是(可以是)创建进程的系统调用的参数(例如参见ProcessBuilder
),或者它可以从创建您的进程的进程继承过程。
当前目录是进程的属性,与jar文件所在位置完全无关。两条路径可能巧合。
不要求 .
路径指向可写位置,或者实际上是文件系统中的任何位置。甚至可能没有文件系统。也就是说,路径 .
根本不需要存在。
-
- 对于
.
和..
有当前工作目录System.getProperty("user.dir")
,在执行时可能不同,如 IDE 和 stand-alone。.
与罐子的位置无关, 但是java
是在哪个目录中启动的。
所以路径“a/./b/../c”将变为“a/c”。由于存在
替换 POSIX...
的磁盘操作系统,因此可能会进行本机调用。另外 Windows 可能想用\
./
- 对于
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
。如果您想检测路径是否意外地转义了某些受限目录,此调用很重要。