표준 maven 설정을 가정합니다.
리소스 폴더에 파일이 있다고 말합니다 abc
.
Java에서 파일의 절대 경로를 어떻게 얻을 수 있습니까?
표준 maven 설정을 가정합니다.
리소스 폴더에 파일이 있다고 말합니다 abc
.
Java에서 파일의 절대 경로를 어떻게 얻을 수 있습니까?
답변:
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();
target/classes/abc.txt
Maven이 처리 후 리소스 파일을 배치하는 표준 위치이므로 파일을 참조하는 데를 사용해야 합니다 (예 : maven-resources 플러그인이 abc.txt에서 속성 대체를 수행했을 수 있음). 클래스 경로에서 getResource ()를 통해 abc.txt를 사용하는 것이 훨씬 좋습니다.
실제로 작동하는 올바른 방법 :
URL resource = YourClass.class.getResource("abc");
Paths.get(resource.toURI()).toFile();
이제 클래스 경로의 파일이 물리적으로 어디에 있는지는 중요하지 않습니다. 리소스가 JAR 항목이 아니라 실제로 파일 인 한 찾을 수 있습니다.
(겉보기에는 new File(resource.getPath())
모든 경로에서 작동하지 않습니다! 경로는 여전히 URL 인코딩입니다!)
new File(resource.toURI()).getAbsolutePath();
(예 : 난 당신이 경로 객체를 필요가 있다고 생각하지 않는다?)
new File(YourClass.class.getResource("abc").toURI().getPath())
원하는 경우 대안으로 할 수 있습니다.
.getResource("/abc")
파일 또는 파일 경로를 반환하려면
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
절대 경로로가는 길에는 두 가지 문제가 있습니다.
다음 코드는 모든 유용한 경로를 제공합니다.
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
여기에 무언가를 삽입해야 할 것 입니다.
코드를 자신의 코드에 삽입하고 가지고있는 경로를 볼 수 있습니다.