使用Java获取当前工作目录

Qaz*_*azi 955 java working-directory

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

 String current = new java.io.File( "." ).getCanonicalPath();
        System.out.println("Current dir:"+current);
 String currentDir = System.getProperty("user.dir");
        System.out.println("Current dir using System:" +currentDir);
Run Code Online (Sandbox Code Playgroud)

输出:

Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32
Run Code Online (Sandbox Code Playgroud)

我的输出不正确,因为C盘不是我当前的目录.在这方面需要帮助.

Anu*_*tel 1089

public class JavaApplication1 {
  public static void main(String[] args) {
       System.out.println("Working Directory = " +
              System.getProperty("user.dir"));
  }
}
Run Code Online (Sandbox Code Playgroud)

这将打印出初始化应用程序完整绝对路径.

  • @ubuntudroid:这就是为什么我特别提到它将打印应用程序初始化的路径.我猜线程启动器在启动commnad提示符后直接运行jar/program(基本上是在C:\ WINDOWS\system32).我希望你理解我的观点.假设你被投票,请欣赏至少你是否愿意留下回应.:) (25认同)
  • @SubOptimal如果用户设置-Duser.dir,他希望在自定义工作目录中运行它. (13认同)
  • @indyaah实际上这个答案是错误的,用户工作目录和系统进程的当前工作目录(cwd)之间存在细微差别; 大多数时候"user.dir"指向(java)进程的cwd; 但"user.dir"具有不同的语义,不得用于获取java进程的cwd; 顺便说一句:有更多可用于java进程的属性https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html仅供参考 (3认同)
  • user.dir 将获取启动进程的文件夹的路径。要获取应用程序主文件夹的实际路径,请参阅下面的答案。 (2认同)

小智 362

请参阅:http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

使用java.nio.file.Pathjava.nio.file.Paths,您可以执行以下操作以显示Java认为您当前的路径.这适用于7及以上,并使用NIO.

Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);
Run Code Online (Sandbox Code Playgroud)

这输出Current relative path is: /Users/george/NetBeansProjects/Tutorials在我的情况下是我运行类的地方.以相对方式构造路径,通过不使用前导分隔符来指示您正在构建绝对路径,将使用此相对路径作为起点.

  • 请不要混淆用户的主目录("user.home",您的/ Users/george)和当前工作目录("user.dir",它将是您为应用程序启动JVM的目录,所以可能像例如/ Users/george/workspace/FooBarProject). (11认同)
  • 我更喜欢这种方式。当我需要工作目录的父目录时,这*不起作用*:`Paths.get("").getParent()`,它给出`null`。相反,这有效:`Paths.get("").toAbsolutePath().getParent()`。 (3认同)
  • 第一个没有检查,但第二个实际上将获得你的主文件夹.不是运行应用程序的当前工作目录. (2认同)

Dmi*_*lov 220

以下适用于Java 7及更高版本(有关文档,请参见此处).

import java.nio.file.Paths;

