如何在java中获取执行目录路径[重复]

Posted

技术标签:

【中文标题】如何在java中获取执行目录路径[重复]【英文标题】:How to get the execution directory path in java [duplicate] 【发布时间】:2013-07-30 03:49:03 【问题描述】:

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

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

之后,我使用其 jar 文件制作了一个安装程序并将其安装在我的 Windows 8 中,然后将其添加到 Windows 右键单击​​下拉菜单(上下文菜单)中。当我从上下文菜单启动它时,它总是告诉我实际安装它的目录中的文件数,但是我想知道我正在执行它的那个目录的文件数。

所以请帮助我。我是这个领域的新手,我不希望你在当前目录和当前执行目录中混淆我。所以我写了这么长,希望用非常简单的文字得到一个干净的答案。

谢谢

【问题讨论】:

this tutorial 会帮助你吗? @maddy 文件编号[]=f.listFiles(); int x=no.length。然后打印 x; 【参考方案1】:

正如 Jarrod Roberson 在his answer here 中所说:

一种方法是使用system property System.getProperty("user.dir"); 这会给你“当前 初始化属性时的工作目录”。这是 可能是你想要的。找出java 命令的位置 在您的情况下,在包含要处理的文件的目录中发出,甚至 尽管实际的 .jar 文件可能位于 机器。拥有实际 .jar 文件的目录不是 在大多数情况下很有用。

下面会打印出当前目录 无论 .class 或 .jar 文件位于何处,都会调用命令 .class 文件在里面。

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

【讨论】:

System.getProperty("user.dir")new File(".") usually return the same value。那么,根据问题,为什么这会起作用,而 new File(".") 却不起作用? 再一次,你不能简单地在你复制了别人的措辞的答案的末尾添加一个链接。您必须明确引用复制的语言,以便人们知道这不是您的原创贡献。【参考方案2】:

File Javadoc 表示通常针对当前用户目录解析相对文件。它继续:

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

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

根据this tutorial,您需要做的事情如下:

    HKEY_CLASSES_ROOT\Directory\Background\shell 下创建一个新的注册表项。它的名称将在 Explorer 上下文菜单中使用,因此我们将其赋值为 MyJavaApp。 在HKEY_CLASSES_ROOT\Directory\Background\shell\MyJavaApp 下创建一个新的注册表项并将其命名为command。它的值应该是您的 Java 应用程序的完整路径。您可以将%1 添加到命令中,作为当前选定文件/目录的占位符。这意味着将使用一个附加参数调用您的程序。 您的程序可以读取附加参数以确定从哪个目录调用它。

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

【讨论】:

【参考方案3】:

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

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 文件的执行路径。

【讨论】:

这实际上回答了这个问题。评分较高的答案回答了他们认为更有用的问题。【参考方案4】:

您可能对以下几种不同的事物感兴趣:

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

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

【讨论】:

System.getProperty("user.dir")new File(".") usually return the same value。那么,根据问题,为什么这会起作用,而 new File(".") 却不起作用?【参考方案5】:

以下内容可能对您有所帮助

  System.getProperty("user.dir")

这会将路径作为字符串返回给您

【讨论】:

是的,我也这样做了,显然我得到了字符串中的路径,但我想知道我执行它的那个目录的路径,而不是安装它的那个目录的路径。 @Mohd Faizan Khan,我不确定你的要求。执行之前的安装路径吗? System.getProperty("user.dir")new File(".") usually return the same value。那么,根据问题,为什么这会起作用,而 new File(".") 却不起作用?

以上是关于如何在java中获取执行目录路径[重复]的主要内容,如果未能解决你的问题,请参考以下文章

执行java可执行文件(.exe)时如何获取CMD的目录[重复]

如何获取调用 python 可执行文件的路径 [重复]

如何获取执行程序的当前路径

如何在java中获取当前项目的路径

如何使用 Qt API 在 android 中获取`/sdcard` 路径 [重复]

如何访问测试代码中的测试套件目录路径[重复]