java 字節流與字符流的區別

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

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

範例:使用字節流不關閉執行
package org.lxh.demo12.byteiodemo;    
import java.io.File;    
import java.io.FileOutputStream;    
import java.io.OutputStream;    
public class OutputStreamDemo05 {    
public static void main(String[] args) throws Exception {   // 異常拋出,  不處理    
// 第1步:使用File類找到一個文件    
     File f = new File("d:" + File.separator + "test.txt"); // 聲明File  對象    
// 第2步:經過子類實例化父類對象    
     OutputStream out = null;            
// 準備好一個輸出的對象    
     out = new FileOutputStream(f);      
// 經過對象多態性進行實例化    
// 第3步:進行寫操做    
     String str = "Hello World!!!";      
// 準備一個字符串    
     byte b[] = str.getBytes();          
// 字符串轉byte數組    
     out.write(b);                      
// 將內容輸出    
 // 第4步:關閉輸出流    
    // out.close();                  
// 此時沒有關閉    
        }    
    }




程序運行結果:

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

範例:使用字符流不關閉執行
package org.lxh.demo12.chariodemo;    
import java.io.File;    
import java.io.FileWriter;    
import java.io.Writer;    
public class WriterDemo03 {    
    public static void main(String[] args) throws Exception { // 異常拋出,  不處理    
        // 第1步:使用File類找到一個文件    
        File f = new File("d:" + File.separator + "test.txt");// 聲明File 對象    
        // 第2步:經過子類實例化父類對象    
        Writer out = null;                 
// 準備好一個輸出的對象    
        out = new FileWriter(f);            
// 經過對象多態性進行實例化    
        // 第3步:進行寫操做    
        String str = "Hello World!!!";      
// 準備一個字符串    
        out.write(str);                    
// 將內容輸出    
        // 第4步:關閉輸出流    
        // out.close();                   
// 此時沒有關閉    
    }    
}





程序運行結果:




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

提問:什麼叫緩衝區?

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

回答:緩衝區能夠簡單地理解爲一段內存區域。

能夠簡單地把緩衝區理解爲一段特殊的內存。

某些狀況下,若是一個程序頻繁地操做一個資源(如文件或數據庫),則性能會很低,此時爲了提高性能,就能夠將一部分數據暫時讀入到內存的一塊區域之中,之後直接今後區域中讀取數據便可,由於讀取內存速度會比較快,這樣能夠提高程序的性能。

在字符流的操做中,全部的字符都是在內存中造成的,在輸出前會將全部的內容暫時保存在內存之中,因此使用了緩衝區暫存數據。

若是想在不關閉時也能夠將字符流的內容所有輸出,則可使用Writer類中的flush()方法完成。

範例:強制性清空緩衝區
package org.lxh.demo12.chariodemo;    
import java.io.File;    
import java.io.FileWriter;    
import java.io.Writer;    
public class WriterDemo04 {    
    public static void main(String[] args) throws Exception { // 異常拋出不處理    
        // 第1步:使用File類找到一個文件    
        File f = new File("d:" + File.separator + "test.txt");// 聲明File    
對象    
        // 第2步:經過子類實例化父類對象    
        Writer out = null;                   
// 準備好一個輸出的對象    
        out = new FileWriter(f);             
// 經過對象多態性進行實例化    
        // 第3步:進行寫操做    
        String str = "Hello World!!!";      
// 準備一個字符串    
        out.write(str);                    
// 將內容輸出    
        out.flush();                       
// 強制性清空緩衝區中的內容    
        // 第4步:關閉輸出流    
        // out.close();                
// 此時沒有關閉    
    }    
}




程序運行結果:

此時,文件中已經存在了內容,更進一步證實內容是保存在緩衝區的。這一點在讀者往後的開發中要特別引發注意。

提問:使用字節流好仍是字符流好?

學習完字節流和字符流的基本操做後,已經大概地明白了操做流程的各個區別,那麼在開發中是使用字節流好仍是字符流好呢?

回答:使用字節流更好。

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


字節流與字符流主要的區別是他們的的處理方式

流分類:
1.Java的字節流
   InputStream是全部字節輸入流的祖先,而OutputStream是全部字節輸出流的祖先。
2.Java的字符流
  Reader是全部讀取字符串輸入流的祖先,而writer是全部輸出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象類。因此不能直接new 
字節流與字符流主要的區別是他們的的處理方式
字節流是最基本的,採用ASCII編碼,全部的InputStream和OutputStream的子類都是,主要用在處理二進制數據,它是按字節來處理的
但實際中不少的數據是文本,又提出了字符流的概念,採用Unicode編碼.它是按虛擬機的encode來處理,也就是要進行字符集的轉化
這兩個之間經過 InputStreamReader,OutputStreamWriter來關聯,其實是經過byte[]和String來關聯
你只要把java處理字節流和字符流的類搞清楚就好了!   
                字節流           字符流   
  輸入       InputStream         Reader   
  輸出       OutputStream       Writer   
  其它的類都是繼承這四個基本類的!
在從字節流轉化爲字符流時,實際上就是byte[]轉化爲String時, public String(byte bytes[], String charsetName) 有一個關鍵的參數字符集編碼,一般咱們都省略了,那系統就用操做系統的lang 而在字符流轉化爲字節流時,其實是String轉化爲byte[]時, byte[]    String.getBytes(String charsetName) 也是同樣的道理 至於java.io中還出現了許多其餘的流,按主要是爲了提升性能和使用方便, 如BufferedInputStream,PipedInputStream等
相關文章
相關標籤/搜索