- 首先我們翻下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次再去獲得這個流來操作了。當然這里我們也能夠自己來將輸出流關閉,只是即使我們不關閉,引擎也會自己主動幫我關閉了。
