本文分享几种读取classpath(maven项目即resources下面的文件)下properties文件的方式,其他类型的文件也可以转为InputStream使用

直接上代码:

public class ClassPathTest {

    public static void main(String[] args) throws IOException {
        // resources目录下创建web.properties文件

        // 1、获取classpath根目录下的web.properties,读取properties文件最简单的方式
        ResourceBundle properties = ResourceBundle.getBundle("web");
        for(String key : properties.keySet()) {
            System.out.println(key+"="+properties.getString(key));
        }

        // 2、使用ClassPathResource
        URL classPathUrl =  new ClassPathResource("/web.properties").getURL();
        UrlResource classPathResource = new UrlResource(classPathUrl);
        Properties classPathProperties = PropertiesLoaderUtils.loadProperties(classPathResource);
        classPathProperties.forEach((key,value) ->
                System.out.println(key+"="+value)
        );

        // 3、使用Class.getResource,路径支持绝对路径和相对路径
        URL classUrl = ClassPathResource.class.getResource("/web.properties");
        // 还支持获取InputStream流
        InputStream classInputStream = ClassPathResource.class.getResourceAsStream("/web.properties");
        UrlResource classResource = new UrlResource(classUrl);
        Properties classProperties = PropertiesLoaderUtils.loadProperties(classResource);
        classProperties.forEach((key,value) ->
                System.out.println(key+"="+value)
        );

        // 4、使用ClassLoader().getResource,路径最前面不能写/,默认从根目录开始读取
        URL classLoaderUrl = ClassPathResource.class.getClassLoader().getResource("web.properties");
        // 还支持获取InputStream流
        InputStream classLoaderInputStream = ClassPathTest.class.getClassLoader().
                getResourceAsStream("web.properties");
        UrlResource classLoaderResource = new UrlResource(classLoaderUrl);
        Properties classLoaderProperties = PropertiesLoaderUtils.loadProperties(classLoaderResource);
        classLoaderProperties.forEach((key,value) ->
                System.out.println(key+"="+value)
        );

        // 5、读取所有jar包下存在某个资源的
        // 读取所有jar和当前项目下classpath下存在该路径的资源的URL,springboot自动装配就是这样写的
        Enumeration<URL> urls = ClassPathResource.class.getClassLoader().getResources("META-INF/spring.factories");
        while (urls.hasMoreElements()) {
            UrlResource resource = new UrlResource(urls.nextElement());
            Properties resourcesProperties = PropertiesLoaderUtils.loadProperties(resource);
            resourcesProperties.forEach((key,value) ->
                    System.out.println(key+"="+value)
            );
        }

        // 6、基于spring ResourceUtils工具类
        URL resourceUtilsUrl = ResourceUtils.getURL("classpath:web.properties");
        UrlResource resourceUtilsResource = new UrlResource(resourceUtilsUrl);
        Properties resourceUtilsProperties = PropertiesLoaderUtils.loadProperties(resourceUtilsResource);
        resourceUtilsProperties.forEach((key,value) ->
                System.out.println(key+"="+value)
        );

    }
}

另外,不要在springboot项目下获取File对象,因为当springboot使用jar的形式启动后,File对象不能读取到jar包里面的文件,所以使用时会报错,需要转换为资源文件的方式,或者流。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