java 字節流與字符流的區別

java 字節流與字符流的區別

轉載地址:點擊打開連接html

字節流與和字符流的使用很是類似,二者除了操做代碼上的不一樣以外,是否還有其餘的不一樣呢?
實際上字節流在操做時自己不會用到緩衝區(內存),是文件自己直接操做的,而字符流在操做時使用了緩衝區,經過緩衝區再操做文件,如圖12-6所示。

下面以兩個寫文件的操做爲主進行比較,可是在操做時字節流和字符流的操做完成以後都不關閉輸出流。java


範例:使用字節流不關閉執行數據庫

Java代碼   收藏代碼
  1. package org.lxh.demo12.byteiodemo;    
  2. import java.io.File;    
  3. import java.io.FileOutputStream;    
  4. import java.io.OutputStream;    
  5. public class OutputStreamDemo05 {    
  6. public static void main(String[] args) throws Exception {   // 異常拋出,  不處理    
  7. // 第1步:使用File類找到一個文件    
  8.      File f = new File("d:" + File.separator + "test.txt"); // 聲明File  對象    
  9. // 第2步:經過子類實例化父類對象    
  10.      OutputStream out = null;            
  11. // 準備好一個輸出的對象    
  12.      out = new FileOutputStream(f);      
  13. // 經過對象多態性進行實例化    
  14. // 第3步:進行寫操做    
  15.      String str = "Hello World!!!";      
  16. // 準備一個字符串    
  17.      byte b[] = str.getBytes();          
  18. // 字符串轉byte數組    
  19.      out.write(b);                      
  20. // 將內容輸出    
  21.  // 第4步:關閉輸出流    
  22.     // out.close();                  
  23. // 此時沒有關閉    
  24.         }    
  25.     }   
程序運行結果:

此時沒有關閉字節流操做,可是文件中也依然存在了輸出的內容,證實字節流是直接操做文件自己的。而下面繼續使用字符流完成,再觀察效果。

 


範例:使用字符流不關閉執行數組

Java代碼   收藏代碼
  1. package org.lxh.demo12.chariodemo;    
  2. import java.io.File;    
  3. import java.io.FileWriter;    
  4. import java.io.Writer;    
  5. public class WriterDemo03 {    
  6.     public static void main(String[] args) throws Exception { // 異常拋出,  不處理    
  7.         // 第1步:使用File類找到一個文件    
  8.         File f = new File("d:" + File.separator + "test.txt");// 聲明File 對象    
  9.         // 第2步:經過子類實例化父類對象    
  10.         Writer out = null;                 
  11. // 準備好一個輸出的對象    
  12.         out = new FileWriter(f);            
  13. // 經過對象多態性進行實例化    
  14.         // 第3步:進行寫操做    
  15.         String str = "Hello World!!!";      
  16. // 準備一個字符串    
  17.         out.write(str);                    
  18. // 將內容輸出    
  19.         // 第4步:關閉輸出流    
  20.         // out.close();                   
  21. // 此時沒有關閉    
  22.     }    
  23. }   
程序運行結果:


程序運行後會發現文件中沒有任何內容,這是由於字符流操做時使用了緩衝區,而在關閉字符流時會強制性地將緩衝區中的內容進行輸出,可是若是程序沒有關閉,則緩衝區中的內容是沒法輸出的,因此得出結論:字符流使用了緩衝區,而字節流沒有使用緩衝區。

 


提問:什麼叫緩衝區?在不少地方都碰到緩衝區這個名詞,那麼到底什麼是緩衝區?又有什麼做用呢?post

回答:緩衝區能夠簡單地理解爲一段內存區域。能夠簡單地把緩衝區理解爲一段特殊的內存。某些狀況下,若是一個程序頻繁地操做一個資源(如文件或數據庫),則性能會很低,此時爲了提高性能,就能夠將一部分數據暫時讀入到內存的一塊區域之中,之後直接今後區域中讀取數據便可,由於讀取內存速度會比較快,這樣能夠提高程序的性能。在字符流的操做中,全部的字符都是在內存中造成的,在輸出前會將全部的內容暫時保存在內存之中,因此使用了緩衝區暫存數據。若是想在不關閉時也能夠將字符流的內容所有輸出,則可使用Writer類中的flush()方法完成。性能


範例:強制性清空緩衝區學習

Java代碼   收藏代碼
  1. package org.lxh.demo12.chariodemo;    
  2. import java.io.File;    
  3. import java.io.FileWriter;    
  4. import java.io.Writer;    
  5. public class WriterDemo04 {    
  6.     public static void main(String[] args) throws Exception { // 異常拋出不處理    
  7.         // 第1步:使用File類找到一個文件    
  8.         File f = new File("d:" + File.separator + "test.txt");// 聲明File    
  9. 對象    
  10.         // 第2步:經過子類實例化父類對象    
  11.         Writer out = null;                   
  12. // 準備好一個輸出的對象    
  13.         out = new FileWriter(f);             
  14. // 經過對象多態性進行實例化    
  15.         // 第3步:進行寫操做    
  16.         String str = "Hello World!!!";      
  17. // 準備一個字符串    
  18.         out.write(str);                    
  19. // 將內容輸出    
  20.         out.flush();                       
  21. // 強制性清空緩衝區中的內容    
  22.         // 第4步:關閉輸出流    
  23.         // out.close();                
  24. // 此時沒有關閉    
  25.     }    
  26. }   
程序運行結果:

此時,文件中已經存在了內容,更進一步證實內容是保存在緩衝區的。這一點在讀者往後的開發中要特別引發注意。
提問:使用字節流好仍是字符流好?學習完字節流和字符流的基本操做後,已經大概地明白了操做流程的各個區別,那麼在開發中是使用字節流好仍是字符流好呢?
回答:使用字節流更好。

在回答以前,先爲讀者講解這樣的一個概念,全部的文件在硬盤或在傳輸時都是以字節的方式進行的,包括圖片等都是按字節的方式存儲的,而字符是隻有在內存中才會造成,因此在開發中,字節流使用較爲普遍。flex

 

字節流與字符流主要的區別是他們的的處理方式
流分類:
1.Java的字節流
   InputStream是全部字節輸入流的祖先,而OutputStream是全部字節輸出流的祖先。
2.Java的字符流
  Reader是全部讀取字符串輸入流的祖先,而writer是全部輸出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象類。因此不能直接new 

字節流是最基本的,全部的InputStream和OutputStream的子類都是,主要用在處理二進制數據,它是按字節來處理的,但實際中不少的數據是文本,又提出了字符流的概念,它是按虛擬機的Encode來處理,也就是要進行字符集的轉化。這兩個之間經過 InputStreamReader,OutputStreamWriter來關聯,其實是經過byte[]和String來關聯。
在實際開發中出現的漢字問題實際上都是在字符流和字節流之間轉化不統一而形成的。

在從字節流轉化爲字符流時,實際上就是byte[]轉化爲String時,編碼

public String(byte bytes[], String charsetName)spa

有一個關鍵的參數字符集編碼,一般咱們都省略了,那系統就用操做系統的lang 而在字符流轉化爲字節流時,其實是String轉化爲byte[]時, byte[]    String.getBytes(String charsetName) 也是同樣的道理 至於java.io中還出現了許多其餘的流,按主要是爲了提升性能和使用方便, 如BufferedInputStream,PipedInputStream等
相關文章
相關標籤/搜索