22

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

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

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

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

谢谢

4

5 回答 5

35

正如 Jarrod Roberson 在这里的回答中所说:

一种方法是使用系统属性 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.

作为奖励,您还应该考虑使用一个好的面向对象的命令行参数解析器。我强烈推荐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
于 2013-07-30T06:20:21.897 回答
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 文件的执行路径。

于 2013-07-30T06:34:02.187 回答
7

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

  System.getProperty("user.dir")

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

于 2013-07-30T06:20:03.947 回答
0

您可能会感兴趣一些不同的事情:

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

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

于 2013-07-30T06:21:26.260 回答
0

File Javadoc说通常根据当前用户目录解析相对文件。它继续:

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

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

根据本教程,您需要做的事情如下:

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

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

于 2013-07-30T06:37:43.733 回答