Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从运行时类路径读取目录?_Java_Classpath - Fatal编程技术网

Java 如何从运行时类路径读取目录?

Java 如何从运行时类路径读取目录?,java,classpath,Java,Classpath,我的Java应用程序需要能够找到一个myconfig/目录,该目录将捆绑在同一个JAR中: myjar.jar/ com/ me/ myproject/ ConfigLoader.java --> looks for myconfig/ directory and its contents myconfig/ conf-1.xml conf.properties

我的Java应用程序需要能够找到一个
myconfig/
目录,该目录将捆绑在同一个JAR中:

myjar.jar/
    com/
        me/
            myproject/
                ConfigLoader.java --> looks for myconfig/ directory and its contents
    myconfig/
        conf-1.xml
        conf.properties
        ... etc.
我如何真正开始阅读运行时类路径下的
myconfig/
目录?我做了一些研究,似乎从类路径读取文件的常规方法对目录不起作用:

InputStream stream = ConfigLoader.class.getResourceAsStream("myconfig");
那么,是否有人知道如何从运行时类路径读取整个目录(而不是单个文件)?提前谢谢


请注意:无法单独加载文件,
myconfig
是一个包含数千个属性文件的目录。

您可以使用Spring提供的
PathMatchingResourcePatternResolver

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();
            ...
        }
    }
}
我没有对返回的
资源做任何花哨的事情,但是你明白了

将此添加到maven依赖项(如果使用maven):


org.springframework
弹簧芯
3.1.2.1发布

您可以调用
ClassLoader.getResource()
来查找目录中的特定文件(或者目录本身,如果
getResource()
将返回目录)
getResource()
返回指向结果的URL。然后,您可以将此URL转换为其他库所需的任何形式。

技巧似乎是类装入器可以在类路径中找到目录,而类不能

所以这是有效的

this.getClass().getClassLoader().getResource("com/example/foo/myconfig");
而这并不是

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

为了解释这个问题,我想把它简化。google上有一个名为
langdetect
的库。该库附带一个
profiles
目录,用于将每个语言属性文件加载到运行时类路径中。在运行时,您需要调用
DetectFactory.loadProfile(String)
方法来初始化
profiles/
目录。所以这个目录需要在类路径上。当我传递一个abs文件路径时,我可以让它工作,但最终需要将它打包到同一个JAR中。因此,最终,我只需要传递
DetectFactory.loadProfiles
一个字符串,该字符串将它指向同一JAR中的
profiles
目录。因此,尽管我的示例显示了
myconfig
目录,但它实际上是
配置文件。当它显示
ConfigLoader
时,它实际上是
DetectFactory
getResource()
方法实际上返回目录。
this.getClass().getResource("myconfig");