Java에서 현재 작업 디렉토리를 얻는 방법은 무엇입니까?


112

내 메인 클래스가 C:\Users\Justian\Documents\. 내 프로그램이 안에 있음을 표시하려면 어떻게해야 C:\Users\Justian\Documents합니까?

하드 코딩은 옵션이 아닙니다. 다른 위치로 옮길 경우 적응할 수 있어야합니다.

폴더에 CSV 파일을 덤프하고 프로그램이 모든 파일을 인식하도록 한 다음 데이터를로드하고 조작하고 싶습니다. 그 폴더로 이동하는 방법을 알고 싶습니다.


1
한 번 봐 가지고 이 기사를 .
Matthew J Morrison

1
메인 클래스가 jar 파일에 있다면 어떨까요? 그러면 어떤 결과를 원하십니까?
Mattias Nilsson

1
어쨌든이 작업을해야하는 이유는 무엇입니까?
Ed S.

1
필요한 것은 CSV 파일이있는 디렉토리이고 .jar 파일이 해당 디렉토리를 참조 할 수 있도록하는 것 같습니다. 그렇다면 내 대답을 참조하십시오.

답변:


149

한 가지 방법은 시스템 속성 을 사용하는 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.

또한 좋은 객체 지향 명령 줄 인수 구문 분석기를 사용하는 것도 중요합니다. Java Simple Argument Parser 인 JSAP를 적극 권장 합니다. 이렇게 System.getProperty("user.dir")하면 동작을 재정의하기 위해 다른 것을 사용 하고 대신 전달할 수 있습니다. 훨씬 더 유지 관리가 가능한 솔루션입니다. 이렇게하면 처리하기 위해 디렉토리를 전달하기가 매우 쉽고, user.dir아무것도 전달되지 않으면 다시 사용할 수 있습니다 .


내가 할 수있을 때 이것을 테스트 할 것입니다. 나는 정말 .JAR 문제에 몰두 해요 : P
Justian 마이어

ANT로 .jar 파일을 빌드하는 방법을 보여주는 .jar 문제에 대한 내 답변의 링크를 방문 했습니까?

시스템 속성에서 현재 작업 디렉토리 절대 경로를 반환하는 Jarrod의 코드는 user.dir사용하기가 훨씬 쉽습니다. System.getProperty ( "user.dir");

74

사용 CodeSource#getLocation(). 이것은 JAR 파일에서도 잘 작동합니다. 당신은 얻을 수 CodeSourceProtectionDomain#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());
    }
}

OP의 의견에 따라 업데이트 :

폴더에 CSV 파일을 덤프하고 프로그램이 모든 파일을 인식하도록 한 다음 데이터를로드하고 조작하고 싶습니다. 그 폴더로 이동하는 방법을 알고 싶습니다.

이를 위해서는 프로그램에서 상대 경로를 하드 코딩 / 알고 있어야합니다. 대신 클래스 경로에 경로를 추가하여 사용할 수 있습니다.ClassLoader#getResource()

File classpathRoot = new File(classLoader.getResource("").getPath());
File[] csvFiles = classpathRoot.listFiles(new FilenameFilter() {
    @Override public boolean accept(File dir, String name) {
        return name.endsWith(".csv");
    }
});

또는 경로를 main()인수 로 전달합니다.


3
+1. 이 작업을 수행하기위한 몇 가지 조건이 있습니다. 가장 중요한 것은 "메인 클래스"가 파일 시스템에서로드된다는 것입니다. 자바에서이 가정이 거짓 인 것은 그리 드문 일이 아닙니다. 그러나 파일 시스템의 JAR에서 클래스를로드하는 것이 확실한 경우 이것이 작동 하는 방법입니다.
erickson

정말 모두 다릅니다. 난 노력하고 컴파일 내 JAR를 얻을 수 있지만, 그 순간에 별도의 문제입니다. 도움이 될 수 있다고 생각되면 stackoverflow.com/questions/3152240/…를 확인하십시오 . 나는 이것을 게시하는 것이 일종의 위반이라고 확신하지만이 문제와 관련이 있습니다. 내가 그것을 고칠 수 있다면 이것이 확실히 내 대답이 될 것입니다.
Justian Meyer 2010-06-30

왜 그것을 하드 코딩해야합니까? 나는 전에도 비슷한 일을했습니다. 내 항아리와 폴더가 항상 유사한 관계 (즉, 동일한 디렉토리)를 갖는다 고 가정합니다. 이것이 사실이라면 항아리의 디렉토리를 얻은 다음 수정하여 폴더를 찾을 수 있습니다.
Justian Meyer 2010-06-30

