response.getOutputStream().println()和response.getWriter().write()的差异
有这么两个servlet,它们的doGet方法分别做如下处理:第一个是向客户端输出文本字符串,第二个是向客户端输出一张图片。
第一个servlet使用了response.getWrite().println()方法,当然用response.getWrite().wirte()也可以。
1 /** 2 * 向客户端输出文本字符串 3 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 4 */ 5 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 6 response.setContentType("text/html"); 7 PrintWriter out = response.getWriter(); 8 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); 9 out.println("<HTML>"); 10 out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); 11 out.println(" <BODY>"); 12 out.print(" This is "); 13 out.print(this.getClass()); 14 out.println(", using the GET method"); 15 out.println(" </BODY>"); 16 out.println("</HTML>"); 17 out.flush(); 18 out.close(); 19 }
第二个servlet使用了response.getOutputStream().println()方法。
1 /** 2 * 向客户端输出一张图片 3 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 4 */ 5 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 6 /** 7 * 浏览器能接收(Accept)的数据类型有: 8 * application/x-ms-application, 9 * image/jpeg, 10 * application/xaml+xml, 11 * image/gif, 12 * image/pjpeg, 13 * application/x-ms-xbap, 14 * application/vnd.ms-excel, 15 * application/vnd.ms-powerpoint, 16 * application/msword, 17 */ 18 response.setHeader("content-type", "image/jpeg");//使用content-type响应头指定发送给浏览器的数据类型为"image/jpeg" 19 //读取位于项目根目录下的img文件夹里面的WP_20131005_002.jpg这张图片,返回一个输入流 20 InputStream in = this.getServletContext().getResourceAsStream("/img/2016-08-12_221916.jpg"); 21 byte buffer[] = new byte[1024]; 22 int len = 0; 23 OutputStream out = response.getOutputStream();//得到输出流 24 while ((len = in.read(buffer)) > 0) {//读取输入流(in)里面的内容存储到缓冲区(buffer) 25 out.write(buffer, 0, len);//将缓冲区里面的内容输出到浏览器 26 } 27 out.flush(); 28 out.close(); 29 }
为什么这么用呢?
getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
response.getWriter().println()可以将各种类型(包括Object)的数据输出,通过默认编码转换成bytes字节形式,这些字节都通过write(int c)方法被输出。response.getOutputStream()获得的是OutputStream对象,这是一个二进制的输出流,所以只输出二进制流数据。编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。
存在问题点:同一个页面里同时使用这两个方法会起冲突,所以避免同时使用。
参考:
http://blog.csdn.net/xh16319/article/details/8449255
http://www.cnblogs.com/xdp-gacl/p/3789624.html
http://www.cnblogs.com/xdp-gacl/p/3791993.html
浙公网安备 33010602011771号