如何在Java中获取执行目录路径

24

我做了一个纯Java应用程序,它告诉我给定目录中文件的数量。现在我使用以下代码设置当前目录:

`File f = new File(".");`

安装完JAR文件后,我制作了一个安装程序并将其安装在Windows 8中,然后将其添加到Windows右键点击下拉菜单(上下文菜单)中。当我从上下文菜单中启动它时,它总是告诉我实际安装位置的目录中有多少个文件,但我想知道从我正在执行它的目录中的文件数量。

所以请帮助我。我是这个领域的新手,我不想让您混淆当前目录和当前执行目录。因此,我写了这么长,并希望用非常简单的话得到一个清晰的答案。

谢谢


这个教程对你有帮助吗?链接 - mthmulders
@maddy 文件 no[]=f.listFiles(); int x=no.length。然后打印 x; - Mohd Faizan Khan
5个回答

39

正如Jarrod Roberson在他的这篇答案中所述:

一种方法是使用系统属性 System.getProperty("user.dir"); 这将返回 "当该属性被初始化时的当前工作目录"。这可能是您想要的,以查找发出java命令的目录,在您的情况下是处理文件所在的目录,即使实际的.jar文件可能存储在机器上的其他位置。在大多数情况下,获得实际.jar文件的目录并没有太多用处。

以下代码将打印从哪里调用命令的当前目录,无论.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

作为额外奖励,您还应该考虑使用一个很好的面向对象的命令行参数解析器。我强烈推荐JSAP,这是一个Java简单参数解析器。这将允许您使用System.getProperty("user.dir"),并通过传递其他内容来覆盖默认行为。这是一个更可维护的解决方案,可以轻松地传递要处理的目录,并能够在未传入任何内容时回退到user.dir

示例:GetExecutionPath

import java.util.*;
import java.lang.*;

public class GetExecutionPath
{
  public static void main(String args[]) {
    try{
      String executionPath = System.getProperty("user.dir");
      System.out.print("Executing at =>"+executionPath.replace("\\", "/"));
    }catch (Exception e){
      System.out.println("Exception caught ="+e.getMessage());
    }
  }
}

以上的输出结果将会如下所示:

C:\javaexamples>javac GetExecutionPath.jav

C:\javaexamples>java GetExecutionPath
Executing at =>C:/javaexamples

2
System.getProperty("user.dir")new File(".")通常会返回相同的值。那么为什么根据问题,new File(".")不起作用,而System.getProperty("user.dir")可以工作呢? - mthmulders
1
不要简单地在答案的末尾贴上一个链接,链接内容是抄袭他人的语言。必须明确引用被复制的语言,以便让人们知道这不是你原创的贡献。 - Brad Larson

9

您可以做一些疯狂的事情:

String absolute = getClass().getProtectionDomain().getCodeSource().getLocation().toExternalForm();
absolute = absolute.substring(0, absolute.length() - 1);
absolute = absolute.substring(0, absolute.lastIndexOf("/") + 1);
String configPath = absolute + "config/file.properties";
String os = System.getProperty("os.name");
if (os.indexOf("Windows") != -1) {
    configPath = configPath.replace("/", "\\\\");
    if (configPath.indexOf("file:\\\\") != -1) {
        configPath = configPath.replace("file:\\\\", "");
    }
} else if (configPath.indexOf("file:") != -1) {
    configPath = configPath.replace("file:", "");
}

我使用这个方法来读取相对于执行路径的配置文件。你也可以使用它来获取你的jar文件的执行路径。


1
这实际上回答了问题。更高评分的答案回答了他们认为更有用的问题。 - arcy

7
以下内容可能会对您有所帮助。
  System.getProperty("user.dir")

这将返回一个字符串路径。

是的,我也做过这个,显然我得到了字符串路径,但我想知道它所在的目录路径是从哪里执行的,而不是安装它的目录。 - Mohd Faizan Khan
@Mohd Faizan Khan,我不确定你的要求。在执行之前,您需要安装路径吗? - Karthikeyan
System.getProperty("user.dir")new File(".")(通常返回相同的值)参考链接。那么为什么这个能够工作,而根据问题所述new File(".")却不能呢? - mthmulders

0

你可能会对以下几个不同的事情感兴趣:

  • 获取当前工作目录:String workingDir = System.getProperty("user.dir");

  • 获取类加载器路径:URL resource = classLoader.getResource("/");


System.getProperty("user.dir")new File(".") 通常返回相同的值。那么为什么根据问题,new File(".") 不起作用,而前者却可以呢? - mthmulders

0

File Javadoc中提到,相对文件通常会根据当前用户目录进行解析。它继续说道:

该目录由系统属性user.dir命名,通常是Java虚拟机被调用的目录。

因此,new File(".")System.getProperty("user.dir");都将返回相同的结果。根据问题描述,您正在从Windows资源管理器上下文菜单运行,这可能与正常的JVM调用有所不同。

根据this tutorial,您需要执行以下操作:

  1. HKEY_CLASSES_ROOT\Directory\Background\shell下创建一个新的注册表项。它的名称将用于资源管理器上下文菜单,因此让我们给它设置值为MyJavaApp
  2. HKEY_CLASSES_ROOT\Directory\Background\shell\MyJavaApp下创建一个名为command的新注册表项。它的值应该是你的Java应用程序的完整路径。你可以添加%1到命令中作为当前选择的文件/目录的占位符。这意味着你的程序将被调用时有一个额外的参数。
  3. 你的程序可以读取额外的参数来确定它被调用的目录。

请注意,以上步骤(以及教程)适用于Windows Vista,因此您可能需要仔细检查它是否适用于Windows 8。


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