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

posted on 2016-09-11 00:44  拉桑  阅读(3400)  评论(0)    收藏  举报