问题
如何在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 赞)
There是a使用系统属性"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");
}
}