意義:在基本的輸入和輸出流中,我們都是和位元組打交道,但是在java類庫中有些我們常用的格式來應付我們日常的工作,對于我這樣的少年來說,都學不完啊,例如FTP傳輸檔案的格式為zip格式。
過濾器流有兩個版本:過濾器(處理位元組,例如壓縮和緩沖這些)和閱讀/書寫器(主要是使用編碼格式處理文本)。這裡我重點複習過濾器。
執行個體:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TMyQzMwQDMwIDOxITM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
一。緩沖流(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)
主要作用就是資料格式的方面了。
他就是把相應的資料格式讀取為二進制自己在中間中間媒體中傳輸,
方法:略。
當然由于繼承的原因,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();
}
}
}
}
}