Paths.get(".").toAbsolutePath().normalize().toString();
Run Code Online (Sandbox Code Playgroud)

  • 这比可移植的`import java.io.File更好; 文件(".").getAbsolutePath()`? (9认同)
  • 当你说可移植时,你的意思是它适用于Java 6及更早版本?`Paths.get()`可能被认为更好,因为它可以直接访问更强大的`Path`接口. (8认同)
  • 在这种情况下使用`.normalize()`的潜在优势是什么? (8认同)
  • @ OleV.V.从Javadoc:(*normalize方法*)`返回一条路径,该路径删除了冗余的名称元素 (6认同)

Mar*_*ark 60

这将为您提供当前工作目录的路径:

Path path = FileSystems.getDefault().getPath(".");
Run Code Online (Sandbox Code Playgroud)

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

Path path = FileSystems.getDefault().getPath("Foo.txt");
Run Code Online (Sandbox Code Playgroud)

编辑: 从文件系统的根目录获取当前目录的绝对路径:

Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();
Run Code Online (Sandbox Code Playgroud)

  • 这只是返回'.' 为了我. (7认同)
  • 是的,在许多将成为工作目录引用的系​​统中.要获取绝对路径,可以再添加一个方法调用`Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();` (2认同)
  • 您不需要foo.txt,只需输入一个空字符串即可获取目录 (2认同)

小智 33

这是我的解决方案

File currentDir = new File("");
Run Code Online (Sandbox Code Playgroud)

  • 要解决这个问题,请使用`new File("").getAbsoluteFile()`. (13认同)
  • 对于它的价值,我运气好的文件("."). (4认同)
  • 当您使用此类 File 对象作为另一个 File 的父对象时,这会产生副作用: new File(new File(""), "subdir") 将无法按预期工作 (2认同)

Pau*_*and 30

是什么让你认为c:\ windows\system32不是你当前的目录?该user.dir属性显式为"用户的当前工作目录".

换句话说,除非你从命令行启动Java,否则c:\ windows\system32可能就是你的CWD.也就是说,如果要双击以启动程序,则CWD不太可能是您双击的目录.

编辑:似乎只适用于旧版Windows和/或Java版本.

  • 这似乎不是事实,至少在使用Java 7的Windows 7计算机上不是这样。`user.dir`始终是我双击jar文件的文件夹。 (2认同)

fre*_*dev 27

我在评论中发现这个解决方案比其他更好,更便携:

String cwd = new File("").getAbsolutePath();
Run Code Online (Sandbox Code Playgroud)

  • 它应该是 Path cwd = Paths.get("").toAbsolutePath(); (2认同)
  • 最好使用 `Path.of`,因为[路径可能会被弃用](https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/nio/file/Paths .html)。另外,“Paths.get”只是调用“Path.of”。 (2认同)

Ami*_*aei 25

使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这将返回JAR文件的位置.不是要求的. (2认同)

Pet*_*ter 22

this.getClass().getClassLoader().getResource("").getPath()
Run Code Online (Sandbox Code Playgroud)

  • 通过双击它从JAR文件启动我的应用程序时引发NPE. (12认同)
  • @djthoms只需删除`this`,它就可以了. (3认同)
  • 如果应用程序从JAR文件或CLASSPATH元素运行,则返回""".不是要求的. (2认同)

com*_*ome 17

通常,作为File对象:

File getCwd() {
  return new File("").getAbsoluteFile();
}
Run Code Online (Sandbox Code Playgroud)

你可能希望拥有像"D:/ a/b/c"这样的完全限定字符串:

getCwd().getAbsolutePath()
Run Code Online (Sandbox Code Playgroud)

  • @nsandersen你可能使用了错误的File对象:System.out.println(new java.io.File("").getAbsolutePath()); (2认同)

Boh*_*dan 12

我在Linux上并且对这两种方法都得到了相同的结果:

@Test
public void aaa()
{
    System.err.println(Paths.get("").toAbsolutePath().toString());

    System.err.println(System.getProperty("user.dir"));
}
Run Code Online (Sandbox Code Playgroud)

Paths.get("") 文档

System.getProperty("user.dir") 文档


JSS*_*JSS 5

我希望您要访问包含包的当前目录,即如果您的 Java 程序在其中c:\myApp\com\foo\src\service\MyTest.java并且您想打印到c:\myApp\com\foo\src\service那时您可以尝试以下代码:

String myCurrentDir = System.getProperty("user.dir")
            + File.separator
            + System.getProperty("sun.java.command")
                    .substring(0, System.getProperty("sun.java.command").lastIndexOf("."))
                    .replace(".", File.separator);
    System.out.println(myCurrentDir);
Run Code Online (Sandbox Code Playgroud)

注意:此代码仅在带有 Oracle JRE 的 Windows 中进行了测试。

  • 不否决这个答案是不利的。发帖前请慎重考虑。您的代码已损坏,除非所有这些都是真的: 1. JRE 是 Oracle 的,否则将没有“sun.java.command”系统属性 → NPE;2.操作系统是Windows(使用`File.separator`代替,或多参数`File`构造函数);3.classpath在命令行中指定,_and_'当前目录包括包'(??)是: a. 首先指定,b。绝对指定,c。与 CWD 完全匹配(即使 Windows 不区分大小写),并且 d. 是 CWD 的后代 (7认同)

小智 5

Linux 上,当您从终端运行jar文件时,无论您的 jar 文件在哪里,它们都会返回相同的信息:“/home/CurrentUser”。当您启动 jar 文件时,这仅取决于您在终端中使用的当前目录。String

Paths.get("").toAbsolutePath().toString();

System.getProperty("user.dir");
Run Code Online (Sandbox Code Playgroud)

如果您的Classwithmain将被调用MainClass,请尝试:

MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();
Run Code Online (Sandbox Code Playgroud)

这将返回一个String带有绝对路径的的JAR文件。

  • 这不是所要求的。 (5认同)

小智 5

使用Windows user.dir返回预期的目录,但是以提升的权限启动应用程序(以管理员身份运行)时不会返回该目录,在这种情况下,您会得到C:\ WINDOWS \ system32


MJB*_*MJB 1

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

就像是

java -D com.mycompany.workingDir="%0"
Run Code Online (Sandbox Code Playgroud)

这不太对,但你明白了.那么System.getProperty("com.mycompany.workingDir")......

  • 与问题无关. (9认同)
  • 是的,它有意义.我的话很难选.但你忽略了这一点 - 在Java 7之前,没有办法知道当前的工作目录,不同的实现设置它们......不同...... (2认同)