1. 基础知识:
-
spring boot默认加载文件的路径:
/META-INF/resources/
/resources/
/static/
/public/ -
Classpath含义
存放各种资源配置文件 eg.init.properties log4j.properties struts.xml
存放模板文件 eg.actionerror.ftl
存放class文件对应的是项目开发时的src目录编译文件
- 一般java项目中 classpath存在与 WEB-INFO/目录。
当我们需要某个class时,系统会自动在CLASSPATH里面搜索,如果是jar,就自动从jar里面查找,如果是普通的目录,则在目录下面按照package进行查找。
但与PATH不同的是,默认的CLASSPATH是不包含当前目录的,这也是CLASSPATH里面要包含一个点的道理了。
Tomcat下的Web应用有两个预置的classpath : WEB-INF/classes 和WEB-INF/lib启动项目,项目就会加载这两个目录里的数据。这是war包的规范.要改变预置的classpath比较麻烦,在Tomcat的配置文件里没有发现类似的配置,要实现自己的classloader才能达到目的。
一个在tomcat中运行的web应用.它的classpath都包括如下目录:
我知道的有:
%tomcat%/lib
web-inf/lib
web-inf/classes
2. 读取classPath 路径下文件的几种方式
// 方法1:获取文件或流
this.getClass().getResource("/")+fileName;
this.getClass().getResourceAsStream(failName);
// 方法2:获取文件
File file = org.springframework.util.ResourceUtils.getFile("classpath:test.txt");
// 方法3:获取文件或流
ClassPathResource classPathResource = new ClassPathResource("test.txt");
classPathResource .getFile();
classPathResource .getInputStream();
// >>>>>>>>>>>>>>>> 下面方法可以读取jar包下文件
假设resources目录下有一个test.txt文件,首先获得当前的类加载器,通过类加载器读取文件
假设resources目录下有一个test.txt文件,首先获得当前的类加载器,通过类加载器读取文件。
// 方法1
InputStream io = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.txt");
// 方法2
InputStream io = getClass().getClassLoader().getResourceAsStream("test.txt");
3.小结:
-
springBoot 打war 包部署到window 或linux 系统上,对应读取classPath 下文件采用 File 的方式还是流的方式无所谓。
当打jar包部署到linux 服务器时必须要采用流的方式读取。 -
Class.getResourceAsStream(String path) :
path 不以’/'开头时默认是从此类所在的包下取资源,
以’/'开头则是从 ClassPath根下获取。
最终还是由ClassLoader获取资源。 -
ClassPathResource 默认是读取Resource(classpath)下的文件
public class ClassPathResource_Test {
public static void main(String[] args) {
// ClassPathResource 读取文件
ClassPathResource classPathResource = new ClassPathResource("ReadResourceFile.txt");
// 获取输入流
try (InputStream inputStream = classPathResource.getInputStream()) {
int len;
byte[] buffer = new byte[1024];
while ((len = inputStream.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 使用getResourceStream获取,本质是类加载器classloader