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

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

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

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



답변

한 가지 방법은 시스템 속성 을 사용하는 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아무것도 전달되지 않으면 다시 사용할 수 있습니다 .


답변

사용 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()인수 로 전달합니다.


답변

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가 확인하지만 같은 것들을 제거합니다 ../../../


답변

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


답변

방금 사용했습니다.

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

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


답변

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

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


답변

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

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));