1. 程式人生 > >Servlet 中,out.print()與out.write()的區別

Servlet 中,out.print()與out.write()的區別

null use res 的區別 找到 htm 一段時間 對象 cep

最近剛學習了Ajax,其中有通過$.getJSON的實現方式

由於前後端傳遞值的時候會通過流的方式進行傳遞,這就不得不涉及到這方面的知識了

PrintWrite out=response.getWrite;

而流輸出的時候有兩種方法

out.write()和out.print()

out.write()是字節輸出流的方法
out.print()是字符輸出流的方法
一、區別
1.

print方法是子類JspWriter,write是Writer類中定義的方法;
2.

write():僅支持輸出字符類型數據,字符、字符數組、字符串等

print():可以將各種類型(包括Object)的數據通過默認編碼轉換成bytes字節形式,這些字節都通過write(int c)方法被輸出

3.

JspWriter類型的out對象使用print方法和write方法都可以輸出字符串,但是,如果字符串對象的值為null時,print方法將輸出內容為“null”的字符串,而write方法則是拋出NullPointerException異常。

二、用法

詳見https://blog.csdn.net/workinghardboy/article/details/80556735(為防止對方突然刪除了....所以下方copy一份)

因此傳輸數據時,write,print都可以使用

1.PrintWriter可以直接調用write()或print()方法,把字符串作為參數寫入,這樣就可以寫入json格式的數據了。如:

PrintWriter out = response.getWriter();
String info = gson.toJson(arraylistUsers);
out.write(info);


通過這種方式,客戶端就可以接受到數據了。客戶端讀取數據有多種方式,可以通過ajax讀,也可以通過GetPostUtil來讀取返回的數據。

package com.example.newsweb.activity;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; public class GetPostUtil { public static String sendGet(String url, String params) { String result = ""; BufferedReader in = null; try { String urlName = url + "?" + params; URL realUrl = new URL(urlName); // 打開和URL之間的連接 URLConnection conn = realUrl.openConnection(); // 設置通用的請求屬性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); // 建立實際的連接 conn.connect(); // 獲取所有響應頭字段 Map<String, List<String>> map = conn.getHeaderFields(); // 遍歷所有的響應頭字段 for (String key : map.keySet()) { // System.out.println(key + "--->" + map.get(key)); } // 定義BufferedReader輸入流來讀取URL的響應 in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("發送GET請求出現異常!" + e); e.printStackTrace(); } // 使用finally塊來關閉輸入流 finally { try { if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } /** * 向指定URL發送POST方法的請求 * * @param url * 發送請求的URL * @param params * 請求參數,請求參數應該是name1=value1&name2=value2的形式。 * @return URL所代表遠程資源的響應 */ public static String sendPost(String url, String params) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打開和URL之間的連接 URLConnection conn = realUrl.openConnection(); // 設置通用的請求屬性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); // 發送POST請求必須設置如下兩行 conn.setDoOutput(true); conn.setDoInput(true); // 獲取URLConnection對象對應的輸出流 out = new PrintWriter(conn.getOutputStream()); // 發送請求參數 out.print(params); // flush輸出流的緩沖 out.flush(); // 定義BufferedReader輸入流來讀取URL的響應 in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += "\n" + line; } } catch (Exception e) { System.out.println("發送POST請求出現異常!" + e); e.printStackTrace(); } // 使用finally塊來關閉輸出流、輸入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } }

2.print方法和write方法是有區別的,最大的區別就是上述提到的,print可以寫入對象,而write不行。

3.print和write都可以寫入html代碼,來進行頁面的跳轉,並在一段時間後跳回到原來的頁面,以此來達到提醒的作用。如:

PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>登錄出錯</TITLE>");
out.println("<meta http-equiv=\"refresh\" charset=‘utf-8‘ content=\"3;url=" + truePath + "\">");
out.println("</HEAD>");
out.println(" <BODY>");
out.print("<div align=\"center\">");
out.print("您輸入的書名不存在或書名有錯誤,請重試");
out.print("</div>");
out.println(" </BODY>");
out.println("</HTML>");
// flush()表示強制將緩沖區中的數據發送出去,不必等到緩沖區滿
out.flush();
out.close();


效果如圖:

4.PrintWriter不能PrintWriter out = new PrintWriter(),因為這樣,out不能找到輸出的對象,導致輸出失敗。

5.out.flush()表示強制將緩沖區中的數據發送出去,不必等到緩沖區滿。所以一般先flush()再close(),否則容易導致數據丟失

Servlet 中,out.print()與out.write()的區別