1. 程式人生 > >inputStream 和 reader 區別

inputStream 和 reader 區別

InputStream和Reader區別

InputStream,OutputStream  前者為位元組輸入流,後者為位元組輸出流。
Reader   Writer  前者為字元輸入流,後者為字元輸出流。
四個均為抽象類。
fileInputStream 是InputStream 的實現類  
fileReader 是Reader 的實現類
位元組流讀取單位為一個位元組,字元流讀取單位為一個字元  所以讀取漢字的時候,如果用位元組流就會導致讀出來亂碼。這是最常用的地方  其他基本用法差不多。。

BufferedInputStream是套在某個其他的InputStream外,起著快取的功能,用來改善裡面那個InputStream的效能(如果可能的話),它自己不能脫離裡面那個單獨存在。FileInputStream是讀取一個檔案來作InputStream。所以你可以把BufferedInputStream套在FileInputStream外,來改善FileInputStream的效能。   

 

FileInputStream與BufferedInputStream區別:

FileInputStream是位元組流,BufferedInputStream

是位元組緩衝流,使用BufferedInputStream讀資源比FileInputStream讀取資源的效率高(BufferedInputStream的read方法會讀取儘可能多的位元組),且FileInputStream物件的read方法會出現阻塞;

 

FileInputStream與FileReader區別:

FileInputStream是位元組流,FileReader是字元流,用位元組流讀取中文的時候,可能會出現亂碼,而用字元流則不會出現亂碼,而且用字元流讀取的速度比位元組流要快;

 

ObjectOutputStream與ByteArrayOutputStream的區別:

ObjectOutputStream可以將java物件寫入outputstream流中(序列化),然後進行持久化,此物件必須是實現了java.io.Serializable 介面;

ByteArrayOutputStream是將資料寫入byte陣列中;

 

瞭解“堵塞”的意思吧! 假設一個檔案的長度是100個位元組,要將之讀取到記憶體中,再假設您每次只讀取10個位元組,那麼讀完整個檔案是不是讀取10次的呀?
假設老闆讓你完成100件事情,老闆說,你每天只完成10件就可以了,難道你非得等到第十天才完成第100件事情嗎?有一天您在中午下班前就完成了10件事情,下午您不妨多幹一點,那麼也許在第9天的時候就完成了100件事情。
同理,BufferedInputStream有可能會讀取比您規定的更多的東西到記憶體,以減少訪問IO的次數, 總之您要記住一句話,訪問IO的次數越少,效能就越高,原因就在於CPU和記憶體的速度》》》》遠大於硬碟或其他外部裝置的速度。
換一個不太恰當的例子來說,您和您的朋友一起去登山,你朋友太不給力了,走一會兒就要休息,而您呢,您的體力比他要好的多,根本不需要休息,所以每當他休息的時候,您得等著他,您那時候什麼也幹不了,這就叫堵塞,堵塞就是說您有能力幹某事,但是迫於某種原因您什麼也幹不了,只能乾等。所以您朋友休息的次數越少,你們兩個到達山頂所花費的時間就越少。CPU訪問硬碟的次數越少,程式就越快。BufferedInputStream在小型檔案中的效能優勢無法體現出來,假設您將以個2G大小的檔案從D盤完全複製到E盤,效能之優勢便展露無疑!

複製程式碼

import java.io.*;
public class SS {
    public static void main(String[] args) throws Exception {
        File f = new File("d:\\大型資料庫檔案.mdf");    
        FileInputStream fis = new FileInputStream(f);
        //如果下面的語句使用BufferedOutputStream來修飾則帶來更好的效能現。
        FileOutputStream fos = new FileOutputStream("e:\\" + f.getName());    
        int length = 0;
        byte[] b = new byte[1024];
        while((length = fis.read(b)) != -1)
        {
            fos.write(b, 0, length);
        }
        fos.close();
        fis.close();
    }
}

複製程式碼