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

190

如何在Java程序中更改当前工作目录?关于这个问题,我查到的所有信息都声称你无法更改当前工作目录,但我不相信这是真的。

我有一段代码,使用一个硬编码的相对文件路径打开一个文件,该文件位于正常启动的目录下,我想要能够在不必从特定目录启动它的情况下,在另一个Java程序中使用该代码。调用 System.setProperty("user.dir", "/path/to/dir") 应该可以解决此问题,但据我所知,调用该行代码只会悄无声息地失败并且没有任何效果。

如果Java不允许你这样做,我会理解的,但事实上Java允许获取当前工作目录,甚至允许使用相对文件路径打开文件....


1
获取和使用信息与更改信息是不同的。例如,在Windows上,您可以轻松获取环境变量,但更改它们(以系统范围的方式)则更加困难。 - PhiLho
1
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4045688 在评估部分指出:“自那时以来,没有进一步的客户站出来或被识别出来...”,截至2018年,我们已经有了大约175,000次查看这个问题 :-( - Wolfgang Fahl
14个回答

2
你可以使用JNI或JNA更改进程的实际工作目录。 使用JNI,您可以使用本机函数设置目录。 POSIX方法是chdir()。在Windows上,您可以使用SetCurrentDirectory()使用JNA,您可以将本机函数包装在Java绑定器中。
对于Windows:
private static interface MyKernel32 extends Library {
    public MyKernel32 INSTANCE = (MyKernel32) Native.loadLibrary("Kernel32", MyKernel32.class);

    /** BOOL SetCurrentDirectory( LPCTSTR lpPathName ); */
    int SetCurrentDirectoryW(char[] pathName);
}

对于POSIX系统:
private interface MyCLibrary extends Library {
    MyCLibrary INSTANCE = (MyCLibrary) Native.loadLibrary("c", MyCLibrary.class);

    /** int chdir(const char *path); */
    int chdir( String path );
}

0
如果您在shell中运行命令,可以编写类似"java -cp"的内容,并用":"分隔任何您想要添加的目录。如果Java在一个目录中找不到某些东西,它将尝试在其他目录中查找,这就是我所做的。

0

对于这个问题的另一个可能答案可能取决于您打开文件的原因。这是一个属性文件还是与您的应用程序相关的某些配置文件?

如果是这种情况,您可以考虑尝试通过类路径加载器加载文件,这样您就可以加载Java可以访问的任何文件。


-1
使用FileSystemView
private FileSystemView fileSystemView;
fileSystemView = FileSystemView.getFileSystemView();
currentDirectory = new File(".");
//listing currentDirectory
File[] filesAndDirs = fileSystemView.getFiles(currentDirectory, false);
fileList = new ArrayList<File>();
dirList = new ArrayList<File>();
for (File file : filesAndDirs) {
if (file.isDirectory())
    dirList.add(file);
else
    fileList.add(file);
}
Collections.sort(dirList);
if (!fileSystemView.isFileSystemRoot(currentDirectory))
    dirList.add(0, new File(".."));
Collections.sort(fileList);
//change
currentDirectory = fileSystemView.getParentDirectory(currentDirectory);

导入javax.swing.filechooser.FileSystemView; - Borneq
2
这个回答与问题无关。 - Aaron Digulla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接