通过classLoader批量读取文件(文件夹)遇到的问题

通过自定义ClassLoader加载任意文件夹下的Java类 如何加载任意文件夹下的Java对象?如何使用不同工程下的Java对象? 文章目录预备知识实现步骤代码参考 预备知识 我们知道,在Java中,类的加载过程可以简单的分为三个阶段:加载、连接、初始化。 其中,在加载阶段,虚拟机需要完成以下三件事情(也就是自定义的ClassLoader需要完成的内容): 通过一个类的全限定名(包名+类名)来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构... 阅读详情
前言
适用springboot 简单搭建了一个小环境,通过classLoader获取classpath下的文件夹中的文件,批量获取文件,也许你不知道有多少文件和文件的名称,基于这个情况下总结了一些经验教训
环境
  1. resource下创建文件夹在这里插入图片描述
    这里创建了2个文件,a 和b , 如果我们确定知道文件名称 就好办了 通过classLoader.getResourceAsStream() 即可获取, 假设我们不知道文件名称和数量

  2. 编写测试类

    错误代码示范\color{red}{错误代码示范}错误代码示范

         // 获取class 根目录
        URL resource = FileJar.class.getClassLoader().getResource("my/file");
        System.out.println(resource.getPath());
        //        获取my/file 下的所有文件
        File[] files = new File(resource.getPath()).listFiles();
        if (files != null) {
        Arrays.stream(files).forEach(e -> System.out.println("file path = " + e.getAbsolutePath()));
    
        }
    

    输出

       /F:/workSpaces/idea/springboot-test/file-jar/target/classes/my/file
    file path = F:\workSpaces\idea\springboot-test\file-jar\target\classes\my\file\a.txt
    file path = F:\workSpaces\idea\springboot-test\file-jar\target\classes\my\file\b.txt
    
    

** 看似没问题,但是打包为jar后输出
file:/F:/workSpaces/idea/springboot-test/file-jar/target/file-jar-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/my/file
是一个压缩文件 jar路径, file 是读取不了的**

正确方式
   Enumeration<URL> resources = FileJar.class.getClassLoader().getResources("my/file");
        while (resources.hasMoreElements()) {
            URL url = resources.nextElement();
            // 通过判断协议是不是jar文件
            if (url.getProtocol().equals("jar")) {
                JarURLConnection urlConnection = (JarURLConnection) url.openConnection();
                JarFile jarFile = urlConnection.getJarFile();
                Enumeration<JarEntry> entries = jarFile.entries(); // 返回jar中所有的文件目录
                while (entries.hasMoreElements()) {
                    JarEntry jarEntry = entries.nextElement();
                    if (!jarEntry.isDirectory() && jarEntry.getName().startsWith("my/file")) {  // 是我们需要的文件类型
                        String name = jarEntry.getName();
                        System.out.println("name  = " + name);
                        InputStream resourceAsStream = FileJar.class.getClassLoader().getResourceAsStream(name);
                        Properties p = new Properties();
                        p.load(resourceAsStream);
                        System.out.println(p);
                    }
                }
            } else if (url.getProtocol().equals("file")) {
                // 获取class 根目录
                URL resource = FileJar.class.getClassLoader().getResource("my/file");
                System.out.println(resource.getPath());
                // 获取my/file 下的所有文件
                File[] files = new File(resource.getPath()).listFiles();
                if (files != null) {
                    Arrays.stream(files).forEach(e -> System.out.println("file path = " + e.getAbsolutePath()));
                }
            }
        }
通过jarFile 来获取jar包中的文件, 如果有其他jar包和你的文件夹命名相同可以添加 url条件进行判断

知识点

ClassLoader.getResource(String name);

ClassLoader.getResource("");  // 获取的是项目根目录,也就是到classes/这一层

ClassLoader.getResources(String name);

ClassLoader.getResources("my/file/a.properties"); // 加载多个jar文件中的 my/file/a.properties 文件, springboot的spring.factories 就是这么加载的

ClassLoader.getResourceAsStream(String name);
springboot项目读取 resources 目录下的文件的9种方式 案例: 模拟springboot 装配bean。 阅读详情

相关推荐

三维重建之条纹投影结构光(三)——相高模型标定

接上面两文: 三维重建之条纹投影结构光(一)https://blog.youkuaiyun.com/beyond951/article/details/123361852?spm=1001.2014.3001.5501三维重建之条纹投影结构光(二)——四步相移+三频外差法https://blog.youkuaiyun.com/beyond951/article/details/123769596?spm=1001.2014.3001.5501接下来对相高模型进行标定,其推导过程如下图所示 ...

beyond951的博客 4875

JAVA--word等文件转PDF工具类

word转PDF

sinat_36279113的博客 1391

手把手教你用ECharts打造炫酷3D饼图(附完整源码)

本文详细介绍了如何使用ECharts创建炫酷的3D饼图,从环境配置到完整源码实现,涵盖参数解析、视觉优化和交互增强技巧。通过实战案例,帮助开发者快速掌握3D数据可视化技术,提升数据展示效果。

weixin_29031057的博客 279

