ClassLoader.getResources()를 올바르게 사용하는 방법
사용방법ClassLoader.getResources()
재귀적인 자원을 찾을 수 있을까?
예.
의 모든 리소스 검색
META-INF
"디렉토리":상상해보라든가getClass().getClassLoader().getResources("META-INF")
안타깝게도 이 작업은 다음 명령어만 취득합니다.
URL
정확히 이 "디렉토리"에 도달합니다.명명된 모든 리소스
bla.xml
(부정하게)getClass().getClassLoader().getResources("bla.xml")
그러나 이것은 빈칸을 반환합니다.
Enumeration
.
그리고 보너스 질문으로:어떻게요?ClassLoader.getResources()
와 다르다ClassLoader.getResource()
?
Spring Framework에는 클래스 경로를 재귀적으로 검색할 수 있는 클래스는 다음과 같습니다.
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
resolver.getResources("classpath*:some/package/name/**/*.xml");
클래스 패스를 재귀적으로 검색하는 방법은 없습니다.이 방법으로 리소스를 검색하려면 리소스의 전체 경로 이름을 알아야 합니다.리소스는 파일 시스템의 디렉토리 또는 jar 파일에 있을 수 있으므로 "classpath" 디렉토리 목록을 수행하는 것만큼 간단하지 않습니다.리소스의 전체 경로(예: '/com/mypath/bla.xml')를 제공해야 합니다.
두 번째 질문의 경우 getResource는 지정된 리소스 이름과 일치하는 첫 번째 리소스를 반환합니다.클래스 경로가 검색되는 순서는 getResource의 javadoc에서 지정됩니다.
이것은 특정 URL 개체가 가리키는 파일 개체를 가져오는 가장 간단한 와트입니다.
File file=new File(url.toURI());
이제 구체적인 질문을 드리겠습니다.
- META-INF "디렉토리"에서 모든 리소스를 찾습니다.
이 URL을 가리키는 파일 개체를 실제로 얻을 수 있습니다.
Enumeration<URL> en=getClass().getClassLoader().getResources("META-INF");
if (en.hasMoreElements()) {
URL metaInf=en.nextElement();
File fileMetaInf=new File(metaInf.toURI());
File[] files=fileMetaInf.listFiles();
//or
String[] filenames=fileMetaInf.list();
}
- bla.xml이라는 이름의 모든 리소스(단순히)
이 경우 몇 가지 사용자 지정 코드를 수행해야 합니다.다음으로 더미의 예를 제시하겠습니다.
final List<File> foundFiles=new ArrayList<File>();
FileFilter customFilter=new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()) {
pathname.listFiles(this);
}
if(pathname.getName().endsWith("bla.xml")) {
foundFiles.add(pathname);
return true;
}
return false;
}
};
//rootFolder here represents a File Object pointing the root forlder of your search
rootFolder.listFiles(customFilter);
코드가 실행되면 검색된 모든 차이를 다음 사이트에서 얻을 수 있습니다.foundFiles
목록.
다음은 bestss의 답변을 바탕으로 한 코드입니다.
Enumeration<URL> en = getClass().getClassLoader().getResources(
"META-INF");
List<String> profiles = new ArrayList<>();
while (en.hasMoreElements()) {
URL url = en.nextElement();
JarURLConnection urlcon = (JarURLConnection) (url.openConnection());
try (JarFile jar = urlcon.getJarFile();) {
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
String entry = entries.nextElement().getName();
System.out.println(entry);
}
}
}
MRalwasser, 내가 힌트를 하나 줄게.URL.getConnection()
로.JarURLConnection
JarURLConnection.getJarFile()과 voila를 사용합니다.JarFile을 가지고 있으며, 그 안에 있는 리소스에 자유롭게 액세스할 수 있습니다.
나머지는 당신에게 맡기겠어요.
이게 도움이 됐으면 좋겠네요!
언급URL : https://stackoverflow.com/questions/5193786/how-to-use-classloader-getresources-correctly
'programing' 카테고리의 다른 글
Keras, 각 레이어의 출력을 취득하려면 어떻게 해야 합니까? (0) | 2022.09.27 |
---|---|
Larabel 5의 스위치(블레이드) (0) | 2022.09.27 |
HTML과 Java를 효율적으로 해석하려면 어떻게 해야 하나요? (0) | 2022.09.27 |
@Query in Hibernate를 사용한 파라미터 네이티브 쿼리 (0) | 2022.09.27 |
Python virtualenv를 종료/종료/비활성화하는 방법 (0) | 2022.09.27 |