Nic*_*ick 164 java working-directory
如何在Java程序中更改当前工作目录?我能找到的关于这个问题的一切声称你根本做不到,但我不相信那是真的.
我有一段代码,它使用来自通常启动的目录的硬编码相对文件路径打开文件,我只是希望能够在不同的Java程序中使用该代码,而无需从内部启动它一个特定的目录.看起来你应该只能调用System.setProperty( "user.dir", "/path/to/dir" ),但据我所知,调用该行只是默默地失败并且什么都不做.
我会理解,如果Java不允许你这样做,如果它不是因为它允许你获得当前的工作目录,甚至允许你使用相对文件路径打开文件....
Mic*_*ers 143
在纯Java中没有可靠的方法来做到这一点.user.dir通过System.setProperty()或java -Duser.dir=...似乎影响后续创作的属性Files,但不是例如FileOutputStreams.
该File(String parent, String child)构造可以帮助您从您的文件路径单独建立你的目录路径,用户可以方便地交换.
另一种方法是设置脚本以从其他目录运行Java,或者使用下面建议的 JNI本机代码.
相关的Sun漏洞在2008年被关闭,因为"无法修复".
Ste*_*e K 29
这里是一个办法做到这一点使用系统属性"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");
}
}
Run Code Online (Sandbox Code Playgroud)
All*_*ner 17
可以使用JNA/JNI来调用libc来更改PWD.JRuby的人有一个方便的java库,用于调用POSIX调用jna-posix这里是maven信息
你可以在这里看到它的使用示例(Clojure代码,对不起).查看函数chdirToRoot
Ada*_*ter 11
如果我理解正确,Java程序将以当前环境变量的副本开头.任何更改都会System.setProperty(String, String)修改副本,而不是原始环境变量.并不是说这为Sun选择这种行为的原因提供了一个彻底的理由,但也许它有点轻松......
Biz*_*rck 11
如前所述,您无法更改JVM的CWD,但如果您要使用Runtime.exec()启动另一个进程,则可以使用重载方法来指定工作目录.这不是真正用于在另一个目录中运行Java程序,但是在许多情况下,当需要启动另一个程序(例如Perl脚本)时,您可以指定该脚本的工作目录,同时保持JVM的工作目录不变.
请参见Runtime.exec javadocs
特别,
public Process exec(String[] cmdarray,String[] envp, File dir) throws IOException
Run Code Online (Sandbox Code Playgroud)
在哪里dir运行子进程的工作目录
工作目录是操作系统功能(在进程启动时设置).为什么不直接传递自己的System属性(-Dsomeprop=/my/path)并在代码中使用它作为文件的父级:
File f = new File ( System.getProperty("someprop"), myFilename)
Run Code Online (Sandbox Code Playgroud)