如何在Java中获取当前的工作目录?


112

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

硬编码不是一种选择-如果将其移动到另一个位置,则需要适应性强。

我想将一堆CSV文件转储到一个文件夹中,让程序识别所有文件,然后加载数据并进行操作。我真的只想知道如何导航到该文件夹​​。



1
如果您的主类在jar文件中怎么办?您想要什么结果?
Mattias Nilsson,2010年

1
为什么您仍然需要这样做?
Ed S. 2010年

1
听起来您需要的是CSV文件所在的目录,并使.jar文件能够引用该目录,如果是这种情况,请参阅我的回答。

Answers:


149

一种方法是使用系统属性, System.getProperty("user.dir");这将为您提供“初始化属性时的当前工作目录”。这可能就是您想要的。java即使实际的.jar文件可能驻留在计算机上的其他位置,也可以查找发出命令的位置(在您的情况下,该命令位于包含要处理文件的目录中)。在大多数情况下,拥有实际的.jar文件的目录不是很有用。

以下内容将打印出从中调用命令的当前目录,无论.class文件位于.class还是.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如果没有传递任何内容,则可以依靠它。


可以的时候我会测试一下。我真的很关注那个.jar问题:P
Justian Meyer

您是否在回答该.jar问题时访问了该链接,在此我展示了如何使用ANT构建.jar文件?

Jarrod的代码可以从System Property返回当前工作目录的绝对路径,user.dir这很容易使用。System.getProperty(“ user.dir”);

74

使用CodeSource#getLocation()。这在JAR文件中也可以正常工作。您可以CodeSource通过获得,ProtectionDomain#getCodeSource()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());
    }
}

根据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");
    }
});

或将其路径作为main()参数传递。


3
+1。进行这项工作有几个条件。最重要的是您的“主类”是从文件系统加载的。在Java中,此假设为假并不罕见。但是,如果确定要从文件系统上的JAR加载类,则方法有效。
erickson 2010年

这全都取决于,真的。我正在尝试编译我的JAR,但是目前这是一个单独的问题。如果您认为可以提供帮助,请查看: stackoverflow.com/questions/3152240/…。我敢肯定,张贴这是某种违规行为,但这与这个问题有关。如果我能解决问题,那肯定是我的答案。
Justian Meyer

为什么我需要对此进行硬编码?我以前做过类似的事情。假设我的jar和文件夹将始终具有相似的关系(即在同一目录中)。如果是这样,我可以获取jar的目录,然后对其进行修改以找到该文件夹​​。
Justian Meyer

如果它与JAR文件位于同一文件夹中,则它已经位于类路径中。“硬编码”一词有点夸张,实际上我的意思是“知道它们相对于JAR文件的路径”。
BalusC 2010年

1
@Moebius:嗯?您是Java新手吗?检查javadoc。只需使用getLocation()方法返回的那个即可。其他的显然不起作用。
BalusC

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

打印类似:

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

请注意,File.getCanonicalPath()这会抛出一个已检查的IOException,但它将删除类似 ../../../


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

请注意,这会将路径返回到“ bin / classes /”,而不仅仅是“ bin”。
android开发人员

在使用Intellij Idea调试正在运行的应用程序时,此返回“ /C:/Program%20Files/Java/jdk1.8.0_112/:”
速度

5

我只是用过:

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

...

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

9
您的电脑不起作用,这是正确的Paths.get("").toAbsolutePath();
到Kra

@ToKra如果我Paths.get("my/file").toAbsolutePath()知道了/my/file,那绝对不是cwd。
abergmeier

1
@abergmeier我在字符串中写了“”,而不是“ my / file”
致于Kra

5

如果要获取当前的工作目录,请使用以下行

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

4

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

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));

当您在IDE上运行它或使用某种方法旋转实例时,这将不起作用。
Sarp Kaya 2015年

内部路径是java \ lang \ Class外部路径是E:\ BranchProduction1.4.0 \ FilesTestProject \ src工作目录是E:\ BranchProduction1.4.0 \ FilesTestProject \ src \ java \ lang您可以解释输出吗?
JAVA

3

谁说您的主要班级在本地硬盘上的文件中?类通常捆绑在JAR文件中,有时通过网络加载,甚至即时生成。

那么,您实际上想做什么?可能有一种方法可以不对类的来源做出假设。


我想将一堆CSV文件转储到一个文件夹中,让程序识别所有文件,然后加载数据并对其进行操作。我真的只想知道如何导航到该文件夹​​。
Justian Meyer

也许我错过了一些东西,但似乎一条绝对的道路会起作用。您说过不能对其进行硬编码,但是如何知道要从哪个文件夹开始呢?
克里斯·汤普森

好吧,问题是我想将其带到其他计算机上,而不仅仅是我自己的计算机上。我看不到如何对路径进行硬编码。“假设我的jar和文件夹将始终具有相似的关系(即在同一目录中)。如果为真,则可以获取jar的目录,然后对其进行修改以找到该文件夹​​。” 我可以硬编码的唯一方法是,如果我不必包括从硬盘驱动器到文件的完整路径。也许我只能返回3个文件夹(即“ Documents \ Project \ Dump \ [文件/文件夹]”)
Justian Meyer 2010年

我想说的是,您要获取jar文件所在目录的句柄。这样可以满足您的要求吗?
克里斯·汤普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.