JAR 파일과 동일한 폴더에 있으면 이미 클래스 경로에있는 것입니다. "하드 코딩"이라는 단어는 약간 과장되어 있습니다. 실제로 "JAR 파일과 관련된 경로를 아는 것"을 의미했습니다.
BalusC 2010 년

1
@Moebius : 응? Java를 처음 사용하십니까? javadoc을 확인하십시오 . getLocation()메소드에 의해 반환 된 그대로 사용하십시오 . 다른 것들은 분명히 작동하지 않을 것입니다.
BalusC 2014 년

31
File currentDirectory = new File(new File(".").getAbsolutePath());
System.out.println(currentDirectory.getCanonicalPath());
System.out.println(currentDirectory.getAbsolutePath());

다음과 같이 인쇄합니다.

/path/to/current/directory
/path/to/current/directory/.

참고 File.getCanonicalPath()발생은 IOException가 확인하지만 같은 것들을 제거합니다 ../../../


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

이것은 단지 "bin"이 아니라 "bin / classes /"에 대한 경로를 반환합니다.
안드로이드 개발자

Intellij Idea를 사용하여 실행중인 응용 프로그램을 디버깅하는 동안 "/C:/Program%20Files/Java/jdk1.8.0_112/ :"가 반환되었습니다.
velocity

5

방금 사용했습니다.

import java.nio.file.Path;
import java.nio.file.Paths;

...

Path workingDirectory=Paths.get(".").toAbsolutePath();

9
당신은 작동하지 않습니다. 이것은 올바른 것입니다Paths.get("").toAbsolutePath();
Kra까지

@ToKra Paths.get("my/file").toAbsolutePath()내가하면 /my/file확실히 cwd가 아닙니다.
abergmeier

1
@abergmeier "내 / 파일"이 아닌 문자열에 ""를 썼습니다.
To Kra

5

현재 작업 디렉토리를 얻으려면 다음 줄을 사용하십시오.

System.out.println(new File("").getAbsolutePath());

4

현재 소스 코드의 절대 경로를 원한다면 내 제안은 다음과 같습니다.

String internalPath = this.getClass().getName().replace(".", File.separator);
String externalPath = System.getProperty("user.dir")+File.separator+"src";
String workDir = externalPath+File.separator+internalPath.substring(0, internalPath.lastIndexOf(File.separator));

IDE에서 실행하거나 인스턴스를 회전하는 데 사용할 때는 작동하지 않습니다.
Sarp Kaya 2015 년

내부 경로는 java \ lang \ Class입니다. 외부 경로는 E : \ BranchProduction1.4.0 \ FilesTestProject \ src입니다. 작업 디렉토리는 E : \ BranchProduction1.4.0 \ FilesTestProject \ src \ java \ lang입니다. 출력을 설명 할 수 있습니까?
JAVA

3

메인 클래스가 로컬 하드 디스크의 파일에 있다고 누가 말했습니까? 클래스는 종종 JAR 파일 내에 번들로 제공되며 때로는 네트워크를 통해로드되거나 심지어는 즉석에서 생성됩니다.

그래서 실제로하고 싶은 것은 무엇입니까? 클래스가 어디에서 왔는지에 대한 가정을하지 않는 방법이있을 것입니다.


폴더에 CSV 파일을 덤프하고 프로그램이 모든 파일을 인식하도록 한 다음 데이터를로드하고 조작하고 싶습니다. 그 폴더로 이동하는 방법을 알고 싶습니다.
Justian 마이어

어쩌면 내가 뭔가를 놓치고 있지만 절대 경로가 작동하는 것 같습니다. 하드 코딩 할 수 없다고 하셨는데, 어떤 폴더로 시작해야하는지 어떻게 알 수 있을까요?
Chris Thompson

문제는 내 컴퓨터뿐만 아니라 다른 컴퓨터로 가져오고 싶다는 것입니다. 경로가 얼마나 하드 코딩되는지는 알 수 없습니다. "항상 내 jar와 폴더가 비슷한 관계 (즉, 동일한 디렉토리에 있음)를 갖는다 고 가정합니다. 이것이 사실이면 jar의 디렉토리를 가져온 다음 수정하여 폴더를 찾을 수 있습니다." 하드 코딩 할 수있는 유일한 방법은 하드 드라이브에서 파일까지의 전체 경로를 포함하지 않아도되는 것입니다. 아마도 3 개의 폴더 만 되돌릴 수 있습니다 (예 : "Documents \ Project \ Dump \ [file / folder]")
Justian Meyer 2010-06-30

당신이 원하는 것은 jar 파일이있는 디렉토리에 대한 핸들을 얻는 것입니다. 이것이 당신의 요구 사항을 충족시킬까요?
Chris Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.