Java I/O需要處理多種場(chǎng)景,Java類庫(kù)的設(shè)計(jì)者都是通過(guò)創(chuàng)建大量的類來(lái)解決這個(gè)問(wèn)題的,單篇文章難以詳述,本文只是試圖提供一個(gè)通用的概述傳統(tǒng)I/O類庫(kù)所涉及的類,以掌握整個(gè)上下文,更好地理解和應(yīng)用I./O類庫(kù)解決實(shí)際編程問(wèn)題。具體需要參考JDK文檔。
1.輸入流/輸出流
在Java 1.0中,類庫(kù)的設(shè)計(jì)者首先限制所有與輸入相關(guān)的類都繼承自InputStream,而與輸出相關(guān)的所有類都繼承自O(shè)utputStream。
1)輸入流
InputStream用于表示從不同數(shù)據(jù)源生成輸入的類。這些數(shù)據(jù)來(lái)源包括:
- 字節(jié)數(shù)組;
- 字符串對(duì)象;
- 文件;
- “管道”的工作方式與實(shí)際管道類似,即一端輸入,另一端輸出。
- 一系列其他流,以便我們可以將它們收集并合并為一個(gè)流;
- 其他數(shù)據(jù)源,如Internet連接等。
每個(gè)數(shù)據(jù)源都有其對(duì)應(yīng)的InputStream子類作為基本組件:
- ByteArray InputStream,允許將內(nèi)存緩沖區(qū)用作InputStream;
- String Buffer InputStream,將String轉(zhuǎn)換為InputStream;
- FileInputStream,用于從文件中讀取信息;
- PipedInputStream,它生成用于寫入相關(guān)PipedOutputStream的數(shù)據(jù)。實(shí)現(xiàn)“流水線”的概念;
- SequenceInputStream將兩個(gè)或多個(gè)InputStream對(duì)象轉(zhuǎn)換為單個(gè)InputStream。
2)輸出流
- OutputStream用于表示可以輸出到不同數(shù)據(jù)源的類。它的特定子類決定了輸出的目的地:字節(jié)數(shù)組、文件或管道。它也用作基本組件:
- ByteArray輸出流,它在內(nèi)存中創(chuàng)建緩沖區(qū)。所有發(fā)送到流的數(shù)據(jù)都應(yīng)該放在這個(gè)緩沖區(qū)中。
- FileOutput Stream,用于將信息寫入文件;
- PipedOutputStream,任何寫入其中的信息都會(huì)自動(dòng)作為相關(guān)PipedInputStream的輸出,實(shí)現(xiàn)“流水線”的概念;
3)裝飾器
除了上述基本組件外,還有兩個(gè)子類:FilterInputStream/FilterOutputStream,它們也是InputStream和OutputStream的子類。它們?yōu)?ldquo;decorator”類提供基類,其中“decorator”類可以將屬性或有用的接口連接到基本組件。因?yàn)樯厦嫣岬降腎nputStream/OutputStream是單字節(jié)操作的,而真正的I/O場(chǎng)景遠(yuǎn)不止于此,它通過(guò)“裝飾”來(lái)擴(kuò)展其功能(原理是類的組合)。
我自己梳理了InputStream/OutputStream流繼承層次結(jié)構(gòu),結(jié)合下面的講解,可以對(duì)字節(jié)流系統(tǒng)有更清晰的認(rèn)識(shí):
4)過(guò)濾輸入流
FilterInputStream類有以下子類,即具體的裝飾器:
- 數(shù)據(jù)輸入流;
- 緩沖輸入流;
- 行號(hào)輸入流;
它的裝飾功能主要有兩個(gè)方面:
- 讀取不同基本類型的數(shù)據(jù)和String對(duì)象,如DataInputStream;
- 內(nèi)部修改InputStream的行為:Buffer InputStream,LineNumber InputStream,并保留它讀過(guò)的行;
5)過(guò)濾輸出流
與Filter Input Stream類似,F(xiàn)ilter Output Stream主要完成寫入功能,主要包括以下裝飾器:
- Data Output Stream與Data Input Stream一起使用,可以將基本類型的數(shù)據(jù)(int、char、long)以可移植的方式寫入流。
- PrintStream,用于生成格式化輸出。Data Output Stream處理數(shù)據(jù)存儲(chǔ),PrintStream處理顯示。
- Buffered Output Stream,用于避免每次發(fā)送數(shù)據(jù)時(shí)的實(shí)際寫操作。表示“使用緩沖區(qū)”。可以調(diào)用flush()清除緩沖區(qū);
以上就是長(zhǎng)沙達(dá)內(nèi)教育小編介紹的"深入學(xué)習(xí)Java I/O的輸入輸出,看了就會(huì)",希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您服務(wù)。
學(xué)習(xí)Java