學(xué)習(xí)Java之IO流中有哪些復(fù)雜的API
一. IO流的API
1. API分類(lèi)
Java中關(guān)于IO流的API,總的來(lái)說(shuō)共有四大類(lèi),分別如下:
- InputStream---字節(jié)輸入流;
- OutputStream---字節(jié)輸出流;
- Reader-----字符輸入流;
- Writer------字符輸出流。
在Java中,所有輸入流類(lèi)都是 InputStream(字節(jié)輸入流)和 Reader(字符輸入流)的子類(lèi),其中InputStream類(lèi)是字節(jié)輸入流的抽象類(lèi),Reader是字符輸入流的抽象類(lèi);所有的輸出流類(lèi)都是OutputStream(字節(jié)輸出流)和 Writer(字符輸出流)的子類(lèi),其中OutputStream類(lèi)是字節(jié)輸出流的抽象類(lèi),Writer是字符輸出流的抽象類(lèi)。
1.1 字節(jié)流的抽象基類(lèi)
其中,字節(jié)流主要有兩個(gè)類(lèi):InputStream和OutputStream,分別用于讀取和寫(xiě)入字節(jié)數(shù)據(jù)。所有的字節(jié)輸入流類(lèi)都是InputStream的子類(lèi),所有的字節(jié)輸出流類(lèi)都是OutputStream的子類(lèi),這兩個(gè)類(lèi)都是抽象類(lèi),不能直接使用,需要使用其子類(lèi)進(jìn)行實(shí)例化。InputStream與OutputStream的關(guān)系如下圖所示:
InputStream和OutputStream的子類(lèi)包括:
- FileInputStream和FileOutputStream:用于文件的讀寫(xiě)操作;
- ByteArrayInputStream和ByteArrayOutputStream:用于在內(nèi)存中讀寫(xiě)二進(jìn)制數(shù)據(jù);
- PipedInputStream和PipedOutputStream:用于線程間的數(shù)據(jù)傳輸;
- FilterInputStream和FilterOutputStream:用于裝飾其他流,增加流的功能。
1.2 字符流的抽象基類(lèi)
Java提供了兩個(gè)字符流的抽象類(lèi):Reader 和 Writer,所有的字符輸入流類(lèi)都是Reader的子類(lèi),所有的字符輸出流類(lèi)都是Writer的子類(lèi)。它們是抽象類(lèi),不能直接使用,我們需要使用它們的子類(lèi)來(lái)進(jìn)行具體的操作。
Reader和Writer的本質(zhì)其實(shí)也是一個(gè)能自動(dòng)編解碼的InputStream和OutputStream。Reader和Writer的數(shù)據(jù)源雖然是字節(jié),但我們讀入寫(xiě)出的數(shù)據(jù)都是char類(lèi)型的字符,這是因?yàn)镽eader和Writer的內(nèi)部會(huì)把讀入寫(xiě)出的byte解碼編碼轉(zhuǎn)換成char。Reader與Writer類(lèi)關(guān)系如下圖所示:
其中的Reader類(lèi)用來(lái)讀取字符流的抽象類(lèi),它提供了一些用來(lái)讀取字符的方法,我們可以使用它的子類(lèi)來(lái)進(jìn)行文件讀取、網(wǎng)絡(luò)讀取等操作。常用的Reader子類(lèi)如下:
- FileReader:用于讀取文件字符流。
- InputStreamReader:從字節(jié)流到字符流的橋梁,它可以將字節(jié)流轉(zhuǎn)換為字符流。
- CharArrayReader:可以從字符數(shù)組中讀取字符流。
- BufferedReader:可以從字符流中緩存讀取數(shù)據(jù),提高效率。
而Writer類(lèi)是用來(lái)寫(xiě)入字符流的抽象類(lèi),它提供了一些寫(xiě)入字符的方法,我們可以使用它的子類(lèi)來(lái)進(jìn)行文件寫(xiě)入、網(wǎng)絡(luò)寫(xiě)入等操作。常用的 Writer 子類(lèi):
- FileWriter:用于寫(xiě)入文件字符流。
- OutputStreamWriter:從字符流到字節(jié)流的橋梁,它可以將字符流轉(zhuǎn)換為字節(jié)流。
- CharArrayWriter:可以將字符流寫(xiě)入到字符數(shù)組中。
- BufferedWriter:可以緩存寫(xiě)入字符流,提高效率。
1.3 小結(jié)
對(duì)字節(jié)流和字符流的關(guān)系,我們可以用下圖概括展示:
Java中凡是由這四個(gè)基類(lèi)派生出來(lái)的子類(lèi)名稱(chēng),都會(huì)以其父類(lèi)名稱(chēng)作為子類(lèi)名稱(chēng)的后綴,如InputStream的子類(lèi)FileInputStream,Reader的子類(lèi)FileReader。
接下來(lái)再分別把這4個(gè)基類(lèi)里的核心子類(lèi)及其API方法介紹一下。
2. InputStream字節(jié)輸入流
2.1 InputStream的常見(jiàn)子類(lèi)
以下是InputStream的常見(jiàn)子類(lèi),包括節(jié)點(diǎn)流和處理流兩種類(lèi)型。
2.2 InputStream的常用方法
以下是InputStream類(lèi)中的常用API方法。
int available() 從下一次調(diào)用此輸入流的方法返回可從該輸入流讀取(或跳過(guò))的字節(jié)數(shù),而不會(huì)阻塞。 void close() 關(guān)閉此輸入流并釋放與流相關(guān)聯(lián)的任何系統(tǒng)資源。 void mark(int readlimit) 標(biāo)記此輸入流中的當(dāng)前位置。 boolean markSupported() 測(cè)試此輸入流是否支持 mark和 reset方法。 abstract int read() 從輸入流讀取數(shù)據(jù)的下一個(gè)字節(jié)。 int read(byte[] b) 從輸入流中讀取一些字節(jié)數(shù),并將它們存儲(chǔ)到緩沖器陣列 b。 int read(byte[] b, int off, int len) 從輸入流讀取最多 len個(gè)字節(jié)的數(shù)據(jù)到字節(jié)數(shù)組。 byte[] readAllBytes() 從輸入流讀取所有剩余字節(jié)。 int readNBytes(byte[] b, int off, int len) 將所請(qǐng)求的字節(jié)數(shù)從輸入流讀入給定的字節(jié)數(shù)組。 void reset() 將此流重新定位到最后在此輸入流上調(diào)用 mark方法時(shí)的位置。 long skip(long n) 跳過(guò)并丟棄來(lái)自此輸入流的 n字節(jié)的數(shù)據(jù)。 long transferTo(OutputStream out) 從該輸入流中讀取所有字節(jié),并按讀取的順序?qū)⒆止?jié)寫(xiě)入給定的輸出流。
3. OutputStream字節(jié)輸出流
3.1 OutputStream的常見(jiàn)子類(lèi)
以下是OutputStream的常見(jiàn)子類(lèi),包括節(jié)點(diǎn)流和處理流兩種類(lèi)型。
3.2 OutputStream的常用方法
以下是OutputStream中的常用方法。
void close() 關(guān)閉此輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。 void flush() 刷新此輸出流并強(qiáng)制任何緩沖的輸出字節(jié)被寫(xiě)出。 void write(byte[] b) 將 b.length字節(jié)從指定的字節(jié)數(shù)組寫(xiě)入此輸出流。 void write(byte[] b, int off, int len) 從指定的字節(jié)數(shù)組寫(xiě)入 len字節(jié),從偏移量 off開(kāi)始輸出到此輸出流。 abstract void write(int b) 將指定的字節(jié)寫(xiě)入此輸出流。
4. Reader字符輸入流
4.1 Reader的常見(jiàn)子類(lèi)
以下是Reader的常見(jiàn)子類(lèi),包括節(jié)點(diǎn)流和處理流兩種類(lèi)型。
4.2 Reader的常用方法
以下是Reader類(lèi)中的常用方法。
abstract void close() 關(guān)閉流并釋放與之相關(guān)聯(lián)的任何系統(tǒng)資源。 void mark(int readAheadLimit) 標(biāo)記流中的當(dāng)前位置。 boolean markSupported() 告訴這個(gè)流是否支持mark()操作。 int read() 讀一個(gè)字符 int read(char[] cbuf) 將字符讀入數(shù)組。 abstract int read(char[] cbuf, int off, int len) 將字符讀入數(shù)組的一部分。 int read(CharBuffer target) 嘗試將字符讀入指定的字符緩沖區(qū)。 boolean ready() 告訴這個(gè)流是否準(zhǔn)備好被讀取。 void reset() 重置流。 long skip(long n) 跳過(guò)字符
5. Writer字符輸出流
5.1 Writer的常見(jiàn)子類(lèi)
以下是Writer的常見(jiàn)子類(lèi),包括節(jié)點(diǎn)流和處理流兩種類(lèi)型。
5.2 Writer的常見(jiàn)方法
以下是Writer類(lèi)中的常用方法。
Writer append(char c) 將指定的字符附加到此writer Writer append(CharSequence csq) 將指定的字符序列附加到此writer Writer append(CharSequence csq, int start, int end) 將指定字符序列的子序列附加到此writer abstract void close() 關(guān)閉流,先刷新 abstract void flush() 刷新流 void write(char[] cbuf) 寫(xiě)入一個(gè)字符數(shù)組。 abstract void write(char[] cbuf, int off, int len) 寫(xiě)入字符數(shù)組的一部分 void write(int c) 寫(xiě)一個(gè)字符 void write(String str) 寫(xiě)一個(gè)字符串 void write(String str, int off, int len) 寫(xiě)一個(gè)字符串的一部分
6. IO流梳理總結(jié)
6.1 API完整類(lèi)關(guān)系
最后,為了讓大家對(duì)IO流有一個(gè)完整清晰地認(rèn)知,針對(duì)以上這些java.io包中的API類(lèi)關(guān)系,給大家繪制了下圖:
6.2 API歸納
從上圖中,我們可以看到,Java中有各種各樣的IO流API類(lèi),如果我們對(duì)這些API再細(xì)分一下,又可以歸納如下。
文件操作流:
- FileInputStream:字節(jié)輸入流;
- FileOutputStream:字節(jié)輸出流;
- FileReader:字符輸入流;
- FileWriter:字符輸出流
管道操作流:
- PipedInputStream:管道字節(jié)輸入流;
- PipedOutStream:管道字節(jié)輸出流;
- PipedReader:管道字符輸入流;
- PipedWriter:管道字符輸出流
注意: PipedInputStream的實(shí)例要和PipedOutputStream的實(shí)例共同使用,共同完成管道的讀取寫(xiě)入操作,主要用于線程操作。
字節(jié)/字符數(shù)組操作流:
- ByteArrayInputStream:字節(jié)數(shù)組輸入流;
- ByteArrayOutputStream:字節(jié)數(shù)組輸出流;
- CharArrayReader:字符數(shù)組輸入流;
- CharArrayWriter:字符數(shù)組輸出流
Buffered緩沖流:
- BufferedInputStream:字節(jié)緩沖區(qū)輸入流;
- BufferedOutputStream:字節(jié)緩沖區(qū)輸出流;
- BufferedReader:字符緩沖區(qū)輸入流;
- BufferedWriter:字符緩沖區(qū)輸出流
注意: 這是帶緩沖區(qū)的處理流,緩沖流的底層從具體設(shè)備上獲取數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)到緩沖區(qū)的數(shù)組內(nèi)。通過(guò)緩沖區(qū)的read()方法從緩沖區(qū)獲取具體的字符數(shù)據(jù),這樣就避免了每次都和硬盤(pán)打交道,提高了數(shù)據(jù)訪問(wèn)效率。
轉(zhuǎn)化流:
- InputStreamReader:字符節(jié)點(diǎn)輸入流
- OutputStreamWriter:字符節(jié)點(diǎn)輸出流
注意: 轉(zhuǎn)換流,從字面意思可以看出它是字節(jié)流與字符流之間的橋梁,可以將字節(jié)轉(zhuǎn)為字符,或者將字符轉(zhuǎn)為字節(jié)。
數(shù)據(jù)流:
- DataInputStream:
- DataOutputStream:
注意: 數(shù)據(jù)流可以解決我們輸出數(shù)據(jù)類(lèi)型的困難,數(shù)據(jù)流可以直接輸出float類(lèi)型或long類(lèi)型,提高了數(shù)據(jù)讀寫(xiě)的效率。
打印流:
- PrintStream
- PrintWriter
注意: 一般是打印到控制臺(tái),可以進(jìn)行控制打印的地方。
對(duì)象流:
- ObjectInputStream
- ObjectOutputStream
注意: ObjectOutputStream可以將Java對(duì)象的原始數(shù)據(jù)類(lèi)型寫(xiě)出到文件,實(shí)現(xiàn)對(duì)象的持久存儲(chǔ);ObjectInputStream反序列化流,將之前使用ObjectOutputStream序列化的原始數(shù)據(jù)恢復(fù)為對(duì)象。
序列化流:
- SequenceInputStream
對(duì)于以上這些API類(lèi),大家先不用去記憶,只需要先有一個(gè)整體的印象即可。后面我們會(huì)在具體的案例中學(xué)習(xí)這些API,以后這些API用多了,自然就記住了。
二. 結(jié)語(yǔ)
至此,就把IO流相關(guān)的API類(lèi)及其方法告訴大家了,你能記住嗎?今天的重點(diǎn)如下:
- IO流有不同的分類(lèi)標(biāo)準(zhǔn),包括輸入流和輸出流、字節(jié)流和字符流、節(jié)點(diǎn)流和處理流;
- 字節(jié)流主要有兩個(gè)類(lèi):InputStream和OutputStream;
- 字節(jié)流:二進(jìn)制數(shù)據(jù)以byte為最小單位在InputStream/OutputStream中單向流動(dòng);
- 字符流:字符數(shù)據(jù)以char為最小單位在Reader/Writer中單向流動(dòng);
- Java提供了兩個(gè)字符流的抽象類(lèi):Reader 和 Writer,所有的字符輸入流類(lèi)都是Reader的子類(lèi),所有的字符輸出流類(lèi)都是Writer的子類(lèi);
- Reader和Writer的本質(zhì)其實(shí)也是一個(gè)能自動(dòng)編解碼的InputStream和OutputStream。
以上就是學(xué)習(xí)Java之IO流中有哪些復(fù)雜的API的詳細(xì)內(nèi)容,更多關(guān)于Java IO流中API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用javaFX實(shí)現(xiàn)移動(dòng)一個(gè)小球的示例代碼
這篇文章主要介紹了利用javaFX實(shí)現(xiàn)移動(dòng)一個(gè)小球的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09詳解Spring 中如何控制2個(gè)bean中的初始化順序
本篇文章主要介紹了Spring 中如何控制2個(gè)bean中的初始化順序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10關(guān)于Java類(lèi)的構(gòu)造方法詳解
這篇文章主要介紹了關(guān)于Java類(lèi)的構(gòu)造方法詳解的相關(guān)資料,需要的朋友可以參考下2023-01-01Java微信公眾平臺(tái)開(kāi)發(fā)(8) 多媒體消息回復(fù)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開(kāi)發(fā)第八步,微信多媒體消息回復(fù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Java Web stmp發(fā)送帶附件郵件(附SSL版)
這篇文章主要為大家詳細(xì)介紹了Java Web stmp發(fā)送帶附件郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05SpringBoot?Seata?死鎖問(wèn)題排查記錄
這篇文章主要介紹了SpringBoot?Seata?死鎖問(wèn)題排查,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-12-12