SpringBoot 读取classPath 路径下文件几种方式及

文章目录

    • 1. 基础知识:
    • 2. 读取classPath 路径下文件的几种方式
    • 3.小结:

1. 基础知识:

  1. spring boot默认加载文件的路径:

    /META-INF/resources/
    /resources/
    /static/
    /public/

  2. Classpath含义

存放各种资源配置文件 eg.init.properties log4j.properties struts.xml
存放模板文件 eg.actionerror.ftl
存放class文件对应的是项目开发时的src目录编译文件

  1. 一般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.小结:

  1. springBoot 打war 包部署到window 或linux 系统上,对应读取classPath 下文件采用 File 的方式还是流的方式无所谓。
    当打jar包部署到linux 服务器时必须要采用流的方式读取。

  2. Class.getResourceAsStream(String path) :
    path 不以’/'开头时默认是从此类所在的包下取资源,
    以’/'开头则是从 ClassPath根下获取。
    最终还是由ClassLoader获取资源。

  3. 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();
        }
    }
}

  1. 使用getResourceStream获取,本质是类加载器classloader

你可能感兴趣的:(SpringBoot,+VUE,系列,spring,boot,java,struts)