为什么Java文件只以其规范形式存在?

Nic*_*aro 9 java

我正面临JVM的奇怪行为.我想更改用户目录,即查找文件的目录,通常对应于java运行命令的路径.

所以我写了下面的代码:

System.setProperty("user.dir", "/tmp/");
File f = new File("myfile");
System.out.println(f.exists());
System.out.println(f.getCanonicalFile().exists());
Run Code Online (Sandbox Code Playgroud)

该文件/tmp/myfile存在并且可由JVM读取,但如果我在运行该代码时不在/tmp/,则结果为:

false
true

它们是相同的文件,Java能够检索它的正确规范形式,但相对的不存在,而规范的存在.

这是一个错误吗?有没有办法可靠地更改JVM用户目录?

更改代码不是一个选项,因为我正在尝试运行外部库.

Ger*_*cke 5

这种行为很正常,原因是,两者之间存在差异

File f = new File("myfile");
Run Code Online (Sandbox Code Playgroud)

File cf = new File("myfile").getCanonicalFile();
Run Code Online (Sandbox Code Playgroud)

第一个表示相对于当前WORKING DIR的文件路径,它可能是您的项目路径.使用相对路径,user.dir即使设置user.dir为JVM参数,也不会使用该属性-Duser.dir=/tmp/.原生文件实体的Java文件句柄的解析由底层文件系统实现本机完成.

但是getCanoncialFile()在解析本机文件句柄之前调用时,使用用户路径信息解析相对路径 - 在您的情况下user.dir = /tmp/.

显然,没有文件myfile,<WORKING_DIR>但在/tmp/.

行为是相同的f.getAbsoluteFile().