如何读取resources文件夹下的配置文件?

假如我想要获取resources下的bean.properties文件,properties是以key,value形式存储,以下为文件内容。 读取一般有两种读取: 1、根据相对路径直接读取 InputStream inputStream = new FileInputStream("src/main/resources/bean.properties"); Properties properties = new Properties(); properties.load(inputStream); Enu

怪咖@的博客 6865

MS1030超声波流量计电路实战:如何用15ps精度优化水表设计(附配置代码)

本文深入探讨了如何利用MS1030超声波流量计芯片实现15ps高精度测量,以优化水表设计。文章从系统误差分配出发,详细解析了硬件电路设计要点、SPI通信配置及核心优化技巧,如利用可编程偏置电压和8回波累加功能来提升抗干扰能力与测量稳定性,并附有实用的配置代码示例。

svm4gardener的博客 330

易灵思Ti60F100 FPGA的HyperRAM实战:从硬件连接到Native接口时序调试

本文详细介绍了易灵思Ti60F100 FPGA内置HyperRAM控制器的实战应用。文章从硬件设计要点(如400MHz+信号完整性、等长匹配)切入,重点解析了如何通过Interface Designer配置高效的Native接口,并分享了其时序详解与调试技巧,为开发者提供了一份从硬件连接到软件调试的深度指南。

weixin_29168153的博客 453

classloader.getResource方法使用

在项目开发的过程中,都会使用到配置文件,而配置文件的读取需要使用classLoader中的getRources方法进行获得,因此需要掌握getRources如何读取到配置文件信息。 1. 常见用法 xxx.class.getResource(path); classPath:是项目编译后的classes目录,class目录下存放这src目录下java文件编译后的class文件、xml、properties等资源文件。 如果需要获得application.yml路径可以使用 xxx.class.

路漫漫其修远兮 吾将上下而求索 1万+

java读取resources目录下的文件

我们使用类加载器获取resources下的目录文件 getClassLoader()和getContextClassLoader() 他们两个的区别 区别一: getClassLoader()是当前类加载器,而getContextClassLoader是当前线程的类加载器 区别二: getClassLoader是使用双亲委派模型来加载类的,而getContextClassLoader就是为了避开双亲委派模型的加载方式的,也就是说它不是用这种方...

fengzi_0的博客 2162

WRF实战:自定义Vtable解析ECMWF海温数据的关键步骤与技巧

本文详细介绍了在WRF模型中自定义Vtable以解析ECMWF海温数据的关键步骤与技巧。通过解剖GRIB文件、编写自定义Vtable条目以及配置METGRID.TBL,解决了ECMWF数据与WRF模型对接的难题,为海洋气象和台风模拟研究提供了高精度数据输入方案。

weixin_29279101的博客 335

基于STM32、HAL库的GZP6816D气压传感器 驱动程序设计

测量范围:0-16kPa(可根据型号不同有变化)工作电压:1.8V-3.6V。高精度:±1% FS。

corlin6688的博客 217

SpringBoot读取项目中得文件(resource目录下)

SpringBoot读取Resource下文件 类加载器的方式 ResourceUtils 补充: 类加载器的方式 通过类加载器读取文件流,类加载器可以读取jar包中的编译后的class文件,当然也是可以读取jar包中的文件流了。第一种: ClassPathResource classPathResource = new ClassPathResource("files/test.xlsx"); InputStream inputStream =classPathResource.getInputS

My_SweetXue的博客 4982

在 MATLAB/Simulink 中构建一个固定地面站天线指向控制系统的完整仿真模型

在卫星通信系统中,地面站天线负责与在轨卫星建立高增益、高稳定性的通信链路。对于固定地面站(如卫星测控站、深空站、VSAT主站),天线必须具备高精度指向能力,以确保波束始终对准卫星。然而,卫星(尤其是低轨卫星)在天空中快速移动,地面站天线必须实时跟踪其轨迹。此外,环境扰动(风载、热变形、机械误差)也会导致指向偏差。因此,设计一个高精度、高鲁棒性的天线指向控制系统(Antenna Pointing Control System)至关重要。本文将手把手教你如何在中构建一个固定地面站天线指向控制系统。

amy_mhd的博客 132

java读取resource下的文件夹和文件

Java读取resource下的文件夹和文件 作为一名刚入行的开发者,你可能会对如何在Java中读取resource下的文件夹和文件感到困惑。别担心,这篇文章将为你提供详细的指导,帮助你轻松实现这个功能。 操作流程 首先,让我们通过一个表格来了解整个操作流程: 步骤 描述 1 确保resource文件夹存在 ...

weixin_36838800的博客 455

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ClassLoader读取文件,打包后读取不到---解决分享

写的有些粗糙,暂时就作为一个分享之后再整理吧。 在你的项目中可能经常会使用ClassLoader.getSystemResourceAsStream等方法来读取一个文件内容,使用properties来读取。 但是当你打包后会发现你程序出现了问题,这个时候怎么办呢? **解决**可以尝试一下以下的代码来获取文件,内容可自行修改,逻辑比较简单,就是获取相对地址然后得到文件 public Fil...

