2010-05-26 4 views

답변

11

이 경우 CodeSource#getLocation()을 사용할 수 있습니다. CodeSourceProtectionDomain#getCodeSource()입니다. ProtectionDomainClass#getProtectionDomain()에 의해 이용 가능합니다.

URL location = getClass().getProtectionDomain().getCodeSource().getLocation(); 
File file = new File(location.getPath()); 
// ... 

문제의 Class의 정확한 위치를 반환합니다.

업데이트 : 의견에 따르면, 이미 클래스 경로에 있습니다. 그런 다음 루트 패키지 상대 경로를 전달하는 ClassLoader#getResource()을 사용할 수 있습니다.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
URL resource = classLoader.getResource("filename.ext"); 
File file = new File(resource.getPath()); 
// ... 

당신은 그것은 InputStreamClassLoader#getResourceAsStream()을 사용으로 얻을 수 있습니다.

InputStream input = classLoader.getResourceAsStream("filename.ext"); 
// ... 

또한 패키지 된 리소스를 사용하는 일반적인 방법이기도합니다. 패키지 내에있는 경우 대신 com/example/filename.ext을 사용하십시오. 현재 실행중인 프로그램의 "작업 디렉토리"를 얻으려면

+1

+1,하지만주의 P rotectionDomain.getCodeSource() 및 CodeSource.getLocation()은 둘 다 null 일 수 있습니다. –

+0

@bkail : 제대로 개발되지 않은 자체적 인 클래스 로더를 사용하여로드되거나 일부 외부 스트림 소스 등에서로드 될 때 실제로 null을 반환 할 수 있습니다. 그러나 이는 일반적으로 '기본'Java 프로그램에 적용되지 않습니다. '. – BalusC

+0

이것은 확실히 할 일을하지만,별로 좋지 않습니다. 내가해야 할 일은 내 jar와 같은 폴더에 있어야하지만 어느 위치에서나 실행할 수있는 구성 파일을로드하는 것입니다. 이것이 파일 위치 정보를 얻는 올바른 방법입니까? – markovuksanovic

-1

, 그럼 그냥 사용 : 나이 들어

new File(""); 
+2

작업 디렉토리는 프로그램이있는 곳이 아니어도됩니다. – Douglas