天天看點

java位元組流與字元流的差別java位元組流與字元流的差別

java位元組流與字元流的差別

主要差別有:

實際上位元組流在操作時本身不會用到緩沖區(記憶體),是檔案本身直接操作的,而字元流在操作時使用了緩沖區,通過緩沖區再操作檔案,看圖:

java位元組流與字元流的差別java位元組流與字元流的差別

下面以兩個寫檔案的操作為主進行比較,但是在操作時位元組流和字元流的操作完成之後都不關閉輸出流。

範例:使用位元組流不關閉執行

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();                  
// 此時沒有關閉    
        }    
    }   
           

運作結果為:Hello World!!!

此時沒有關閉位元組流操作,但是檔案中也依然存在了輸出的内容,證明位元組流是直接操作檔案本身的

範例:使用字元流不關閉執行

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();                   
// 此時沒有關閉    
    }    
}   
           

運作結果:空

程式運作後會發現檔案中沒有任何内容,這是因為字元流操作時使用了緩沖區,而 在關閉字元流時會強制性地将緩沖區中的内容進行輸出,但是如果程式沒有關閉,則緩沖區中的内容是無法輸出的,是以得出結論:字元流使用了緩沖區,而位元組流沒有使用緩沖區。

位元組流在操作檔案時,即使不關閉資源(close方法),檔案也能輸出,但是如果字元流不使用close方法的話,則不會輸出任何内容,說明字元流用的是緩沖區,并且可以使用flush方法強制進行重新整理緩沖區,這時才能在不close的情況下輸出内容

在字元流的操作中,所有的字元都是在記憶體中形成的,在輸出前會将所有的内容暫時儲存在記憶體之中,是以使用了緩沖區暫存資料。如果想在不關閉時也可以将字元流的内容全部輸出,則可以使用Writer類中的flush()方法完成。

範例:強制性清空緩沖區

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();                
// 此時沒有關閉    
    }    
}   
           

運作結果為:Hello World!!!

此時,檔案中已經存在了内容,更進一步證明内容是儲存在緩沖區的。這一點在讀者日後的開發中要特别引起注意。

提問:使用位元組流好還是字元流好?學習完位元組流和字元流的基本操作後,已經大概地明白了操作流程的各個差別,那麼在開發中是使用位元組流好還是字元流好呢?

回答:使用位元組流更好。在回答之前,先為讀者講解這樣的一個概念,所有的檔案在硬碟或在傳輸時都是以位元組的方式進行的,包括圖檔等都是按位元組的方式存儲的,而字元是隻有在記憶體中才會形成,是以在開發中,位元組流使用較為廣泛。