没啥分,不好意思。
但是问题貌似比较棘手,请求高手支援。
问题是这样
 从A目录启动B目录下的boot.jar,然后指定VM参数-Duser.dir=B,这样,System.getProperty("user.dir")获得的值就是B了。
然后这个时候创建一个文件对象,File f = new File("file1.txt"); 然後
//获得绝对路径
String path = f.getCanonicalPath();
path的值是B\file1.txt.
问题来了
如果现在创建这个文件会在哪呢?f.createNewFile();调用之后,B下面没有找到file1.txt
反而是在A下面找到了file1.txt
也就是说,文件的绝对路径和真实指向不一致,如果我要从A目录启动了B目录的jar,如果jar访问了自己所在目录的文件,这个时候是用相对路劲是访问不到的。
即便是加上了-Duser.dir=B。加了VM参数后,File对象的绝对路径是正确了,但是真实指向却是A目录的文件。有没高手可以指点一二,如何解决这个问题,让File的绝对路径和真实指向一致。万分感谢。

解决方案 »

  1.   

    我试了一下,确实有这个问题。
    我觉得有可能是jre的bug,因为file.getAbsolutePath()与file.createNewFile()是对不上的。很矛盾。
      

  2.   

    user.dir 是 Java 的系统参数,没事别乱改!user.dir 是启动 JVM 的路径,在哪里启动的哪里就是 user.dir
      

  3.   


    当然是有需求才改嘛~你说的是默认路径。
    既然java提供了修改系统属性的方法,想必这些可以修改的参数也是为了满足开发者的需求的。
      

  4.   

    嗯嗯,发现存在这个问题后我做了反复的测试,这个问题是可以避免,避免的方法是File f = new File(System.getProperty("user.dir"),"file1.txt");
    虽然这样构造的文件的绝对路径和code=Java]File f = new File("file1.txt");[/code]是一样的,但是效果不一样,前面的方法还是可以在正确的位置创建正确的文件的。
    但是总觉得这个不是解决问题的办法
      

  5.   

    补充一下,就是这个问题还会使得Class.getResource()和ClassLoader.getResource()方法获取不到正确位置的资源.
      

  6.   


    我说了让你别乱改嘛。可用的名字可以自己定义一个,干嘛非得跟系统属性一样?修改了系统属性可能会引起一些其他的问题。而且这样的修改并不能保证在所有的 JRE 中都能运行正常,系统特有属性的修改是需要有权限的,Java 中有安全策略可以限制对系统属性进行修改的。
      

  7.   


    如果不修改能解决问题我当然不会去修改,这个属性本来就是 用来让开发者修改的,为什么不修改呢,就像-Djava.ext.dir一样~这些都是给开发者使用的。本人不敢断言-Duser.dir的问题起因,但是感觉这个应该是一个bug,因为文件的路径已经和实际指向不一致了。
    如果您说的解决办法是避免的话,那这个问题的问得就毫无意义了的。
      

  8.   

    赞成楼主的意见,既然是可以set的,说明设计者的初衷是想让它可变的。
      

  9.   

    楼主,用这个吧!URI uri = MapTest.class.getProtectionDomain().getCodeSource().getLocation().toURI();
    System.out.println(uri);
      

  10.   


    我明白您的意思,其实您的意思是想让我把资源的访问都换成URL的形式吧。其实URL的形式的确是可以访问到资源,就如同我在4楼说的差不多了File f = new File(System.getProperty("user.dir"),"file1.txt");
    避免的办法还是有的,但是这样就感觉没能正常的去使用API了。虽然避免也是一个决绝办法,但是这个留到最后才使用的办法。呵呵
    还是要感谢您~~:P其实我是想寻求一个完美的解决办法,就是能在不改动正常情况下用的文件访问,能够解决问题,既:
    File f = new File("file1.txt");不用写成
    File f = new File(System.getProperty("user.dir"),"file1.txt");,就不知道有没这样的方法存在。