JavaWeb——获取类路径下的资源

 

一、项目结构

1、首先,项目的目录结构大概是这样

JavaWeb——获取类路径下的资源

 

二、资源文件存放路径

1、类路径下的资源一般放在 src 下。假如先在src的根目录下新建一个a.txt 文件。

2、实际上a.txt会被加载到:\项目名\out\artifacts\项目扩展名WEB-INF\classes\a.txt  (如果是IDEA,路径大概就是这样。当然,如果是其他编译工具帮你生成的路径和这个不一样,也不影响后续的获取)

自动加载后的文件目录

JavaWeb——获取类路径下的资源

 

三、获取类路径下的资源方式

1、方式一: ClassLoader

(1)、该方式的路径是相对于/classes,开头没有斜杆的

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到ClassLoader 先得到Class,在得到ClassLoader
        ClassLoader c1=this.getClass().getClassLoader();
        //调用其getResourceAsStream,得到一个InputStream
        InputStream input = c1.getResourceAsStream("a.txt");
        //读取输入流,转成字符串
        String s = IOUtils.toString(input);
        //输出
        System.out.println(s);
    }

如果资源文件不是直接在src下,而是在其他包下面,如:a.txt 在 com/sunlee/test/ 下 ,如图:

JavaWeb——获取类路径下的资源

那么,只要改成:getResourceAsStream("com/sunlee/test/a.txt") 即可,注意:开头没有斜杆的

代码如下:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到ClassLoader 先得到Class,在得到ClassLoader
        ClassLoader c1=this.getClass().getClassLoader();
        //调用其getResourceAsStream,得到一个InputStream
        InputStream input = c1.getResourceAsStream("com/sunlee/test/a.txt");
        //读取输入流,转成字符串
        String s = IOUtils.toString(input);
        System.out.println(s);
    }

 

2、方式二:Class 

(1)、该方式是相对于该.class文件所在目录

(2)、注意:src下的java文件会被编译成class文件放在 /classes下

(3)、注意:开头还是没有斜杆的

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到Class
        Class c = this.getClass();
        //相对于当前.class文件所在目录
        InputStream input = c.getResourceAsStream("a.txt");
        //读取输入流,转成字符串
        String s = IOUtils.toString(input);
        System.out.println(s);
    }

 

看到这里可能会有疑问:既然相对于.class文件,那如果我的资源文件和.class文件不同目录怎么办?

这种情况下,可修改代码为:getResourceAsStream("/a.txt");   注意:这里加了一个斜杆,表示相对classes下。没错,如果加了斜杆就和上面classLoader效果一样的了,当然,classLoader是没有前面加斜杆一说的。

代码贴上:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到Class
        Class c = this.getClass();
        //相对于当前.class文件所在目录
        InputStream input = c.getResourceAsStream("/a.txt");
        //读取输入流,转成字符串
        String s = IOUtils.toString(input);
        System.out.println(s);
    }

以上就是获取类路径下的资源的两种方式