在Web项目中,读取web目录下upload文件夹里的readme.txt文本文档,其中保存了字符“Hello World!”,具体的情况如下图所示:
![](https://img-blog.csdnimg.cn/1b510726f20840a4b49413e34a17db14.png)
实现代码如下:
package servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
@WebServlet(name = "readme", urlPatterns = "/readme")
public class ReadmeServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("readme service ......");
// 1. 获取ServletContext对象
ServletContext context = req.getServletContext();
// 2. 使用输入流读取upload目录下的readme.txt文件
// 在Web项目中,读写文件的路径不能写为URL路径
// 需要将URL路径转换为真实路径
String realPath = context.getRealPath("/upload/readme.txt");
// E:\\IdeaProjects\\myWeb\\out\\artifacts\\myWeb_war_exploded\\upload\\readme.txt
System.out.println(realPath);
// 3. 将真实路径包装成FileReader对象
// 注意,FilerReader类有3个构造器:
// 3.1 FileReader(String fileName)
// 3.2 FileReader(File file)
// 3.3 FileReader(FileDescriptor fd) 这个构造器不常用!
FileReader fr = new FileReader(realPath);
// 因为FileReader对象一次仅能读取一个字符
// 所以将FileReader对象包装成BufferedReader对象
// 该对象可以实现一次读一行字符,提高了读取效率
BufferedReader br = new BufferedReader(fr);
// 使用BufferedReader对象读取真实路径中readme.txt里的字符
// 一次读一行
// null if the end of the stream has been reached
// 虽然readme.txt文件里仅有一行字符
// 但readLine方法一共需要读两次
// 第一次读完,line不为null,打印line
// 第二次再去读,line为null,不进入循环体,不打印line
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
// 关闭输入流
br.close();
}
}
点击运行,并通过浏览器访问http://localhost:8080/myWeb/readme后,控制台输出如下图所示:
![](https://img-blog.csdnimg.cn/c137657666b8427eaeee3bdb3966d42b.png)
从运行结果中可以观察到,已打印输出readme.text文本文档中保存的字符“Hello World!”,说明读取已经成功!