如何使用 Java 获取最新的工作目录?

假设我的主课是 C:\Users\Justian\Documents\。我怎样才能让我的程序显示它在 C:\Users\Justian\Documents中?

硬编码不是一个选项-它需要适应,如果它被移动到另一个位置。

我想转储一堆 CSV 文件在一个文件夹中,让程序识别所有的文件,然后加载数据和操作它们。我真的很想知道怎么找到那个文件夹。

377774 次浏览

谁说你的主类在本地硬盘上的文件里?类通常被捆绑在 JAR 文件中,有时会通过网络加载,甚至动态生成。

你到底想做什么?也许有一种方法可以做到这一点,而不必假设类的来源。

使用 CodeSource#getLocation()。这在 JAR 文件中也可以很好地工作。你可以通过 ProtectionDomain#getCodeSource()获得 CodeSource,而 ProtectionDomain又可以通过 Class#getProtectionDomain()获得。

public class Test {
public static void main(String... args) throws Exception {
URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
System.out.println(location.getFile());
}
}

Update as per the comment of the OP:

我想转储一堆 CSV 文件在一个文件夹中,让程序识别所有的文件,然后加载数据和操作它们。我真的很想知道怎么找到那个文件夹。

这将需要硬编码/知道它们在程序中的相对路径。而是考虑将其路径添加到类路径,以便您可以使用 ClassLoader#getResource()

File classpathRoot = new File(classLoader.getResource("").getPath());
File[] csvFiles = classpathRoot.listFiles(new FilenameFilter() {
@Override public boolean accept(File dir, String name) {
return name.endsWith(".csv");
}
});

Or to pass its path as main() argument.

One way would be to use the 系统属性系统属性 System.getProperty("user.dir"); this will give you "The current working directory when the properties were initialized". This is probably what you want. to find out where the java command was issued, in your case in the directory with the files to process, even though the actual .jar file might reside somewhere else on the machine. Having the directory of the actual .jar file isn't that useful in most cases.

下面的代码将打印调用该命令的工作目录,而不管。班级或。Jar 文件。类文件在。

public class Test
{
public static void main(final String[] args)
{
final String dir = System.getProperty("user.dir");
System.out.println("current dir = " + dir);
}
}

如果您在 /User/me/中,并且包含以上代码的.jar 文件在 /opt/some/nested/dir/中 命令 java -jar /opt/some/nested/dir/test.jar Test将输出 current dir = /User/me

另外,还应该考虑使用一个好的面向对象命令行参数解析器。 我强烈推荐使用 Java 简单参数解析器 JSAP。这将允许您使用 System.getProperty("user.dir"),或者传入其他内容来覆盖该行为。一个更易于维护的解决方案。这将使在目录中进行传递变得非常容易,并且在没有传入任何内容的情况下可以回到 user.dir

File currentDirectory = new File(new File(".").getAbsolutePath());
System.out.println(currentDirectory.getCanonicalPath());
System.out.println(currentDirectory.getAbsolutePath());

Prints something like:

/path/to/current/directory
/path/to/current/directory/.

请注意,File.getCanonicalPath()抛出一个选中的 IOException,但它会删除类似 ../../../的内容

this.getClass().getClassLoader().getResource("").getPath()

如果你想要当前源代码的绝对路径,我的建议是:

String internalPath = this.getClass().getName().replace(".", File.separator);
String externalPath = System.getProperty("user.dir")+File.separator+"src";
String workDir = externalPath+File.separator+internalPath.substring(0, internalPath.lastIndexOf(File.separator));

我刚用了:

import java.nio.file.Path;
import java.nio.file.Paths;

...

Path workingDirectory=Paths.get(".").toAbsolutePath();

如果你想得到你当前的工作目录,可以使用下面的代码

System.out.println(new File("").getAbsolutePath());