流分類:
1.Java的字節流
InputStream是所有字節輸入流的祖先,而OutputStream是所有字節輸出流的祖先。
2.Java的字符流
Reader是所有讀取字符串輸入流的祖先,而writer是所有輸出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象類。所以不能直接new
Java 內用 Unicode 編碼存儲字符
字符流處理的單元為 2 個字節的 Unicode 字符,分別操作字符、字符數組或字符串
而字節流處理單元為 1 個字節,操作字節和字節數組。
所以字符流是由Java虛擬機將字節轉化為2個字節的Unicode字符為單位的字符而成的,所以它對多國語言支持性比較好!
如果是音頻文件、圖片、歌曲,就用字節流好點
如果是關系到中文(文本)的,用字符流好點
類 InputStreamReader 和 OutputStreamWriter 處理字符流和字節流的轉換。
字符流(一次可以處理一個緩沖區)一次操作比字節流(一次一個字節)效率高。
字節流在操作的時候本身是不會用到緩沖區(內存)的,是與文件本身直接操作的
而字符流在操作的時候是使用到緩沖區的
操作流程
在Java中IO操作也是有相應步驟的,以文件操作為例,主要的操作流程如下:
1 使用File類打開一個文件
2 通過字節流或字符流的子類,指定輸出的位置
3 進行讀/寫操作
4 關閉輸入/輸出
IO操作屬於資源操作,一定要記得關閉
字節流在操作文件時,即使不關閉資源(close方法),文件也能輸出,
但是如果字符流不使用close方法的話,則不會輸出任何內容,說明字符流用的是緩沖區,並且可以使用flush方法強制進行刷新緩沖區,這時才能在不close的情況下輸出內容
那開發中究竟用字節流好還是用字符流好呢?
字符流只能處理字符類型(char,純文本可以用字符流,比如漢字,傳輸de時候要查詢編碼表,得到漢字對應的字符),
而字節流可以處理任何類型(比如圖片,視頻,是以二進制傳輸的)
在所有的硬盤上保存文件或進行傳輸的時候都是以字節的方法進行的,包括圖片也是按字節完成,而字符是只有在內存中才會形成的,所以使用字節的操作是最多的。
如果要java程序實現一個拷貝功能,應該選用字節流進行操作(可能拷貝的是圖片),並且采用邊讀邊寫的方式(節省內存)。
注意:
在客戶端的一次請求中,getOutputStream和getWrite這兩個方法是互斥的。
調用了其中的一個,就不能在調用另外一個
比如在一個servlet中出現這兩個方法是肯定不對的。
另外:
如果在一個servlet1中寫
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getOutputStream(); this.getServletContext().getRequestDispatcher("/servlet/servlet2").forward(request, response); } }
在servlet2中使用getWrite()
或者在servlet1中寫
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getOutputStream(); response.sendRedirect("servlet/servlet2"); } }
在servlet2中使用getWrite()
上面的第一種寫法是錯的,第二種寫法是對的
因為第一種是轉化,轉化只是同一次請求
第二種是重定向,重定向是發起一個新的請求