
创建或修改目录:/www/wwwroot/104.219.215.234/data 失败!
丝袜吧 对于Java神气读取resources资源文献旅途的那点事
撸撸射快播
发布日期:2025-03-28 23:04 点击次数:190
在Java要领中读取resources资源下的文献,由于对Java结构了解不透顶,遭遇好多坑。
平淡在Java工程中读取某旅途下的文献时,不错选用有余旅途和相对旅途,有余旅途没什么好说的,相对旅途,即相对于现时类的旅途。
在腹地工程和奇迹器中读取文献的面孔有所不同,以下图成立文献为例:
性爱
Java类中需要读取properties中的成立文献,不错选用文献(File)面孔进行读取:
阻难:当在IDEA中初始(不部署在奇迹器上),不错读取到该文献;
原因:JavaWeb神气部署奇迹器中,会将神气打包成Jar包或者war包,此时就不会存在 src/main/resources 目次,JVM会在编译神气时,主动将 java文献编译成 class文献 和 resources 下的静态文献放在 target/classes目次下;
解析:Java文献唯有编译成 class文献才会被JVM实施,腹地实施时会,现时神气即为Java进度的使命空间,天然class文献在target/classes目次下,关联词target/classes不是class文献初始的目次,仅仅存放的目次,初始目次仍是在IDEA的模块下,是以初始时会找到 src/main/resources 资源文献!
二、奇迹器(Tomcat)读取资源文献当工程部署到Tomcat中时,按照上边面孔,则会抛出颠倒:FileNotFoundException。
原因:Java工程打包部署到Tomcat中时,properties的旅途变到顶层(classes下),这是由Maven工程结构决定的。
由Maven构建的web工程,主代码放在src/main/java旅途下,资源放在src/main/resources旅途下,当构建jar包 或 war包时,JVM编造契机自动编译java文献为class文献存放在 target/classes目次下,resource资源下的文献会刻舟求剑的拷贝一份到 target/classes 目次下:
面孔一:此时读取资源文献时,选用流(Stream)的面孔读取,并通过JDK中Properties类加载
不错浅易的得回到成立文献中的信息:
要点解析:class.getResourceAStream() 与 class.getClassLoader().getResorceAsStream() 的分辨
1)第一种和第二种面孔选用 Class 对象去加载,第三种面孔选用 ClassLoader 对象去加载资源文献,之是以 Class 不错加载资源文献,是因为 Class 类封装的 ClassLoader 的 getResourceAsStream() 措施,从 Class 类中的源码不错看出:
原理:之是以这么作念无疑仍是浅易客户端的调用,省的每次得回ClassLoader才气加载资源文献的凄沧!
2).class 是得回现时类的 class 对象,getClassLoader()是得回现时的类加载器,什么是类加载器?
概况点说,等于用来加载java类的,类加载器等于精采把class文献加载进内存中,并创建一个java.lang.Class类的一个实例,也等于class对象,而况每个类的类加载器齐不相易,getResourceAsStream(path)是用来得回资源的,因为这是ClassLoader(类加载器)得回资源,而类加载器默许是从 classPath 下得回资源的,因为这底下有class文献。
是以这段代码总的好奇是通过类加载器在 classPath 目次下得回资源,而况是以流的阵势。
咱们知说念在Java中扫数的类齐是通过加载器加载到编造机中的,而且类加载器之间存在父子研讨,等于子知说念父,父不知说念子,这么不同的子加载的类型之间是无法探问的(天然它们齐被放在措施区中),是以在这里通过现时类的加载器来加载资源也等于保证是和类类型是湮灭个加载器加载的。
三、class.getClassLoader().getResourceAsStream() 和 class.getResouceAsStream() 的分辨a)class.getClassLoader().getResourceAsStream(Stringname)默许从classpath中找文献(文献放在resources目次下),name不成带"/",不然会抛空指针。选用相对旅途, "/"就杰出于现时进度的根目次,即神气根目次;
b)class.getResourceAsStream(String name) 是选用有余旅途,有余旅途是相对于 classpath 根目次的旅途,"/" 就代表着 classpath,是以 name 属性需要前边加上 "/";
面孔二:选用Spring注解
如若工程中使用Spring,不错通过注解的面孔得回成立信息,但需要将成立文献放到Spring成立文献中扫描后,才气将成立信息放入高下文。
然后在要领中不错使用 @Value进行得回properties文献中的属性值,如下:
面孔三:选用Spring成立
也不错在Spring成立文献中读取属性值,赋予类成员变量
要点:SpringBoot神气启动后,动态的读取类旅途下文献数据
阻难:此时我念念读取 jar 包中根旅途下的 HelloServiceEncryptFile.txt 文献,然后重新写入到根旅途下的 com.study/service 旅途下!
转头以上为个东说念主请示丝袜吧,但愿能给全球一个参考,也但愿全球多多守旧剧本之家。