字符流和對(duì)象流
12.2.2 字節(jié)流、字符流和對(duì)象流
在Java開(kāi)發(fā)環(huán)境中,主要是由java.io包中提供的一系列的類(lèi)和接口來(lái)實(shí)現(xiàn)各種常見(jiàn)的輸入和輸出處理。其中,每一個(gè)類(lèi)代表了一種特定的輸入流或輸出流。程序員可以創(chuàng)建各種特定的輸入輸出流對(duì)象,并通過(guò)這些對(duì)象方便地進(jìn)行數(shù)據(jù)的輸入與輸出操作。
根據(jù)流中傳輸數(shù)據(jù)的類(lèi)型可分為:字節(jié)流、字符流和對(duì)象流。
①字節(jié)流是以字節(jié)為基本處理單位的流。
②字符流是以字符為基本處理單位的流。
③對(duì)象流是以對(duì)象為基本處理單位的流。為了使對(duì)象的狀態(tài)能夠方便地永久保存下來(lái),JDK1.1以后的java.io包中提供了用于對(duì)象永久化保存狀態(tài)的機(jī)制,它是在字節(jié)流基礎(chǔ)上通過(guò)實(shí)現(xiàn)ObjectInput和ObjectOutput接口完成的。
1.字節(jié)流
輸入流InputStream和輸出流OutputStream是java.io包中最基本的字節(jié)流,其他字節(jié)流都是InputStream或OutputStream的派生子類(lèi)。它們的繼承關(guān)系如下。
·InputStream
InputStream類(lèi)是抽象類(lèi),不能直接使用。它是所有字節(jié)輸入流類(lèi)的父類(lèi),描述了所有字節(jié)輸入流的共同方法,用于完成從輸入流中讀取數(shù)據(jù)的功能。InputStream類(lèi)提供了3種從流中讀數(shù)據(jù)的方法。
①int read()throws IOException:從輸入流中讀一個(gè)字節(jié),形成一個(gè)0~255的整數(shù)返回。它是一個(gè)抽象方法,必須在具體的子類(lèi)中被實(shí)現(xiàn)。
②int read(byte b[])throws IOException:從輸入流中讀多個(gè)字節(jié)到數(shù)組b中。當(dāng)數(shù)組滿(mǎn)時(shí)或輸入流中不再有數(shù)據(jù)時(shí)返回。返回實(shí)際讀取的字節(jié)數(shù)。
③int read(byte b[],int off,int len)throws IOException:從輸入流中讀取長(zhǎng)度為len的數(shù)據(jù),寫(xiě)入數(shù)組b中從索引off開(kāi)始的位置,并返回讀取的字節(jié)數(shù)。
對(duì)于這3個(gè)方法,若返回-1,表明流結(jié)束。這3個(gè)讀方法只能把數(shù)據(jù)以二進(jìn)制的原始方式讀入,而不能分解、重組這些數(shù)據(jù),更不能對(duì)數(shù)據(jù)進(jìn)行變換。
每個(gè)流都有一個(gè)位置指針,在流剛被創(chuàng)建時(shí),該指針指向流的第一個(gè)數(shù)據(jù),以后每次讀操作都是在當(dāng)前位置指針處執(zhí)行。伴隨著流操作的執(zhí)行,位置指針自動(dòng)后移,指向下一個(gè)未被讀取的數(shù)據(jù)。位置指針決定了讀方法將在輸入流中讀取哪個(gè)數(shù)據(jù)。有關(guān)位置指針的方法如下。
①long skip(long n)throws IOException:跳過(guò)并忽略n個(gè)字節(jié),重新定位輸入流的當(dāng)前位置。
②void mark(int limit):在輸入流的當(dāng)前位置作標(biāo)記。
③void reset()throws IOException:將輸入流的讀取位置復(fù)位到最后一次用mark方法標(biāo)記的位置。
④boolean markSupported():測(cè)試輸入流是否支持標(biāo)記/復(fù)位機(jī)制。
⑤int available()throws IOException:返回在無(wú)阻塞情況下,由當(dāng)前位置可以從輸入流中讀入或跳過(guò)的字節(jié)數(shù)。
關(guān)閉輸入流的方法:void close()throws IOException,關(guān)閉輸入流并釋放與該流相關(guān)的系統(tǒng)資源。
OutputStream是抽象類(lèi),不能直接使用。它是所有字節(jié)輸出流類(lèi)的父類(lèi),描述了所有字節(jié)輸出流的共同方法,用于將數(shù)據(jù)順序?qū)懭氲街付ㄍ庠O(shè)上。OutputStream類(lèi)提供了3種向流中寫(xiě)數(shù)據(jù)的方法。
①void write(int b)throws IOException:往輸出流寫(xiě)出指定字節(jié)。它是一個(gè)抽象方法,必須在具體的子類(lèi)中被實(shí)現(xiàn)。
②void write(byte[]b)throws IOException:往輸出流依次寫(xiě)出字節(jié)組b中的所有字節(jié)。
③void write(byte[]b,int off,int len)throws IOException:往輸出流依次寫(xiě)出字節(jié)組b中的從索引off開(kāi)始的len個(gè)字節(jié)。
這3個(gè)寫(xiě)方法只能將原始數(shù)據(jù)以二進(jìn)制的方式,逐字節(jié)地寫(xiě)入輸出流所連接的外設(shè)中,而不能對(duì)所傳遞的數(shù)據(jù)進(jìn)行格式化或進(jìn)行類(lèi)型轉(zhuǎn)換。其他方法如下。
①void flush()throws IOException:刷新輸出流。為了提高性能,有些輸出流往往先把數(shù)據(jù)存放在緩沖區(qū)里,然后在合適時(shí)再將它們成塊地寫(xiě)到數(shù)據(jù)介質(zhì)上。
②void close()throws IOException:關(guān)閉輸出流并釋放與該流相關(guān)的系統(tǒng)資源。
2.字符流
類(lèi)似地,輸入流Reader和輸出流Writer是java.io包中最基本的字符流,其他字符流都是Reader或Writer的派生子類(lèi)。它們的繼承關(guān)系如下。
Reader類(lèi)是抽象類(lèi),不能直接使用。它是所有輸入字符流類(lèi)的父類(lèi),描述了所有字符輸入流都需要的方法,用于完成從輸入流中讀取數(shù)據(jù)的功能。Reader類(lèi)定義了一組與Input- Stream類(lèi)相似的方法,如read、mark、reset、skip、close等方法。只是這里的信息處理單位是字符,而不是字節(jié)。Reader類(lèi)也提供了如下3種從流中讀數(shù)據(jù)的方法。
①int read()throws IOException:從輸入流中讀一個(gè)字符,并以int型返回。它是一個(gè)抽象方法,必須在具體的子類(lèi)中被實(shí)現(xiàn)。
②int read(char[]cbuf)throws IOException:讀入若干字符,并存入字符數(shù)組cbuf中。
③int read(char[]cbuf,int off,int len)throws IOException:讀入len個(gè)字符,存入cbuf[off]開(kāi)始的字符數(shù)組元素中。
Writer類(lèi)是抽象類(lèi),不能直接使用。它是所有輸出字符流類(lèi)的父類(lèi),描述了所有字符輸出流都需要的方法,用于接收順序輸出的字符并將它送入目的地。Writer類(lèi)定義了一組與OutputStream類(lèi)相似的方法,如write、flush、close等方法。只是這里的信息處理單位是字符,而不是字節(jié)。Writer類(lèi)提供了如下更多的向流中寫(xiě)數(shù)據(jù)的方法。
①void write(int c)throws IOException:寫(xiě)出指定字符。
②void write(char[]cbuf)throws IOException:寫(xiě)出字符數(shù)組cbuf的所有字符。
③void write(char[]cbuf,int off,int len)throws IOException:寫(xiě)出字符數(shù)組cbuf中的部分字符。
④void write(String str)throws IOException:寫(xiě)出字符串str中的所有字符。
⑤void write(String str,int off,int len)throws IOException:寫(xiě)出字符串str中的部分字符。
由于文本文件對(duì)字符采用特定的編碼,而Java程序?qū)ψ址捎肬nicode編碼。所以,Java程序在讀寫(xiě)文本文件時(shí),最主要的問(wèn)題是字符編碼的轉(zhuǎn)換。Read類(lèi)能夠?qū)⑤斎肓髦胁捎闷渌幋a的字符轉(zhuǎn)換為Unicode字符,存入內(nèi)存中;Writer類(lèi)能夠把內(nèi)存中的Unicode字符轉(zhuǎn)換為其他編碼的字符,再寫(xiě)到輸出流中。
3.對(duì)象流
ObjectInputStream和ObjectOutputStream是對(duì)象流,提供將整個(gè)對(duì)象寫(xiě)入到輸出流中,并從輸入流中讀取對(duì)象的功能。這兩個(gè)類(lèi)分別繼承了InputStream和OutputStream,繼承關(guān)系如下:
注意:通過(guò)流傳輸?shù)膶?duì)象必須實(shí)現(xiàn)序列化的接口,即一個(gè)對(duì)象只有實(shí)現(xiàn)了序列化,它才能通過(guò)流來(lái)傳輸。
免責(zé)聲明:以上內(nèi)容源自網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請(qǐng)告知,我們將盡快刪除相關(guān)內(nèi)容。