inputStream 和 reader 區別
InputStream和Reader區別
InputStream,OutputStream 前者為位元組輸入流,後者為位元組輸出流。
Reader Writer 前者為字元輸入流,後者為字元輸出流。
四個均為抽象類。
fileInputStream 是InputStream 的實現類
fileReader 是Reader 的實現類
位元組流讀取單位為一個位元組,字元流讀取單位為一個字元 所以讀取漢字的時候,如果用位元組流就會導致讀出來亂碼。這是最常用的地方 其他基本用法差不多。。
BufferedInputStream是套在某個其他的InputStream外,起著快取的功能,用來改善裡面那個InputStream的效能(如果可能的話),它自己不能脫離裡面那個單獨存在。FileInputStream是讀取一個檔案來作InputStream。所以你可以把BufferedInputStream套在FileInputStream外,來改善FileInputStream的效能。
FileInputStream與BufferedInputStream區別:
FileInputStream是位元組流,BufferedInputStream
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(); } }