[讨论] 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邮件列表去问问。 |