使用Java获取当前工作目录

Getting the Current Working Directory in Java

我想使用

1
2
3
4
 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);

输出:

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

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


1
2
3
4
5
6
public class JavaApplication1 {
  public static void main(String[] args) {
       System.out.println("Working Directory =" +
              System.getProperty("user.dir"));
  }
}

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


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

使用EDCOX1、5和EDCOX1(6),您可以执行以下操作来显示Java认为是当前的路径。这是为7和上,并使用NIO。

1
2
3
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is:" + s);

这将输出Current relative path is: /Users/george/NetBeansProjects/Tutorials,在我的例子中,它是我运行类的地方。以相对方式构建路径,不使用前导分隔符指示正在构建绝对路径,将使用此相对路径作为起点。


以下是Java 7和UP的工作(请参阅文档)。

1
2
3
import java.nio.file.Paths;

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


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

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

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

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

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

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


这是我的解决方案

1
File currentDir = new File("");


是什么让您认为c:windowssystem32不是您当前的目录?user.dir属性明确表示为"用户当前工作目录"。

换言之,除非从命令行启动Java,否则C:Windows Stave32可能是您的CWD。也就是说,如果双击以启动程序,则CWD不太可能是双击的源目录。

编辑:这看起来对于旧的Windows和/或Java版本来说是正确的。


使用CodeSource#getLocation()

这在JAR文件中也可以正常工作。你可以用ProtectionDomain#getCodeSource()获得CodeSource,反过来用Class#getProtectionDomain()获得ProtectionDomain

1
2
3
4
5
6
public class Test {
    public static void main(String... args) throws Exception {
        URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
        System.out.println(location.getFile());
    }
}


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


我在评论中发现这个解决方案比其他解决方案更好,而且更易于携带:

1
String cwd = new File("").getAbsolutePath();


通常,作为文件对象:

1
2
3
File getCwd() {
  return new File("").getAbsoluteFile();
}

您可能希望使用完整的限定字符串,如"d:/a/b/c",执行以下操作:

1
getCwd().getAbsolutePath()


我在Linux上,这两种方法的结果相同:

1
2
3
4
5
6
7
@Test
public void aaa()
{
    System.err.println(Paths.get("").toAbsolutePath().toString());

    System.err.println(System.getProperty("user.dir"));
}

Paths.get("")文件

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


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

类似的东西

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

不太对,但你知道。然后System.getProperty("com.mycompany.workingDir")


在Linux上,当您从终端运行JAR文件时,它们都将返回相同的String:"/home/currentuser",无论JAR文件在哪里。这取决于当您启动JAR文件时,您在终端上使用的当前目录。

1
2
3
Paths.get("").toAbsolutePath().toString();

System.getProperty("user.dir");

如果你的Classmain被称为MainClass,那么尝试:

1
MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();

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


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


我希望你想访问包括包在内的当前目录,即如果你的Java程序是在EDCOX1×3中,并且你想打印到EDCOX1×4,那么你可以试试下面的代码:

1
2
3
4
5
6
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);

注意:此代码仅在使用OracleJRE的Windows中测试。


提到它只在Windows中检查,但我认为它在其他操作系统(Linux,MacOs,Solaris)上工作得很好。

我在同一个目录中有2个.jar文件。我想从一个.jar文件开始另一个.jar文件,它在同一个目录中。

问题是,当您从cmd启动它时,当前目录是system32

Warnings!

  • 在我做过的所有测试中,下面的内容似乎都很有效文件夹名为;][[;'57f2g34g87-8+9-09!2#@!$%^^&()()%&$%^@#的它运作良好。
  • 我使用的ProcessBuilder如下:

?……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//The class from which i called this was the class `Main`
String path = getBasePathForClass(Main.class);
String applicationPath=  new File(path +"application.jar").getAbsolutePath();


System.out.println("Directory Path is :"+applicationPath);

//Your know try catch here
//Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()`
ProcessBuilder builder = new ProcessBuilder("java","-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();

//...code

??getBasePathForClass(Class classs)号:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    /**
     * Returns the absolute path of the current directory in which the given
     * class
     * file is.
     *
     * @param classs
     * @return The absolute path of the current directory in which the class
     *         file is.
     * @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user]
     */

    public static final String getBasePathForClass(Class<?> classs) {

        // Local variables
        File file;
        String basePath ="";
        boolean failed = false;

        // Let's give a first try
        try {
            file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

            if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
                basePath = file.getParent();
            } else {
                basePath = file.getPath();
            }
        } catch (URISyntaxException ex) {
            failed = true;
            Logger.getLogger(classs.getName()).log(Level.WARNING,
                   "Cannot firgue out base path for class with way (1):", ex);
        }

        // The above failed?
        if (failed) {
            try {
                file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                basePath = file.getAbsolutePath();

                // the below is for testing purposes...
                // starts with File.separator?
                // String l = local.replaceFirst("[" + File.separator +
                //"/\\\\]","")
            } catch (URISyntaxException ex) {
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                       "Cannot firgue out base path for class with way (2):", ex);
            }
        }

        // 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 netbeans
        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;
    }


假设您试图在Eclipse、NetBean或独立于命令行运行项目。我有一个方法来解决它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

最好的,


这里的答案对我来说都不管用。以下是工作原理:

1
2
3
java.nio.file.Paths.get(
  getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);

编辑:我的代码中的最终版本:

1
2
3
4
5
6
7
URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation();
java.net.URI myURI = null;
try {
    myURI = myURL.toURI();
} catch (URISyntaxException e1)
{}
return java.nio.file.Paths.get(myURI).toFile().toString()


System.getProperty("java.class.path")


这是当前目录名

1
2
3
String path="/home/prasad/Desktop/folderName";
File folder = new File(path);
String folderName=folder.getAbsoluteFile().getName();

这是当前目录路径

1
String path=folder.getPath();