[讨论] java启动目录(user.dir)的问题

deyimsf 2013-02-01
IDE用的是Eclipse

package com.masf.tomcat;
public class TomcatTest {
	
	public static void main(String[] args){
		System.getProperties().list(System.out);
	}
}

输出值:
-- listing properties --
...
user.dir=D:\workspace\TomcatStudy
java.runtime.version=1.6.0_33-b03
...

目的是想通过动态指定user.dir的值,来加载不同目录的文件,如下代码:
public static void main(String[] args){
		System.setProperty("user.dir", "E:");
		File file = new File("aa.txt"); //在E盘的根目录下确实有这个文件
		
		System.out.println(file.getAbsolutePath());
		System.out.println(file.exists());
	}

输出值:
E:\aa.txt  //拼装的路径确实是程序中改动的值 [user.dir=E:]
false    

疑问:
  为什么System.setProperty("user.dir", "E:");的设置对file.exists()没起作用



chenk818 2013-02-01
在xp系统上测试的结果确实如此,file.exists()实际判断的还是最初的user.dir的路径,但这个接口的实现是跟系统相关的,得看FileSystem的具体实现,下周到公司看看openjdk的实现
但是这个现象感觉不太合理,呼唤R大解释一下
RednaxelaFX 2013-02-02
这种不是JVM问题诶最好换个合适的地方讨论。

嗯原因很简单:Oracle/Sun JDK 6、7(以及OpenJDK 6、7)在Windows上对文件系统的实现搓了。
File.getAbsolutePath()在Windows上最后的实现仍然在Java代码里,是这样的:
return getUserPath() + slashify(path); /* Completely relative */

这个getUserPath()是每次都会重新读"user.dir"系统属性的。

然则File.exists()在Windows上的实现在JDK的C代码里,这块代码会有current working directory做缓存,于是后面怎么改"user.dir"都不影响它了。

这种行为算不算bug我说不好…楼主有疑问的话可以上core-libs-dev邮件列表去问问。
Global site tag (gtag.js) - Google Analytics