全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

什么是字節(jié)流?字節(jié)流輸入輸出數(shù)據(jù)的常用方法有哪些?

更新時(shí)間:2021-03-18 來(lái)源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif


在計(jì)算機(jī)中,無(wú)論是文本、圖片、音頻還是視頻,所有文件都是以二進(jìn)制(字節(jié))形式存在的,I/O流中針對(duì)字節(jié)的輸入/輸出提供了一系列的流,統(tǒng)稱(chēng)為字節(jié)流。字節(jié)流是程序中最常用的流,根據(jù)數(shù)據(jù)的傳輸方向可將其分為字節(jié)輸入流和字節(jié)輸出流。在JDK中,提供了兩個(gè)抽象類(lèi)InputStream和OutputStream,它們是字節(jié)流的頂級(jí)父類(lèi),所有的字節(jié)輸入流都繼承自InputStream,所有的字節(jié)輸出流都繼承自O(shè)utputStream。為了方便理解,可以把InputStream和OutputStream比作兩根“水管”,如圖1所示。

1616056390579_0.png

圖1 InputStream和OutputStream

圖1中,InputStream被看成一個(gè)輸入管道,OutputStream被看成一個(gè)輸出管道,數(shù)據(jù)通過(guò)InputStream從源設(shè)備輸入到程序,通過(guò)OutputStream從程序輸出到目標(biāo)設(shè)備,從而實(shí)現(xiàn)數(shù)據(jù)的傳輸。由此可見(jiàn),I/O流中的輸入/輸出都是相對(duì)于程序而言的。

在JDK中,InputStream和 OutputStream提供了一系列與讀寫(xiě)數(shù)據(jù)相關(guān)的方法,接下來(lái)先來(lái)了解一下InputStream的常用方法,如表1所示。

表1 InputStream的常用方法

方法聲明功能描述
int read()從輸入流讀取一個(gè)8位的字節(jié),把它轉(zhuǎn)換為0~255之間的整數(shù),并返回這一整數(shù)。當(dāng)沒(méi)有可用字節(jié)時(shí),將返回-1
int read(byte[] b)從輸入流讀取若干字節(jié),把它們保存到參數(shù)b指定的字節(jié)數(shù)組中,返回的整數(shù)表示讀取字節(jié)的數(shù)目
int read(byte[] b,int off,int len)從輸入流讀取若干字節(jié),把它們保存到參數(shù)b指定的字節(jié)數(shù)組中,off指定字節(jié)數(shù)組開(kāi)始保存數(shù)據(jù)的起始下標(biāo),len表示讀取的字節(jié)數(shù)目
void close()關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源


表7-1中列舉了InputStream的四個(gè)常用方法。前三個(gè)read()方法都是用來(lái)讀數(shù)據(jù)的,其中,第一個(gè)read()方法是從輸入流中逐個(gè)讀入字節(jié),而第二個(gè)和第三個(gè)read()方法則將若干字節(jié)以字節(jié)數(shù)組的形式一次性讀入,從而提高讀數(shù)據(jù)的效率。在進(jìn)行I/O流操作時(shí),當(dāng)前I/O流會(huì)占用一定的內(nèi)存,由于系統(tǒng)資源寶貴,因此,在I/O操作結(jié)束后,應(yīng)該調(diào)用close()方法關(guān)閉流,從而釋放當(dāng)前I/O流所占的系統(tǒng)資源。

與InputStream對(duì)應(yīng)的是OutputStream。OutputStream是用于寫(xiě)數(shù)據(jù)的,因此OutputStream提供了一些與寫(xiě)數(shù)據(jù)有關(guān)的方法,如表2所示。

表2 OutputStream的常用方法

方法聲明功能描述
void write(int b)向輸出流寫(xiě)入一個(gè)字節(jié)
void write(byte[] b)把參數(shù)b指定的字節(jié)數(shù)組的所有字節(jié)寫(xiě)到輸出流
void write(byte[] b,int off,int len)將指定byte數(shù)組中從偏移量off開(kāi)始的len個(gè)字節(jié)寫(xiě)入輸出流
void flush()刷新此輸出流并強(qiáng)制寫(xiě)出所有緩沖的輸出字節(jié)
void close()關(guān)閉此輸出流并釋放與此流相關(guān)的所有系統(tǒng)資源

表2中,列舉了OutputStream類(lèi)的五個(gè)常用方法。前三個(gè)是重載的write()方法,都用于向輸出流寫(xiě)入字節(jié),其中,第一個(gè)方法逐個(gè)寫(xiě)入字節(jié),后兩個(gè)方法是將若干個(gè)字節(jié)以字節(jié)數(shù)組的形式一次性寫(xiě)入,從而提高寫(xiě)數(shù)據(jù)的效率。flush()方法用來(lái)將當(dāng)前輸出流緩沖區(qū)(通常是字節(jié)數(shù)組)中的數(shù)據(jù)強(qiáng)制寫(xiě)入目標(biāo)設(shè)備,此過(guò)程稱(chēng)為刷新。close()方法是用來(lái)關(guān)閉流并釋放與當(dāng)前IO流相關(guān)的系統(tǒng)資源。

InputStream和OutputStream這兩個(gè)類(lèi)雖然提供了一系列和讀寫(xiě)數(shù)據(jù)有關(guān)的方法,但是這兩個(gè)類(lèi)是抽象類(lèi),不能被實(shí)例化,因此,針對(duì)不同的功能,InputStream和OutputStream提供了不同的子類(lèi),這些子類(lèi)形成了一個(gè)體系結(jié)構(gòu),如圖2和圖3所示。

1616056401298_1.png

圖2 InputStream的子類(lèi)

1616056428934_2.png

圖3 OutputStream的子類(lèi)

從圖2和圖3中可以看出,InputStream和OutputStream的子類(lèi)有很多是大致對(duì)應(yīng)的,比如,ByteArrayInputStream和ByteArrayOutputStream、FileInputStream和FileOutputStream等。圖中所列出的I/O流都是程序中很常見(jiàn)的,接下來(lái)將為讀者講解開(kāi)發(fā)時(shí)常用流的具體用法。



猜你喜歡:

IO流、字節(jié)流和字符流分別是什么?

JDK安裝教程:Jdk怎么安裝?

什么是哈希?哈希算法是怎么回事?

java高級(jí)軟件工程師課程

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!