How to read a directory from the runtime classpath?

∥☆過路亽.° 提交于 2019-12-30 05:58:48

问题


My Java application needs to be able to find a myconfig/ directory which will be bundled inside the same JAR:

myjar.jar/
    com/
        me/
            myproject/
                ConfigLoader.java --> looks for myconfig/ directory and its contents
    myconfig/
        conf-1.xml
        conf.properties
        ... etc.

How do I actually go about reading this myconfig/ directory off the runtime classpath? I've done some research and it seems that the normal method of reading a file from the classpath doesn't work for directories:

InputStream stream = ConfigLoader.class.getResourceAsStream("myconfig");

So does anyone know how to read an entire directory from the runtime classpath (as opposed to a single file)? Thanks in advance!

Please note: It is not possible to load the files individually, myconfig is a directory with thousands of properties files inside it.


回答1:


You can use the PathMatchingResourcePatternResolver provided by Spring.

public class SpringResourceLoader {

    public static void main(String[] args) throws IOException {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        // Ant-style path matching
        Resource[] resources = resolver.getResources("/myconfig/**");

        for (Resource resource : resources) {
            InputStream is = resource.getInputStream();
            ...
        }
    }
}

I didn't do anything fancy with the returned Resource but you get the picture.

Add this to your maven dependency (if using maven):

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>



回答2:


You could call ClassLoader.getResource() to find a particular file in the directory (or the directory itself, if getResource() will return directories). getResource() returns a URL pointing to the result. You could then convert this URL into whatever form the other library requires.




回答3:


The trick seems to be that the class loader can find directories in the classpath, while the class can not.

So this works

this.getClass().getClassLoader().getResource("com/example/foo/myconfig");

while this does not

this.getClass().getResource("myconfig");


来源:https://stackoverflow.com/questions/12007012/how-to-read-a-directory-from-the-runtime-classpath

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!