更改“user.dir”-Property后,相对路径的File.createNewFile()使用错误的目录

时间:2011-02-17 14:21:24

标签: java path relative createfile system-properties

这是我第一次在这个伟大的页面上提问,所以如果我犯错误,请耐心等待。 我想要做的是在我更改之后在我的用户目录中创建一个具有相对路径的新文件。要更改我使用System.setProperty("user.dir", "/data");的用户目录,然后我用File f2 = new File("f2");创建了一个文件对象,并使用f2.createNewFile();在我的文件系统上创建了空文件。在此之后,我希望文件出现在/ data / f2中,这就是f2.getAbsolutePath()告诉我的内容。但是,令人困惑的是,该文件出现在“旧的,初始的”userDir。

这是我的测试:

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

public class Main {

    private static FilenameFilter filter = new FilenameFilter() {

        public boolean accept(File dir, String name) {
            return (name.startsWith("f")) ? true : false;
        }
    };

    public static void main(String[] args) throws IOException {
        String userDirPropertyName = "user.dir";
        File initialUserDir = new File(System.getProperty(userDirPropertyName));

        System.out.println("files in " + initialUserDir.getAbsolutePath() + ":");
        for (File file : initialUserDir.listFiles(filter)) {
            System.out.println("  - " + file.getAbsoluteFile());
        }

        System.out.println("initial userDir = " + System.getProperty(userDirPropertyName));
        File f1 = new File("f1");
        f1.createNewFile();
        System.out.println("f1.getAbsolutePath() = " + f1.getAbsolutePath());
        System.out.println("getCanonicalPath() for . = " + new File(".").getCanonicalPath());


        System.setProperty(userDirPropertyName, "/data");

        System.out.println("changed userDir = " + System.getProperty(userDirPropertyName));
        File f2 = new File("f2");
        f2.createNewFile();
        System.out.println("f2.getAbsolutePath() = " + f2.getAbsolutePath());
        System.out.println("getCanonicalPath() for . = " + new File(".").getCanonicalPath());


        System.out.println("files in " + initialUserDir.getAbsolutePath() + ":");
        for (File file : initialUserDir.listFiles(filter)) {
            System.out.println("  - " + file.getAbsoluteFile());
        }
    }
}

这是输出,我得到:

/ home / pps / NetBeansProjects / UserDirTest中的

文件:
initial userDir = / home / pps / NetBeansProjects / UserDirTest
f1.getAbsolutePath()= / home / pps / NetBeansProjects / UserDirTest / f1
getCanonicalPath()for。 = / home / pps / NetBeansProjects / UserDirTest
更改了userDir = / data
f2.getAbsolutePath()= / data / f2
getCanonicalPath()for。 = /数据
/ home / pps / NetBeansProjects / UserDirTest中的文件:
   - / home / pps / NetBeansProjects / UserDirTest / f1
   - / home / pps / NetBeansProjects / UserDirTest / f2

f1和f2出现在同一目录中虽然我更改了之间的user.dir!?!
任何人都可以帮我这个吗? 非常感谢

3 个答案:

答案 0 :(得分:1)

我刚刚复制了你的场景。我认为您的错误是您正在尝试使用系统属性来更改当前的工作目录。能够从系统属性中检索此目录只是一种方便的方法。如果更改属性,则不会更改目录本身。

解决方案是使用File.mkdir()File.mkdirs()创建您想要的目录,然后使用new File(myDir, fileName),其中myDir是您的新目录。

答案 1 :(得分:1)

属性user.dir的设置为not supported,并导致all kinds of strange effects

答案 2 :(得分:0)

无法在Java中更改当前目录。

更改系统属性时,将更改属性,但不会更改本机代码用于创建文件的实际工作目录。但是,getAbsolutePath使用user.dir系统目录的当前值来组成绝对路径。