클래스 로더는로드 된 클래스 경로에서 리소스를 얻는 두 가지 방법을 제공합니다.
공개 URL getResource (문자열 이름); public inputStream getResourCeasStream (문자열 이름);
여기에서 이름은 "/"루트 경로와 관련된 자원의 클래스 경로입니다. getResource는 리소스를 찾기 위해 URL 객체를 가져옵니다. GetResourCeasStream은 리소스 입력 스트림에 대한 참조를 가져와 프로그램이 올바른 위치에서 데이터를 추출 할 수 있도록합니다.
그러나 우리가 실제로 사용하는 것은 클래스 로더 메소드가 아니라 클래스 객체를 클래스 (예 : yourclass.class 또는 yourclass.getClass ())에서 얻을 수 있기 때문에 클래스의 getResource 및 getResourceAsStream 메소드는 클래스 객체를 얻을 수 있으며 클래스 로더는 Class.getClassLoader () 메소드를 다시 호출해야합니다. 그러나 JDK 문서에 따르면, 클래스 객체 의이 두 가지 방법은 실제로로드하는 클래스 로더에 "위임"이므로 클래스 객체 의이 두 가지 메소드 만 사용하면됩니다.
따라서 스트림을 얻으려면 getclass (). getResourCeasStream (String Name)을 직접 호출하고 정적 메소드에서 classLoader.getSystemResourceasstream (문자열 이름)을 사용하십시오.
다음은 ClassPath와 현재 클래스의 절대 경로를 얻는 몇 가지 방법입니다. 필요한 자원에 대한 절대 경로를 얻으려면 이러한 방법 중 일부를 사용해야 할 수도 있습니다.
1. this.getClass (). getResource ( "")
당신이 얻는 것은 현재 클래스 파일의 URI 디렉토리입니다. 자신을 포함하지 않습니다!
예를 들면 :/d :/workspace/jbpmtest3/bin/com/test/
2. this.getClass (). getResource ( "/")
당신이 얻는 것은 현재 classpath의 절대 URI 경로입니다.
예를 들면 :/d :/workspace/jbpmtest3/bin/
3. this.getClass () .getClassLoader (). getResource ( "")
당신이 얻는 것은 또한 현재 classPath의 절대 URI 경로입니다.
예를 들면 :/d :/workspace/jbpmtest3/bin/
4.ClassLoader.getSystemResource ( "")
당신이 얻는 것은 또한 현재 classPath의 절대 URI 경로입니다.
예를 들면 :/d :/workspace/jbpmtest3/bin/
5.thread.currentthread (). getContextClassLoader (). getResource ( "")
당신이 얻는 것은 또한 현재 classPath의 절대 URI 경로입니다.
예를 들면 :/d :/workspace/jbpmtest3/bin/
6.servletactionContext.getServletContext (). getRealPath ( "/")
웹 응용 프로그램에서 웹 응용 프로그램의 루트 디렉토리로의 절대 경로를 가져옵니다. 이런 식으로, 우리는 리소스를 찾기위한 절대적인 경로를 구축하기 위해 웹 응용 프로그램의 루트 디렉토리와 관련된 경로 만 제공하면됩니다.
예 : 파일 : /d:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/webproject
메모:
1. System.GetProperty ( "user.dir") 현재 사용자 디렉토리와 관련하여 상대 경로를 사용하지 마십시오. 이것은 언제든지 당신을 죽일 수있는 시한 폭탄입니다.
2. URI 형태의 절대 경로 자원을 사용하십시오. URI, URL, 파일 개체로 쉽게 변환 할 수 있습니다.
3. 상대 클래스 경로를 사용하십시오. 절대 경로를 사용하지 마십시오. 위의 ClassLoaderUtil 클래스의 공개 정적 URL getextendResource (String eLativePath) 메소드를 사용하면 클래스 경로에 대한 상대 경로를 사용하여 모든 위치에서 이미 리소스를 찾을 수 있습니다.
4. 절대적으로 하드 코딩 된 절대 경로를 사용하지 않습니다. 왜냐하면 우리는 클래스 로더 클래스의 getResource ( "") 메소드를 사용하여 현재 클래스 경로의 절대 경로를 얻을 수 있습니다. 절대 경로를 지정 해야하는 경우 구성 파일을 사용하는 것보다 하드 코딩보다 훨씬 낫습니다!
ClassPath 외부의 길을 얻는 방법 :
url base = this.getClass (). getResource ( ""); // 먼저/home/popeye/testjava/build/classment/net/와 같은이 클래스의 위치를 얻습니다.
문자열 path = 새 파일 (base.getFile (), "…/…/…/…/…/”+name) .getCanonicalPath (); // 당신은/집/popeye/testjava/name을 얻을 수 있습니다
또한 ANT에서 프로그램을 시작하면 this.getClass (). getResource에서 검색된 것이 매우 이상하며 Java 명령 줄로 성공적으로 디버깅 할 수 있습니다.
Java에서 Classpath ClassPath를 얻는 방법을 살펴 보겠습니다.
나는 더 많은 것을 말 했으므로 키 코드를 직접 게시하겠습니다. 특정 코드는 다음과 같습니다.
<span style = "font-size : 18px;"> system.out.println ( "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); String Path = System.getProperty ( "java.class.path"); String Path2 = FreemarkerWriter.class.getProtectionDomain (). getCodeSource (). getLocation (). getPath (); String Path3 = FreemarkerWriter.class.getProtectionDomain (). getCodeSource (). getLocation (). getFile (); String Path4 = Thread.CurrentThread (). getContextClassLoader (). getResource ( ""). getPath (); system.out.println ( "Path 1 =" + Path); System.out.println ( "Path 2 =" + Path2); System.out.out.println ( "Path 3 =" + Path3); System.out.println (Path 4 = "Path 4 =" +. Path4); System.out.println ( "++++++++++++++++++++++++++++++"); </span>
위는 편집자가 소개 한 Java에서 ClassPath ClassPath를 얻는 방법의 간단한 코드입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요. 편집자는 제 시간에 당신에게 답장 할 것입니다!