文章目录类加载器获取资源(最基础)Resource获取资源ClassPathResource实现类ResourceLoader获取资源PathMatchingResourcePatternResolver实现类ResourceLoader注入式写法new File()时的错误场景Resource读取文本拿到了Resource也就拿到了inputstream资源加载看似简单实际有些坑需要整理下。资源加载不只一种方式。看情况用哪一种即可。类加载器获取资源(最基础)不加左斜杠表示从根路径加载推荐InputStreamisthis.getClass().getClassLoader().getResourceAsStream(config.properties);加了左斜杠表示从当前类路径加载那么文件要这个类同一目录不推荐InputStreamis2this.getClass().getResourceAsStream(/config.properties);Resource获取资源Resource是一个接口最常用的实现类就是ClassPathResource。ClassPathResource实现类ClassPathResource的定义很明确获取类路径文件。ResourceresourcenewClassPathResource(config.properties);ResourceLoader获取资源ResourceLoader也是一个接口最常用的实现类是PathMatchingResourcePatternResolver。ResourceLoader最大的好处1、支持批量单个用getResource()批量用getResources()。2、切换资源来源(类路径、文件系统、网络资源)classpath:# 类路径file:# 文件系统PathMatchingResourcePatternResolver实现类PathMatchingResourcePatternResolverresolvernewPathMatchingResourcePatternResolver();支持批量Resourceresourceresolver.getResource(classpath:config.properties);// 单个Resource[]resourcesresolver.getResources(classpath:config/*.properties);// 批量灵活切换资源来源ResourceclassResresolver.getResource(classpath:config.properties);// 类路径ResourcefileResresolver.getResource(file:/data/config.properties);// 文件路径ResourceLoader注入式写法spring框架中可以直接注入使用因为默认的实现就是PathMatchingResourcePatternResolver。AutowiredprivateResourceLoaderresourceLoader;publicvoidloadConfig(){ResourceresourceresourceLoader.getResource(classpath:config.properties);}new File()时的错误场景这种写法绝对禁止尤其是在获取resources下文件时。newFile(src/main/resources/config.properties);原因src/main/resources这个路径打包后会消失src/main/java路径也会消失。你看打包后的jarBOOT-INF/classes下就是com# com文件夹在idea编辑器中是src/main/java/comappliation.yaml# 配置文件在idea编辑器中是src/main/resources/application.yamlResource读取文本publicStringimportNovelsToEs(){log.info(开始导入所有金庸小说到ES并进行文本划块);inttotalChunks0;try{// 1. 获取 resources/novels/ 目录下的所有文件PathMatchingResourcePatternResolverresolvernewPathMatchingResourcePatternResolver(resourceLoader);// 4. 使用 resolver 的 getResources 方法注意使用 classpath*: 确保扫描所有资源Resource[]resourcesresolver.getResources(classpath*:/novels/*.txt);for(Resourceresource:resources){StringfileNameresource.getFilename();if(fileNamenull)continue;StringbookNamefileName.replace(.txt,);log.info(正在处理小说{} ,bookName);// 2. 读取文件内容StringcontentreadFileContent(resource);if(contentnull||content.isEmpty()){log.warn(小说《{}》内容为空跳过,bookName);continue;}// 3. 执行文本划块并保存intchunksprocessAndSaveChunks(bookName,content);totalChunkschunks;log.info(小说《{}》处理完毕生成 {} 个文本块,bookName,chunks);}}catch(IOExceptione){log.error(扫描小说文件目录时发生异常,e);return导入失败: e.getMessage();}StringresultString.format(所有小说导入完成共导入 %d 个文本块,totalChunks);log.info(result);returnresult;}拿到了Resource也就拿到了inputstream一步式写法InputStreamisthis.getClass().getClassLoader().getResourceAsStream(config.properties);分开写this.getClass().getClassLoader().getResource(config.properties).openStream();或者URLresourcethis.getClass().getClassLoader().getResource(config.properties);InputStreaminputStreamresource.openStream();
classLoader、resource资源加载、类路径
发布时间:2026/6/17 10:45:06
文章目录类加载器获取资源(最基础)Resource获取资源ClassPathResource实现类ResourceLoader获取资源PathMatchingResourcePatternResolver实现类ResourceLoader注入式写法new File()时的错误场景Resource读取文本拿到了Resource也就拿到了inputstream资源加载看似简单实际有些坑需要整理下。资源加载不只一种方式。看情况用哪一种即可。类加载器获取资源(最基础)不加左斜杠表示从根路径加载推荐InputStreamisthis.getClass().getClassLoader().getResourceAsStream(config.properties);加了左斜杠表示从当前类路径加载那么文件要这个类同一目录不推荐InputStreamis2this.getClass().getResourceAsStream(/config.properties);Resource获取资源Resource是一个接口最常用的实现类就是ClassPathResource。ClassPathResource实现类ClassPathResource的定义很明确获取类路径文件。ResourceresourcenewClassPathResource(config.properties);ResourceLoader获取资源ResourceLoader也是一个接口最常用的实现类是PathMatchingResourcePatternResolver。ResourceLoader最大的好处1、支持批量单个用getResource()批量用getResources()。2、切换资源来源(类路径、文件系统、网络资源)classpath:# 类路径file:# 文件系统PathMatchingResourcePatternResolver实现类PathMatchingResourcePatternResolverresolvernewPathMatchingResourcePatternResolver();支持批量Resourceresourceresolver.getResource(classpath:config.properties);// 单个Resource[]resourcesresolver.getResources(classpath:config/*.properties);// 批量灵活切换资源来源ResourceclassResresolver.getResource(classpath:config.properties);// 类路径ResourcefileResresolver.getResource(file:/data/config.properties);// 文件路径ResourceLoader注入式写法spring框架中可以直接注入使用因为默认的实现就是PathMatchingResourcePatternResolver。AutowiredprivateResourceLoaderresourceLoader;publicvoidloadConfig(){ResourceresourceresourceLoader.getResource(classpath:config.properties);}new File()时的错误场景这种写法绝对禁止尤其是在获取resources下文件时。newFile(src/main/resources/config.properties);原因src/main/resources这个路径打包后会消失src/main/java路径也会消失。你看打包后的jarBOOT-INF/classes下就是com# com文件夹在idea编辑器中是src/main/java/comappliation.yaml# 配置文件在idea编辑器中是src/main/resources/application.yamlResource读取文本publicStringimportNovelsToEs(){log.info(开始导入所有金庸小说到ES并进行文本划块);inttotalChunks0;try{// 1. 获取 resources/novels/ 目录下的所有文件PathMatchingResourcePatternResolverresolvernewPathMatchingResourcePatternResolver(resourceLoader);// 4. 使用 resolver 的 getResources 方法注意使用 classpath*: 确保扫描所有资源Resource[]resourcesresolver.getResources(classpath*:/novels/*.txt);for(Resourceresource:resources){StringfileNameresource.getFilename();if(fileNamenull)continue;StringbookNamefileName.replace(.txt,);log.info(正在处理小说{} ,bookName);// 2. 读取文件内容StringcontentreadFileContent(resource);if(contentnull||content.isEmpty()){log.warn(小说《{}》内容为空跳过,bookName);continue;}// 3. 执行文本划块并保存intchunksprocessAndSaveChunks(bookName,content);totalChunkschunks;log.info(小说《{}》处理完毕生成 {} 个文本块,bookName,chunks);}}catch(IOExceptione){log.error(扫描小说文件目录时发生异常,e);return导入失败: e.getMessage();}StringresultString.format(所有小说导入完成共导入 %d 个文本块,totalChunks);log.info(result);returnresult;}拿到了Resource也就拿到了inputstream一步式写法InputStreamisthis.getClass().getClassLoader().getResourceAsStream(config.properties);分开写this.getClass().getClassLoader().getResource(config.properties).openStream();或者URLresourcethis.getClass().getClassLoader().getResource(config.properties);InputStreaminputStreamresource.openStream();