In Java, we can use System.getProperty("user.dir") to get the current working directory, the directory from where your program was launched.
String dir = System.getProperty("user.dir");
// directory from where the program was launched
// e.g /home/favtuts/projects/core-java/java-io
System.out.println(dir);
One of the good things about this system property user.dir is we can easily override the system property via a -D argument, for example:
java -Duser.dir=/home/favtuts/ -jar abc.jar
1. Working Directory
The below program shows different ways like File, Paths, FileSystems, or system property to get the current working directory; all methods will return the same result.
CurrentWorkingDirectory.java
package com.favtuts.io.howto;
import java.io.File;
import java.nio.file.FileSystems;
import java.nio.file.Paths;
public class CurrentWorkingDirectory {
public static void main(String[] args) {
//printCurrentWorkingDirectory1();
//printCurrentWorkingDirectory2();
//printCurrentWorkingDirectory3();
printCurrentWorkingDirectory4();
}
// System.Property
private static void printCurrentWorkingDirectory1() {
String userDirectory = System.getProperty("user.dir");
System.out.println(userDirectory);
}
// Path, Java 7
private static void printCurrentWorkingDirectory2() {
String userDirectory = Paths.get("")
.toAbsolutePath()
.toString();
System.out.println(userDirectory);
}
// File("")
private static void printCurrentWorkingDirectory3() {
String userDirectory = new File("").getAbsolutePath();
System.out.println(userDirectory);
}
// FileSystems
private static void printCurrentWorkingDirectory4() {
String userDirectory = FileSystems.getDefault()
.getPath("")
.toAbsolutePath()
.toString();
System.out.println(userDirectory);
}
}
Output
/home/favtuts/projects/core-java/java-io
/home/favtuts/projects/core-java/java-io
/home/favtuts/projects/core-java/java-io
/home/favtuts/projects/core-java/java-io
Normally, we use the System.getProperty("user.dir") to get the current working directory.
2. Working Directory for JAR file?
Do not use System.getProperty("user.dir"), File or Path to access a file that is inside a JAR file, it is not going to work. Instead, we should use getClassLoader().getResourceAsStream().
// get a file from the resources folder, root of classpath in JAR
private InputStream getFileFromResourceAsStream(String fileName) {
// The class loader that loaded the class
ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream(fileName);
// the stream holding the file content
if (inputStream == null) {
throw new IllegalArgumentException("file not found! " + fileName);
} else {
return inputStream;
}
}
Note
The above code is extracted from this Read a file from resources folder. Refer to example 2 for accessing a file that is inside a JAR file.
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-io/howto