프로젝트의 / resources 폴더에있는 파일의 절대 경로를 얻는 방법


97

표준 maven 설정을 가정합니다.

리소스 폴더에 파일이 있다고 말합니다 abc.

Java에서 파일의 절대 경로를 어떻게 얻을 수 있습니까?


Maven 플러그인을 작성 하시겠습니까? 또는 프로그램이 실행될 때 파일에 액세스 하시겠습니까?
Gyro Gearless 2013-06-27


상황에 따라 솔루션에는 세 가지 변형이 있습니다. stackoverflow.com/a/56327069/715269
Gangnus

답변:


74

ClassLoader.getResource방법을 사용 하여 올바른 리소스를 얻을 수 있습니다 .

URL res = getClass().getClassLoader().getResource("abc.txt");
File file = Paths.get(res.toURI()).toFile();
String absolutePath = file.getAbsolutePath();

또는

이것이 항상 작동하지는 않지만 더 간단한 해결책-

File개체 를 만들고 getAbsolutePath메서드를 사용할 수 있습니다 .

File file = new File("resources/abc.txt");
String absolutePath = file.getAbsolutePath();

8
Maven 루트가되기 위해 작업 디렉토리에 의존하므로 제한된 사용에 대한 조언입니다. 그런 다음에도 target/classes/abc.txtMaven이 처리 후 리소스 파일을 배치하는 표준 위치이므로 파일을 참조하는 데를 사용해야 합니다 (예 : maven-resources 플러그인이 abc.txt에서 속성 대체를 수행했을 수 있음). 클래스 경로에서 getResource ()를 통해 abc.txt를 사용하는 것이 훨씬 좋습니다.
Gyro Gearless

2
최종 사용자가 애플리케이션을 실행 가능한 JAR로 실행하는 경우 어떻게됩니까? 그러면 실제 파일이 전혀 없을 것입니다. 이것이 getResource ()를 사용해야하는 또 다른 이유입니다. 예를 들어, 원하는 작업에 따라 입력 스트림을 엽니 다.
마태 복음 현명한

6
정답으로 제거 할 수 있습니까? @Karol S 아래 답변 - 그 정답 (따라서 upvote에 어긋남)이어야
DanGordon

3
잘못된 답변. @Karol 의해 답변을 아래를 참조하십시오
bhathiya - 페레라

170

실제로 작동하는 올바른 방법 :

URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();

이제 클래스 경로의 파일이 물리적으로 어디에 있는지는 중요하지 않습니다. 리소스가 JAR 항목이 아니라 실제로 파일 인 한 찾을 수 있습니다.

(겉보기에는 new File(resource.getPath())모든 경로에서 작동하지 않습니다! 경로는 여전히 URL 인코딩입니다!)


5
또는 아마도 당신은 할 수 : new File(resource.toURI()).getAbsolutePath();(예 : 난 당신이 경로 객체를 필요가 있다고 생각하지 않는다?)
댄 왕에게

1
toURI ()에 대한 좋은 팁, 이것은 경로에서 % 20으로 나오는 공백을 피합니다!
마태 복음 현명한

29
감사! 이것은 거의 나를 위해 일했습니다. 하지만 한 가지 변경해야했습니다. YourClass.class.getClassLoader (). getResource ( "abc");
yngwietiger 2015 년

new File(YourClass.class.getResource("abc").toURI().getPath())원하는 경우 대안으로 할 수 있습니다.
Mike Rylander

3
나는 이것이 시작 슬래시없이 그렇게 많은 사람들에게 어떻게 작용했는지 이해하지 못한다 :.getResource("/abc")
cahen

28

시작 경로를 지정해야합니다. /

URL resource = YourClass.class.getResource("/abc");
Paths.get(resource.toURI()).toFile();

12

필요한 클래스의 classLoader 인스턴스를 생성하면 파일이나 리소스에 쉽게 액세스 할 수 있습니다. 이제 getPath()해당 클래스의 메소드를 사용하여 경로에 액세스합니다 .

 ClassLoader classLoader = getClass().getClassLoader();
 String path  = classLoader.getResource("chromedriver.exe").getPath();
 System.out.println(path);

1

파일 또는 파일 경로를 반환하려면

URL resource = YourClass.class.getResource("abc");
File file = Paths.get(resource.toURI()).toFile(); // return a file
String filepath = Paths.get(resource.toURI()).toFile().getAbsolutePath();  // return file path

0

절대 경로로가는 길에는 두 가지 문제가 있습니다.

  1. 발견 된 배치는 소스 파일이있는 위치가 아니라 클래스가 저장되는 위치입니다. 그리고 리소스 폴더는 거의 확실하게 프로젝트의 소스 폴더 어딘가에있을 것입니다.
  2. 리소스 검색을위한 동일한 함수는 클래스가 플러그인에서 실행되거나 작업 영역의 패키지에서 직접 실행되는 경우 다르게 작동합니다.

다음 코드는 모든 유용한 경로를 제공합니다.

    URL localPackage = this.getClass().getResource("");
    URL urlLoader = YourClassName.class.getProtectionDomain().getCodeSource().getLocation();
    String localDir = localPackage.getPath();
    String loaderDir = urlLoader.getPath();
    System.out.printf("loaderDir = %s\n localDir = %s\n", loaderDir, localDir);

여기서는 리소스 폴더의 현지화에 사용할 수있는 두 기능을 모두 연구합니다. 의 class경우 정적으로 또는 동적으로 가져올 수 있습니다.


프로젝트가 플러그인에없는 경우 JUnit에서 실행되는 코드는 다음을 인쇄합니다.

loaderDir = /C:.../ws/source.dir/target/test-classes/
 localDir = /C:.../ws/source.dir/target/test-classes/package/

따라서 src / rest / resources로 이동하려면 파일 트리를 위아래로 이동해야합니다. 두 가지 방법을 모두 사용할 수 있습니다. getResource(resourceFolderName)해당 폴더가 대상 폴더에 없기 때문에를 사용할 수 없습니다 . 아무도 만든 폴더에 리소스를 넣지 않습니다.


클래스가 플러그인에있는 패키지에있는 경우 동일한 테스트의 출력은 다음과 같습니다.

loaderDir = /C:.../ws/plugin/bin/
 localDir = /C:.../ws/plugin/bin/package/

따라서 다시 폴더 트리를 위아래로 이동해야합니다.


가장 흥미로운 것은 플러그인에서 패키지가 시작 되는 경우입니다. 예를 들어 JUnit 플러그인 테스트로. 출력은 다음과 같습니다.

loaderDir = /C:.../ws/plugin/
 localDir = /package/

여기서 우리는 함수 의 결과 만 결합하여 절대 경로를 얻을 수 있습니다 . 그리고 그것은 충분하지 않습니다. 그들 사이에 우리는 플러그인 폴더에 상대적으로 클래스 패키지가있는 장소의 로컬 경로를 넣어야합니다. 아마도 src또는 src/test/resource여기에 무언가를 삽입해야 할 것 입니다.

코드를 자신의 코드에 삽입하고 가지고있는 경로를 볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.