programing

ClassLoader.getResources()를 올바르게 사용하는 방법

newsource 2022. 9. 27. 23:56

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()로.JarURLConnectionJarURLConnection.getJarFile()과 voila를 사용합니다.JarFile을 가지고 있으며, 그 안에 있는 리소스에 자유롭게 액세스할 수 있습니다.

나머지는 당신에게 맡기겠어요.

이게 도움이 됐으면 좋겠네요!

언급URL : https://stackoverflow.com/questions/5193786/how-to-use-classloader-getresources-correctly