我想使用Java访问我的当前工作目录。

我的代码:

 String currentPath = new java.io.File(".").getCanonicalPath();
 System.out.println("Current dir:" + currentPath);

 String currentDir = System.getProperty("user.dir");
 System.out.println("Current dir using System:" + currentDir);

输出:

Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32

我的输出不正确,因为C驱动器不是我的当前目录。

如何获取当前目录?


当前回答

这是我的银弹,当困惑的时刻冒泡。(把它称为主要的第一件事)。例如,JVM可能被IDE滑到不同的版本。这个静态函数搜索当前进程PID,并在该PID上打开VisualVM。困惑就此停止,因为你想要一切,而且你得到了……

  public static void callJVisualVM() {
    System.out.println("USER:DIR!:" + System.getProperty("user.dir"));
    //next search current jdk/jre
    String jre_root = null;
    String start = "vir";
    try {
        java.lang.management.RuntimeMXBean runtime =
                java.lang.management.ManagementFactory.getRuntimeMXBean();
        String jvmName = runtime.getName();
        System.out.println("JVM Name = " + jvmName);
        long pid = Long.valueOf(jvmName.split("@")[0]);
        System.out.println("JVM PID  = " + pid);
        Runtime thisRun = Runtime.getRuntime();
        jre_root = System.getProperty("java.home");
        System.out.println("jre_root:" + jre_root);
        start = jre_root.concat("\\..\\bin\\jvisualvm.exe " + "--openpid " + pid);
        thisRun.exec(start);
    } catch (Exception e) {
        System.getProperties().list(System.out);
        e.printStackTrace();
    }
}

其他回答

当前工作目录在不同的Java实现中定义不同。对于Java 7之前的某些版本,没有一致的方法来获取工作目录。您可以通过使用-D启动Java文件并定义一个变量来保存信息来解决这个问题

类似的

java -D com.mycompany.workingDir="%0"

这并不完全正确,但你可以理解。然后System.getProperty(“com.mycompany.workingDir”)……

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

这将给你当前工作目录的路径:

Path path = FileSystems.getDefault().getPath(".");

这将为您提供工作目录中名为“Foo.txt”的文件的路径:

Path path = FileSystems.getDefault().getPath("Foo.txt");

编辑: 获取当前目录的绝对路径。

Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();

*更新* 获取当前工作目录:

Path path = FileSystems.getDefault().getPath("").toAbsolutePath();

这并不是确切的要求,但这里有一个重要的注意:当在Windows机器上运行Java时,Oracle安装程序将“Java .exe”放入C:\Windows\system32中,这是Java应用程序的启动器(除非在PATH前面有Java .exe,并且Java应用程序是从命令行运行的)。这就是为什么File(".")总是返回C:\Windows\system32,以及为什么从macOS或*nix实现运行示例时总是返回与Windows不同的结果。

不幸的是,就我在二十年的Java编码中所发现的,对于这个问题并没有普遍正确的答案,除非您想使用JNI调用创建自己的本机启动器可执行文件,并在启动时从本机启动器代码中获取当前工作目录。在某些情况下,其他事物至少会有一些细微差别。

假设您试图在eclipse或netbean中运行项目,或者在命令行中独立运行项目。我已经写了一个方法来解决它

public static final String getBasePathForClass(Class<?> clazz) {
    File file;
    try {
        String basePath = null;
        file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
            basePath = file.getParent();
        } else {
            basePath = file.getPath();
        }
        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbean
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    } catch (URISyntaxException e) {
        throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName());
    }
}

要使用,在任何你想要读取文件的基路径的地方,你可以将你的锚类传递给上面的方法,结果可能是你需要的东西:D

最好的