使用ClassLoader获取的文件位置1(包外):
代码:
package demo1;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 获取类路径下的资源
*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到ClassLoader
ClassLoader clazz = this.getClass().getClassLoader();
// 调用getResourceAsStream(),得到一个InputStream输入流
InputStream input = clazz.getResourceAsStream("a.txt");
// 读取输入流中的内容并保存在byte[]数组中
byte[] data = input.readAllBytes();
// 打印
System.out.println("a.txt : \n" + new String(data,0,data.length));
input.close(); // 关闭流
}
}
打印结果:
使用ClassLoader获取的 文件位置2(包内):
代码:
package demo1;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 获取类路径下的资源
*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到ClassLoader
ClassLoader clazz = this.getClass().getClassLoader();
// 调用getResourceAsStream(),得到一个InputStream输入流
// InputStream input = clazz.getResourceAsStream("a.txt");
InputStream input = clazz.getResourceAsStream("demo1/b.txt");
// 读取输入流中的内容并保存在byte[]数组中
byte[] data = input.readAllBytes();
// 打印
// System.out.println("a.txt : \n" + new String(data,0,data.length));
System.out.println("b.txt : \n" + new String(data,0,data.length));
input.close(); // 关闭流
}
}
打印结果:
使用Class获取的文件位置(包内):
package demo1;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 获取类路径下的资源
*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到ClassLoader
Class clazz = this.getClass();
InputStream input = clazz.getResourceAsStream("b.txt"); // 相对当前类(AServlet)的所在目录
// 读取输入流中的内容并保存在byte[]数组中
byte[] data = input.readAllBytes();
// 打印
System.out.println("b.txt : \n" + new String(data,0,data.length));
input.close(); // 关闭流
}
}
使用Class就相当于从类当前目录读取,此时读取包外的文件就会报错,那么此时想要读取包外的文件应该怎么做?
Class读取文件位置2(包外):
代码:
package demo1;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 获取类路径下的资源
*/
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 调用getResourceAsStream(),得到一个InputStream输入流
InputStream input = clazz.getResourceAsStream("/a.txt"); // 相对当前类(AServlet)的所在目录
// 读取输入流中的内容并保存在byte[]数组中
byte[] data = input.readAllBytes();
System.out.println("a.txt : \n" + new String(data,0,data.length));
input.close(); // 关闭流
}
}
打印结果:
所以只需要加上一个" / "就行了,不加 / 是相对当前类所在目录,加上就相对classes所在路径。
下面的文件夹:
相当于这个:
因为它们的内容一样:
可以推断,classes文件夹是一个存放编译文件的文件夹。
因为里面存放了.class编译后的文件:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)