在Java中更改当前工作目录?

问题

如何在Java程序中更改当前工作目录?我能找到的关于这个问题的一切声称你根本做不到,但我无法相信那是真的。

我有一段代码,它使用来自通常启动的目录的硬编码相对文件路径打开文件,我只是希望能够在不同的Java程序中使用该代码,而无需从内部启动它一个特定的目录。看起来你应该只能调用System.setProperty( "user.dir", "/path/to/dir" ),但据我所知,调用该行只是默默地失败并且什么都不做。

我会理解,如果Java不允许你这样做,如果不是因为它允许你访问当前的工作目录,甚至允许你使用相对文件路径打开文件....


#1 热门回答(133 赞)

在纯Java中没有可靠的方法来做到这一点。通过System.setProperty()java -Duser.dir=...设置user.dir属性似乎会影响Files的后续创建,但不会影响例如.FileOutputStreams

如果你与文件路径分开构建目录路径,则File(String parent, String child)构造函数可以提供帮助,从而可以更轻松地进行交换。

另一种方法是设置脚本以从其他目录运行Java,或使用下面建议的JNI本机代码。

The relevant Sun bug于2008年关闭,因为"将无法修复"。


#2 热门回答(35 赞)

如果你使用ProcessBuilder运行旧程序,则可以指定其工作directory


#3 热门回答(29 赞)

Therea使用系统属性"user.dir"执行此操作的方法。要理解的关键部分是必须调用getAbsoluteFile()(如下所示),否则将针对默认的"user.dir"值解析相对路径。

import java.io.*;

public class FileUtils
{
    public static boolean setCurrentDirectory(String directory_name)
    {
        boolean result = false;  // Boolean indicating whether directory was set
        File    directory;       // Desired current working directory

        directory = new File(directory_name).getAbsoluteFile();
        if (directory.exists() || directory.mkdirs())
        {
            result = (System.setProperty("user.dir", directory.getAbsolutePath()) != null);
        }

        return result;
    }

    public static PrintWriter openOutputFile(String file_name)
    {
        PrintWriter output = null;  // File to open for writing

        try
        {
            output = new PrintWriter(new File(file_name).getAbsoluteFile());
        }
        catch (Exception exception) {}

        return output;
    }

    public static void main(String[] args) throws Exception
    {
        FileUtils.openOutputFile("DefaultDirectoryFile.txt");
        FileUtils.setCurrentDirectory("NewCurrentDirectory");
        FileUtils.openOutputFile("CurrentDirectoryFile.txt");
    }
}