學(xué)習(xí)Java之IO流中有哪些復(fù)雜的API
一. IO流的API
1. API分類
Java中關(guān)于IO流的API,總的來(lái)說(shuō)共有四大類,分別如下:
- InputStream---字節(jié)輸入流;
- OutputStream---字節(jié)輸出流;
- Reader-----字符輸入流;
- Writer------字符輸出流。
在Java中,所有輸入流類都是 InputStream(字節(jié)輸入流)和 Reader(字符輸入流)的子類,其中InputStream類是字節(jié)輸入流的抽象類,Reader是字符輸入流的抽象類;所有的輸出流類都是OutputStream(字節(jié)輸出流)和 Writer(字符輸出流)的子類,其中OutputStream類是字節(jié)輸出流的抽象類,Writer是字符輸出流的抽象類。
1.1 字節(jié)流的抽象基類
其中,字節(jié)流主要有兩個(gè)類:InputStream和OutputStream,分別用于讀取和寫入字節(jié)數(shù)據(jù)。所有的字節(jié)輸入流類都是InputStream的子類,所有的字節(jié)輸出流類都是OutputStream的子類,這兩個(gè)類都是抽象類,不能直接使用,需要使用其子類進(jìn)行實(shí)例化。InputStream與OutputStream的關(guān)系如下圖所示:
InputStream和OutputStream的子類包括:
- FileInputStream和FileOutputStream:用于文件的讀寫操作;
- ByteArrayInputStream和ByteArrayOutputStream:用于在內(nèi)存中讀寫二進(jìn)制數(shù)據(jù);
- PipedInputStream和PipedOutputStream:用于線程間的數(shù)據(jù)傳輸;
- FilterInputStream和FilterOutputStream:用于裝飾其他流,增加流的功能。
1.2 字符流的抽象基類
Java提供了兩個(gè)字符流的抽象類:Reader 和 Writer,所有的字符輸入流類都是Reader的子類,所有的字符輸出流類都是Writer的子類。它們是抽象類,不能直接使用,我們需要使用它們的子類來(lái)進(jìn)行具體的操作。
Reader和Writer的本質(zhì)其實(shí)也是一個(gè)能自動(dòng)編解碼的InputStream和OutputStream。Reader和Writer的數(shù)據(jù)源雖然是字節(jié),但我們讀入寫出的數(shù)據(jù)都是char類型的字符,這是因?yàn)镽eader和Writer的內(nèi)部會(huì)把讀入寫出的byte解碼編碼轉(zhuǎn)換成char。Reader與Writer類關(guān)系如下圖所示:
其中的Reader類用來(lái)讀取字符流的抽象類,它提供了一些用來(lái)讀取字符的方法,我們可以使用它的子類來(lái)進(jìn)行文件讀取、網(wǎng)絡(luò)讀取等操作。常用的Reader子類如下:
- FileReader:用于讀取文件字符流。
- InputStreamReader:從字節(jié)流到字符流的橋梁,它可以將字節(jié)流轉(zhuǎn)換為字符流。
- CharArrayReader:可以從字符數(shù)組中讀取字符流。
- BufferedReader:可以從字符流中緩存讀取數(shù)據(jù),提高效率。
而Writer類是用來(lái)寫入字符流的抽象類,它提供了一些寫入字符的方法,我們可以使用它的子類來(lái)進(jìn)行文件寫入、網(wǎng)絡(luò)寫入等操作。常用的 Writer 子類:
- FileWriter:用于寫入文件字符流。
- OutputStreamWriter:從字符流到字節(jié)流的橋梁,它可以將字符流轉(zhuǎn)換為字節(jié)流。
- CharArrayWriter:可以將字符流寫入到字符數(shù)組中。
- BufferedWriter:可以緩存寫入字符流,提高效率。
1.3 小結(jié)
對(duì)字節(jié)流和字符流的關(guān)系,我們可以用下圖概括展示:
Java中凡是由這四個(gè)基類派生出來(lái)的子類名稱,都會(huì)以其父類名稱作為子類名稱的后綴,如InputStream的子類FileInputStream,Reader的子類FileReader。
接下來(lái)再分別把這4個(gè)基類里的核心子類及其API方法介紹一下。
2. InputStream字節(jié)輸入流
2.1 InputStream的常見(jiàn)子類
以下是InputStream的常見(jiàn)子類,包括節(jié)點(diǎn)流和處理流兩種類型。
2.2 InputStream的常用方法
以下是InputStream類中的常用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é)寫入給定的輸出流。
3. OutputStream字節(jié)輸出流
3.1 OutputStream的常見(jiàn)子類
以下是OutputStream的常見(jiàn)子類,包括節(jié)點(diǎn)流和處理流兩種類型。
3.2 OutputStream的常用方法
以下是OutputStream中的常用方法。
void close() 關(guān)閉此輸出流并釋放與此流相關(guān)聯(lián)的任何系統(tǒng)資源。 void flush() 刷新此輸出流并強(qiáng)制任何緩沖的輸出字節(jié)被寫出。 void write(byte[] b) 將 b.length字節(jié)從指定的字節(jié)數(shù)組寫入此輸出流。 void write(byte[] b, int off, int len) 從指定的字節(jié)數(shù)組寫入 len字節(jié),從偏移量 off開始輸出到此輸出流。 abstract void write(int b) 將指定的字節(jié)寫入此輸出流。
4. Reader字符輸入流
4.1 Reader的常見(jiàn)子類
以下是Reader的常見(jiàn)子類,包括節(jié)點(diǎn)流和處理流兩種類型。
4.2 Reader的常用方法
以下是Reader類中的常用方法。
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)子類
以下是Writer的常見(jiàn)子類,包括節(jié)點(diǎn)流和處理流兩種類型。
5.2 Writer的常見(jiàn)方法
以下是Writer類中的常用方法。
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) 寫入一個(gè)字符數(shù)組。 abstract void write(char[] cbuf, int off, int len) 寫入字符數(shù)組的一部分 void write(int c) 寫一個(gè)字符 void write(String str) 寫一個(gè)字符串 void write(String str, int off, int len) 寫一個(gè)字符串的一部分
6. IO流梳理總結(jié)
6.1 API完整類關(guān)系
最后,為了讓大家對(duì)IO流有一個(gè)完整清晰地認(rèn)知,針對(duì)以上這些java.io包中的API類關(guān)系,給大家繪制了下圖:
6.2 API歸納
從上圖中,我們可以看到,Java中有各種各樣的IO流API類,如果我們對(duì)這些API再細(xì)分一下,又可以歸納如下。
文件操作流:
- FileInputStream:字節(jié)輸入流;
- FileOutputStream:字節(jié)輸出流;
- FileReader:字符輸入流;
- FileWriter:字符輸出流
管道操作流:
- PipedInputStream:管道字節(jié)輸入流;
- PipedOutStream:管道字節(jié)輸出流;
- PipedReader:管道字符輸入流;
- PipedWriter:管道字符輸出流
注意: PipedInputStream的實(shí)例要和PipedOutputStream的實(shí)例共同使用,共同完成管道的讀取寫入操作,主要用于線程操作。
字節(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ù),這樣就避免了每次都和硬盤打交道,提高了數(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ù)類型的困難,數(shù)據(jù)流可以直接輸出float類型或long類型,提高了數(shù)據(jù)讀寫的效率。
打印流:
- PrintStream
- PrintWriter
注意: 一般是打印到控制臺(tái),可以進(jìn)行控制打印的地方。
對(duì)象流:
- ObjectInputStream
- ObjectOutputStream
注意: ObjectOutputStream可以將Java對(duì)象的原始數(shù)據(jù)類型寫出到文件,實(shí)現(xiàn)對(duì)象的持久存儲(chǔ);ObjectInputStream反序列化流,將之前使用ObjectOutputStream序列化的原始數(shù)據(jù)恢復(fù)為對(duì)象。
序列化流:
- SequenceInputStream
對(duì)于以上這些API類,大家先不用去記憶,只需要先有一個(gè)整體的印象即可。后面我們會(huì)在具體的案例中學(xué)習(xí)這些API,以后這些API用多了,自然就記住了。
二. 結(jié)語(yǔ)
至此,就把IO流相關(guān)的API類及其方法告訴大家了,你能記住嗎?今天的重點(diǎn)如下:
- IO流有不同的分類標(biāo)準(zhǔn),包括輸入流和輸出流、字節(jié)流和字符流、節(jié)點(diǎn)流和處理流;
- 字節(jié)流主要有兩個(gè)類:InputStream和OutputStream;
- 字節(jié)流:二進(jìn)制數(shù)據(jù)以byte為最小單位在InputStream/OutputStream中單向流動(dòng);
- 字符流:字符數(shù)據(jù)以char為最小單位在Reader/Writer中單向流動(dòng);
- Java提供了兩個(gè)字符流的抽象類:Reader 和 Writer,所有的字符輸入流類都是Reader的子類,所有的字符輸出流類都是Writer的子類;
- 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-10Java微信公眾平臺(tái)開發(fā)(8) 多媒體消息回復(fù)
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tá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