- 首先我们翻下API:
返回一个记录二进制的响应数据的输出流。
注意:如果这个响应对象已经调用getWriter,将会抛出IllegalStateException。
public PrintWriter getWriter() throws IOException;
这个方法返回一个PringWriter对象用来记录格式化的响应实体。如果要反映使用的字符编码,必须修改响应的MIME类型。
注意:在调用这个方法之前,必须设定响应的content类型。如果没有提供这样的编码类型,会抛出一个UnsupportedEncodingException,如果这个响应对象已调用getOutputStream,会抛出一个getOutputStream。
- 对比上面的2个方法我们来整理一下:
2,getOutputStream()用于向客户机回送字符数据,也可以回送字节数据
- 那么我们应该怎么选择这2种输出流呢?
如果我们回送的是字节数据,也就只能用getOutputStream了。
上面API上已经说的很明白,这2个方法不能同时使用,看下面的代码:
package linkin; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author LinkinPark * @author 2015-7-10 * @Descri HttpServletResponse的2个输出流 */ public class LinkinServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().write("林肯公园"); resp.getOutputStream().write("林肯公园".getBytes()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
我们现在访问下:http://localhost:8080/linkin/LinkinServlet结果报错了,报错说:
getWriter() has already been called for this response
什么意思呢?就是说上面第一次使用流返回响应已经将这个流关闭了,这个是Servlet引擎自动帮我们做的,所以就不能第2次再去获得这个流来操作了。当然这里我们也可以自己来将输出流关闭,不过即使我们不关闭,引擎也会自动帮我关闭了。