Java的流體系十分龐大,我們來看看體系圖:
創(chuàng)新互聯(lián)建站主營花垣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,App定制開發(fā),花垣h5成都小程序開發(fā)搭建,花垣網(wǎng)站營銷推廣歡迎花垣等地區(qū)企業(yè)咨詢這么龐大的體系里面,常用的就那么幾個,我們把它們抽取出來,如下圖:
一:字節(jié)流
1:字節(jié)輸入流
字節(jié)輸入流的抽象基類是InputStream,常用的子類是 FileInputStream和BufferedInputStream。
1)FileInputStream
文件字節(jié)輸入流:一切文件在系統(tǒng)中都是以字節(jié)的形式保存的,無論你是文檔文件、視頻文件、音頻文件...,需要讀取這些文件都可以用FileInputStream去讀取其保存在存儲介質(zhì)(磁盤等)上的字節(jié)序列。
FileInputStream在創(chuàng)建時通過把文件名作為構(gòu)造參數(shù)連接到該文件的字節(jié)內(nèi)容,建立起字節(jié)流傳輸通道。
然后通過 read()、read(byte[])、read(byte[],int begin,int len) 三種方法從字節(jié)流中讀取 一個字節(jié)、一組字節(jié)。
2)BufferedInputStream
帶緩沖的字節(jié)輸入流:上面我們知道文件字節(jié)輸入流的讀取時,是直接同字節(jié)流中讀取的。由于字節(jié)流是與硬件(存儲介質(zhì))進行的讀取,所以速度較慢。而CPU需要使用數(shù)據(jù)時通過read()、read(byte[])讀取數(shù)據(jù)時就要受到硬件IO的慢速度限制。我們又知道,CPU與內(nèi)存發(fā)生的讀寫速度比硬件IO快10倍不止,所以優(yōu)化讀寫的思路就有了:在內(nèi)存中建立緩存區(qū),先把存儲介質(zhì)中的字節(jié)讀取到緩存區(qū)中。CPU需要數(shù)據(jù)時直接從緩沖區(qū)讀就行了,緩沖區(qū)要足夠大,在被讀完后又觸發(fā)fill()函數(shù)自動從存儲介質(zhì)的文件字節(jié)內(nèi)容中讀取字節(jié)存儲到緩沖區(qū)數(shù)組。
BufferedInputStream 內(nèi)部有一個緩沖區(qū),默認大小為8M,每次調(diào)用read方法的時候,它首先嘗試從緩沖區(qū)里讀取數(shù)據(jù),若讀取失?。ň彌_區(qū)無可讀數(shù)據(jù)),則選擇從物理數(shù)據(jù)源 (譬如文件)讀取新數(shù)據(jù)(這里會嘗試盡可能讀取多的字節(jié))放入到緩沖區(qū)中,最后再將緩沖區(qū)中的內(nèi)容返回給用戶.由于從緩沖區(qū)里讀取數(shù)據(jù)遠比直接從存儲介質(zhì)讀取速度快,所以BufferedInputStream的效率很高。
public class OutputStreamWriter extends Writer { // 流編碼類,所有操作都交給它完成。 private final StreamEncoder se; // 創(chuàng)建使用指定字符的OutputStreamWriter。 public OutputStreamWriter(OutputStream out, String charsetName) throws UnsupportedEncodingException { super(out); if (charsetName == null) throw new NullPointerException("charsetName"); se = StreamEncoder.forOutputStreamWriter(out, this, charsetName); } // 創(chuàng)建使用默認字符的OutputStreamWriter。 public OutputStreamWriter(OutputStream out) { super(out); try { se = StreamEncoder.forOutputStreamWriter(out, this, (String)null); } catch (UnsupportedEncodingException e) { throw new Error(e); } } // 創(chuàng)建使用指定字符集的OutputStreamWriter。 public OutputStreamWriter(OutputStream out, Charset cs) { super(out); if (cs == null) throw new NullPointerException("charset"); se = StreamEncoder.forOutputStreamWriter(out, this, cs); } // 創(chuàng)建使用指定字符集編碼器的OutputStreamWriter。 public OutputStreamWriter(OutputStream out, CharsetEncoder enc) { super(out); if (enc == null) throw new NullPointerException("charset encoder"); se = StreamEncoder.forOutputStreamWriter(out, this, enc); } // 返回該流使用的字符編碼名。如果流已經(jīng)關(guān)閉,則此方法可能返回 null。 public String getEncoding() { return se.getEncoding(); } // 刷新輸出緩沖區(qū)到底層字節(jié)流,而不刷新字節(jié)流本身。該方法可以被PrintStream調(diào)用。 void flushBuffer() throws IOException { se.flushBuffer(); } // 寫入單個字符 public void write(int c) throws IOException { se.write(c); } // 寫入字符數(shù)組的一部分 public void write(char cbuf[], int off, int len) throws IOException { se.write(cbuf, off, len); } // 寫入字符串的一部分 public void write(String str, int off, int len) throws IOException { se.write(str, off, len); } // 刷新該流??梢园l(fā)現(xiàn),刷新緩沖區(qū)其實是通過流編碼類的flush()實現(xiàn)的,故可以看出,緩沖區(qū)是流編碼類自帶的而不是OutputStreamWriter實現(xiàn)的。 public void flush() throws IOException { se.flush(); } // 關(guān)閉該流。 public void close() throws IOException { se.close(); } }
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。