天天看點

IO(過濾器流)

意義:在基本的輸入和輸出流中,我們都是和位元組打交道,但是在java類庫中有些我們常用的格式來應付我們日常的工作,對于我這樣的少年來說,都學不完啊,例如FTP傳輸檔案的格式為zip格式。

過濾器流有兩個版本:過濾器(處理位元組,例如壓縮和緩沖這些)和閱讀/書寫器(主要是使用編碼格式處理文本)。這裡我重點複習過濾器。

執行個體:

IO(過濾器流)

一。緩沖流(BufferedOutputStream和BufferedInputStream)

主要作用就是緩沖。

方法:每個過濾器輸出流都和OutputStream相同的write(),close(),flush()方法(繼承複習父親方法的緣故)。每個過濾器輸入流都和InputStream相同的read(),close()方法。

一般用法:通過構造方法和底層流連結--如上面的箭頭。例如緩沖檔案的輸入:

InputStream filein = new FileInputStream("1.txt");
BufferedInputStream bfilein = BufferedInputStream (filein );
           

因為前面說過,過濾器也有像底層流的read/write/flush等方法(因為檢視源碼就可以知道BufferedInputStream間接繼承了FilterInputStream,完全是内部是實作!),是以按照一般規則,構造好過濾器後,以後就可以使用這個鍊最後一個過濾器來對位元組操作,而不是用底層流的方法了(FileInputStream),這樣你就不會對底層流進行讀寫操作,進而不會破壞緩沖區。

具體緩沖流:

BufferedOutputStream--将資料緩沖在緩沖區(一個位元組數組)中,知道緩沖區滿或者刷出流,然後一次性寫入底層流(見上圖)。可見,對于網絡傳輸的較大代價,一次寫入很多資料比多次寫入少量資料開銷更小。

執行個體:

public class FileOutputStreamTest {
		 public static void main(String[] args) {
		    InputStream fileInputStream = null;					
			try {
				File file = new File("save.txt");
				
				fileInputStream = new BufferedInputStream(new FileInputStream(file));
				int x ;
				
				while(( x = fileInputStream.read())!= -1){
					System.out.print((char)x);
				}
				
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				if(fileInputStream!=null){
					try{
						fileInputStream.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
			
}
}
           

BufferedOutputStream--也有一個位元組數組最為緩沖區,當調用read()方法時,會請求緩沖區獲得位元組,隻用當緩沖區(位元組數組)沒有位元組了,才會從底層流(FileInputStream)讀取位元組,這是它就會盡量讀取,不管你是否立即需要緩沖區中的位元組。以為從磁盤讀取位元組,一個位元組和一百位元組幾乎沒有書讀差距,是以緩沖區可以明顯提升性能,明顯來開對于網絡不明顯,因為巨大的封包段開銷,例如額外的求和位元組,網速等等。

執行個體:省略。

構造方法:BufferedOutputStream和BufferedOutputStream的構造方法差不多,以BufferedOutputStream代表複習一下

BufferedOutputStream(InputStream in):常用。

BufferedOutputStream(InputStream in, int bufferSize):指定緩沖區數組大小,預設為2048。

其他方法:

BufferedInputStream和BufferedOutputStream一樣都是覆寫了原始流的方法(InputStream/OutputStream),沒有新的方法,可以比喻為先進的可以緩沖位元組的原始流,其中BufferedInputStream的有兩個可以讀取多個位元組的read()方法,進而将底層流讀取的位元組盡量放進緩沖區,隻有三種情況read()傳回讀取到的位元組數:1。讀完了2。數組填滿3。底層流阻塞。

BufferedOutputStream的特殊在于,他是把你要“寄”出去的資料緩存起來,他也隻有在緩沖區的資料慢時才“寄”出去,但是像我這樣的小弟哪有那麼多的資料要發啊,此時使用flush()方法把緩沖區還不願意發出去的“小"資料刷出去才行。

二。資料流(DataInputStream和DataOutputStream)

主要作用就是資料格式的方面了。

IO(過濾器流)

他就是把相應的資料格式讀取為二進制自己在中間中間媒體中傳輸,

方法:略。

當然由于繼承的原因,DataOutputStream也有write(),close(),flush()方法。DataInputStream也有read(),close()方法。

執行個體:

public class DataOutputStreamTest {
		 public static void main(String[] args) {
			 DataOutputStream out = null;	
			 //使用OutputStream的話就無法使用writeChars,因為這是新方法
			 //OutputStream fileOutputStream = null;
			try {
				File file = new File("save.txt");
				
				out =new  DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
				String yuege = "yuege";
				//byte[] yuegeByte = yuege.getBytes();
				
				out.writeBytes(yuege);
				
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				if(out!=null){
					try{
						out.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
			
}
}