1.什么是IO操作
IO操作,也就是Input与Output的缩写。在Java中的IO流操作字符流主要是借助于Writer、Reader字符流的抽象类,其子类FileWriter和FileReader可实现文件的读写操作,BufferedWriter和BufferedReader为字符操作提供缓冲功能。IO流中字节流主要是借助于InputStream和OutputStream字节流的抽象类,其子类FileInputStream和FileOutputStream可实现文件的读写操作,BufferedInputStream和BufferedOutputStream为字节流提供缓冲区功能。
2.IO操作在Servlet中的一个实例
下面通过一个Servlet历史使用次数累加器来演示IO操作在Servlet的使用。
Java源码:
public class LifeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 声明计数器,上下文对象,路径
// 属性
int count;
ServletContext sc;
String path;
/**
* <li> 做一些准备工作
* <li> 1 获取上下文环境
* <li> 2从上下文对象获取文件路径
* <li> 3读取文件中的信息
*/
public void init() throws ServletException{
count = 0;
System.out.println("在init中完成计数器的初始化");
sc = this.getServletContext();
path = sc.getRealPath("WEB-INF/count.txt");
try {
InputStream is = LifeServlet.class.getResourceAsStream("countinpackage.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String string;
string = br.readLine();
System.out.println(string);
count = Integer.parseInt(string); //计数器完成初始化
br.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* <li> 销毁
*/
public void destroy() {
System.out.println("Servlet已经释放");
}
/**
* @see HttpServlet#HttpServlet()
*/
public LifeServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* <li> 处理输出到响应中的信息
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置输出类型和编码字符集
response.setContentType("text/html;charset=utf-8");
// 获取out对象
PrintWriter out = response.getWriter();
// 计数器自增1
count++;
// 插旗
out.println("这个Servlet历史上已经被访问了"+count+"次了!");
// 写到文件的组合动作
// 1 获取输出流对象
OutputStream fw = new FileOutputStream(path);
// 2 得到写缓存
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fw));
// 3 准备好数据格式:字符串,由整数转换得到
String string = String.valueOf(count);
// 4 写回到文件
bw.write(string);
// 5 关闭文件相关资源
bw.close();
fw.close();
System.out.println("该Servlet的doGet方法被执行了一次");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
System.out.println("该Servlet的doPost方法被执行了一次");
}
}
HTML源码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>第一个Servlet页面,注意Servlet的生命周期</title>
</head>
<body>
<form method="post" action="lifeCycle">
<input type="submit" value="激活一个Servlet" />
</form>
</body>
</html>
现在我们运行代码就可以得到:
可以看到第一次运行这个Servlet,出现已经访问了1001次。为什么会显示运行了1001次呢?
因为在Servlet的init()函数中的count是通过使用getResourceAsStream()函数获得本包内中countinpackage.txt中的内容,再利用BufferedReader以iostream为参数构造函数和BufferedReader的readLine()方法将其转换为字符串形式,最后通过parseInt方法转变为数字形式,最后将值输出给count。
打开对应文件,就可以看见文件的内容是1000次。
如果我们此时将其中的内容更改为100。
再次运行就可以看到结果变为了101。
由此可见Servlet在进行操作前,在Init()函数中就使用了IO流操作的类与方法获取了数据再对其进行操作。