YOUR_HERO 3083

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

classLoader与读取配置文件

关于Thread.getContextClassLoader的使用场景问题 Thread context class loader存在的目的主要是为了解决parent delegation机制下无法干净的解决的问题。假如有下述委派链: ClassLoader A -> System class loader -> Extension class loader -> Bootstrap class loader 那么委派链左边的ClassLoader就可以很自然的使用右边的ClassLoad

yangyangrenren的专栏 981

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

classloader读取配置文件_JavaWeb读取配置文件的四种方法

方式一:采用ServletContext读取获取配置文件的realpath,然后通过文件流读取出来或者通过方法getReasurceAsStream()。因为是用ServletContext读取文件路径,所以配置文件可以放入在WEB-INF的classes目录中,也可以在应用层级及WEB-INF的目录中。文件存放位置具体在eclipse工程中的表现是:可以放在src下面,也可放在WEB-INF及W...

weixin_39820226的博客 475

Java之ClassLoader读取文件

Java可以通过以下方法读取文件内容: 1】ClassLoader加载

LVXIANGAN的专栏 1793

ClassLoader读取文件,springboot打jar包后读取不到

jar:file:/D:/test/test/.metadata/.plugins/org.eclipse.wst.server.core/test/test/test/WEB-INF/lib/test-0.0.1-SNAPSHOT.jar!/ca.crt 在你的项目中可能经常会使用ClassLoader.getSystemResourceAsStream等方法来读取一个文件内容,使用properties来读取。 但是当你打包后会发现你程序出现了问题,这个时候怎么办呢? **解决**可以尝试一下以下的代码

1176

idea路径问题(classloader读取文件)

今天碰到一个很严重的问题,idea读取配置文件路径不管怎么写,都是不正确的,我也很纳闷。我的项目目录是这样的: 首先,getResourceAsStream方法需要写相对路径,那么就要搞清楚,是相对谁? 如上图所示,相对的是Output directory里设置的路径,一定要注意! 第一种读取办法:ServletContext读取web工程下的资源 InputStream is ...

飞鸿踏雪泥的博客 4138

Java中使用类路径ClassLoader读取文件操作

在这个代码里我使用json文件存放了一个表单模板,存放在resource文件夹下的所有文件都会被引入类路径,使用系统路径读取总是获取不到后使用ClassLoader根据类路径文件名下的文件,用流的形式去读取。在开发过程中经常会遇到读取文件的问题,使用new FileReader(jsonFilePath)去读相对路径总是读取不到,这时就可以使用ClassLoader类路径去读取,具体源码如下。

m0_52808530的博客 458

读取classpath下的文件。只能通过ClassLoader来读取,否则打包后,会读取不到

InputStream stream = getClass().getClassLoader().getResourceAsStream(fileName);

松子落 319

关于jar读取文件路径问题

  关于jar读取文件路径的这个问题可愁死我了! (以下内容如有不准确,或错误的地方请留言.我会积极配合领导去查证并更正我的错误.) 先看项目树:(对应项目Open in Terminal    ---   tree &gt;&gt;E:\tree.txt) E:. └─src └─main ├─java │ └─com │ ...

MysticalYcc的博客 3783

Java使用ClassLoader读取外部json文件

我们有时候会遇到这样一种业务场景:某个对象是变化的,在不同项目的部署中,可能需要更改对象中的某个属性,这时如果我们将该对象写在代码里,这样不仅寻找不便,部署后也不能随便修改(修改后又要重新打包),这就需要将该对象解耦,单独抽离出来,做成一个json文件,放在resource中,这样即使项目上线后,我们也能随时改变,只需要重启即可。我们将该对象写成json格式,放在resources下的outside包中,内部是标准的json格式文件(略)。

Yungang_Young的博客 708

辨析ClassLoader与getResource在读取配置文件中的应用

今天学习了Java反射的知识,具体我已经有些许遗忘了。现在想聚焦一下反射知识以外的一些东西,但又有点相关的ClassLoader。 对于新手来说,想必只要自己写过jdbc的同学一定都见识过Class.forName以及ClassLoader。 对于笔者来说,第一次见到他们俩个的时候,疑惑,不解,生硬套用,说一千道一万个不愿意使用,因为记不得呀,每次打开连接驱动都得回去翻翻以前写的代码,把他复制粘贴过去。 ok让我们进入正题。 聚焦ClassLoader,让我们先来看看JDK8中的官方记录 类加载器是负责加载

weixin_44293582的博客 290

java读取文件的两种方法:java.io和java.lang.ClassLoader

java读取文件的两种方法:java.io和java.lang.ClassLoader什么时候使用java.io,什么时候使用java.lang.ClassLoader呢?(注:要是之前读xml文件时清晰知道java读取文件有这两种方法就好了!可以少走很多去理解相对路径的弯路!)自己的总结:*java.io:相对于当前用户目录的相对路径读取;注重与磁盘文件打交道或者纯java projec

2389
上一篇: 设计模式 -- (代理模式)
下一篇: springboot 环境下 jetcache使用详解
xiaoduup
博客等级 码龄9年 23粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值