(最近剛來到簡書平臺,以前在CSDN上寫的一些東西,也在逐漸的移到這兒來宵呛,有些篇幅是很早的時候?qū)懴碌模虼丝赡軙吹揭恍﹥?nèi)容雜亂的文章夕凝,對此深感抱歉宝穗,以下為正文)
正文
本篇講述的是Java IO包中的FilterInputStream和FilterOutputStream類,老規(guī)矩码秉,先附上兩個類的源碼讽营。
FilterInputStream
package java.io;
public class FilterInputStream extends InputStream {
/**
* 內(nèi)部聲明了一個InputStream對象的句柄,用于接收傳入的InputStream對象泡徙。同時用volatile關(guān)鍵字修飾橱鹏,確保了數(shù)據(jù)改變時的可見性。
*/
protected volatile InputStream in;
/**
* 一個被protected關(guān)鍵字修飾的構(gòu)造漢方堪藐,含義一個參數(shù)莉兰,參數(shù)類型為InputStream類型,將傳入的InputStream對象賦值給聲明的句柄in礁竞。
*/
protected FilterInputStream(InputStream in) {
this.in = in;
}
/**
* 定義了一個不帶參的read方法糖荒,只是簡單的調(diào)用了InputStream的read方法,每次讀取一個字節(jié)的數(shù)據(jù)模捂,用于讀取流中數(shù)據(jù)捶朵。
*/
public int read() throws IOException {
return in.read();
}
/**
* 定義了一個帶一個參數(shù)的read方法,內(nèi)部實(shí)際上是調(diào)用了InputStream對應(yīng)的read方法狂男,每次可以通過傳入的字節(jié)數(shù)組作為緩存區(qū)讀取一片數(shù)據(jù)综看。
*/
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}
/**
* 定義了一個帶三個參數(shù)的read方法,內(nèi)部實(shí)際上是調(diào)用了InputStream對應(yīng)的read方法岖食『毂可以通過傳入的數(shù)組作為緩存,另外兩個參數(shù)控制的是從緩存中讀取的位置以
* 及長度,每次可以讀取一片數(shù)據(jù)析珊。
*/
public int read(byte b[], int off, int len) throws IOException {
return in.read(b, off, len);
}
/**
* 定義了一個帶一個參數(shù)的skip方法羡鸥,內(nèi)部實(shí)質(zhì)是調(diào)用InputStream中的skip方法。用于跳過指定長度的數(shù)據(jù)忠寻,進(jìn)行數(shù)據(jù)讀取惧浴。
*/
public long skip(long n) throws IOException {
return in.skip(n);
}
/**
* 定義了一個available方法,內(nèi)部實(shí)質(zhì)是調(diào)用了InputStream的available方法奕剃,用于獲取流中仍可以讀取字節(jié)數(shù)衷旅。
*/
public int available() throws IOException {
return in.available();
}
/**
* 定義了一個close方法,內(nèi)部實(shí)質(zhì)是調(diào)用了InputStream的close方法祭饭,用于關(guān)閉流芜茵。
*/
public void close() throws IOException {
in.close();
}
/**
* 定義了一個mark方法,內(nèi)部實(shí)質(zhì)是調(diào)用了InputStream的mark方法倡蝙,用于在流中留下標(biāo)記九串,與reset方法聯(lián)合使用,可以回到標(biāo)記處繼續(xù)讀取數(shù)據(jù)寺鸥。
*/
public synchronized void mark(int readlimit) {
in.mark(readlimit);
}
/**
* 定義了一個reset方法猪钮,內(nèi)部實(shí)質(zhì)是調(diào)用了InputStream的reset方法,與mark方法聯(lián)合使用胆建,可以回到標(biāo)記的地方繼續(xù)讀取數(shù)據(jù)烤低。
*/
public synchronized void reset() throws IOException {
in.reset();
}
/**
* 定義了一個markSupported方法,內(nèi)部實(shí)質(zhì)是調(diào)用了InputStream的markSupported方法笆载,返回的boolean值表示當(dāng)前流是否支持標(biāo)記功能扑馁。
*/
public boolean markSupported() {
return in.markSupported();
}
}
FilterOutputStream:
package java.io;
public class FilterOutputStream extends OutputStream {
/**
* 內(nèi)部聲明了一個OutputStream對象的句柄,用于接收傳入的OutputStream對象凉驻。
*/
protected OutputStream out;
/**
* 一個帶一個參數(shù)的構(gòu)造函數(shù)腻要,參數(shù)為一個OutputStream對象,將傳入的OutputStream對象賦值給聲明的句柄out涝登。
*/
public FilterOutputStream(OutputStream out) {
this.out = out;
}
/**
* 定義了一個write方法雄家,內(nèi)部實(shí)質(zhì)調(diào)用的是OutputStream對象的write方法,每次寫人一個字節(jié)胀滚。
*/
public void write(int b) throws IOException {
out.write(b);
}
/**
* 定義了一個帶一個參數(shù)的write方法趟济,參數(shù)類型為一個byte類型數(shù)組,內(nèi)部實(shí)質(zhì)上調(diào)用了OutputStream對象的write方法咽笼。
*/
public void write(byte b[]) throws IOException {
write(b, 0, b.length);
}
/**
* 內(nèi)部實(shí)質(zhì)上調(diào)用的OutputStream的write方法顷编,一次可以寫入一段數(shù)據(jù)。
*/
public void write(byte b[], int off, int len) throws IOException {
if ((off | len | (b.length - (len + off)) | (off + len)) < 0)
throw new IndexOutOfBoundsException();
for (int i = 0 ; i < len ; i++) {
write(b[off + i]);
}
}
/**
* 定義了一個flush方法褐荷,內(nèi)部實(shí)質(zhì)上是調(diào)用了OutputStream對象的flush方法勾效,保證數(shù)據(jù)已從緩存寫入到目的地。
*/
public void flush() throws IOException {
out.flush();
}
/**
* 使用了try-resource的方式關(guān)閉流叛甫,同時調(diào)用flush方法层宫,確保數(shù)據(jù)已經(jīng)寫出。
*/
@SuppressWarnings("try")
public void close() throws IOException {
try (OutputStream ostream = out) {
flush();
}
}
}
從上面的源碼中可以看出其监,兩個類中很多的方法其實(shí)僅僅只是直接調(diào)用了OutputStream的對應(yīng)方法萌腿。那么它們的意義何在呢,其實(shí)這里面牽扯到了一種設(shè)計模式抖苦,就是裝飾者模式(設(shè)計模式會在后面的篇幅中詳細(xì)描述毁菱,這里就不細(xì)說了)。
這兩個類本身的意義并不在與實(shí)現(xiàn)了什么而是定義了一個標(biāo)準(zhǔn)锌历,具體的實(shí)現(xiàn)都是由它們的子類去實(shí)現(xiàn)的贮庞,如BufferedInputStream / BufferedOutputStram,DataInputStream / DataOutputStream究西,PrintStream等窗慎。它們都為InputStream / OutputStream添加了一些新的功能。
因?yàn)檫@兩個類只是相當(dāng)于定義了一個標(biāo)準(zhǔn)卤材,但從功能上看與InputStream和OutputStream類似遮斥,所以就不再舉例說明了。
以上為本篇的全部內(nèi)容扇丛。