




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第7章輸入輸出流
7.1流概述7.2基本輸入輸出流7.3 標(biāo)準(zhǔn)輸入輸出7.4 7.5 本章小結(jié) 輸入輸出流是Java中輸入輸出功能的基礎(chǔ),是最基本的操作,許多程序需要讀寫數(shù)據(jù)都離不開I/O方法。本章主要講述了流、輸入輸出流、InputStream類、OutputStream類、Reader類和Writer類,同時介紹了標(biāo)準(zhǔn)輸入和輸出和文件處理。7/27/20231第7章輸入輸出流7.1流概述流一般分為輸入流(InputStream)和輸出流(OutputStream)兩類。輸入流將外部設(shè)備數(shù)據(jù)引入到計(jì)算機(jī)中,例如從網(wǎng)絡(luò)中讀取信息,從掃描儀中讀取圖像信息等;輸出流將數(shù)據(jù)引導(dǎo)到外部設(shè)備(屏幕或文件),例如向網(wǎng)絡(luò)中發(fā)布信息,在屏幕上顯示圖像和文件內(nèi)容等。 但這種劃分并不是絕對的。比如一個文件,當(dāng)向其中寫數(shù)據(jù)時,它就是一個輸出流;當(dāng)從其中讀取數(shù)據(jù)時,它就是一個輸入流。當(dāng)然,鍵盤只是一個數(shù)入流,而屏幕則只是一個輸出流。 因此,可以將“流”看作數(shù)據(jù)從一種設(shè)備流向另一種設(shè)備的過程。它的最大特點(diǎn)是數(shù)據(jù)的獲取和發(fā)送均按數(shù)據(jù)序列順序進(jìn)行:每一個數(shù)據(jù)都必須等待排在它前面的數(shù)據(jù)讀入或送出之后才能被讀寫,而不能隨意選擇輸入輸出的位置。磁帶機(jī)是實(shí)現(xiàn)流式輸入輸出的較為典型的設(shè)備。輸入流(InputStream)即數(shù)據(jù)從外部世界流向計(jì)算機(jī)。輸出流(OutputStream)即是數(shù)據(jù)從計(jì)算機(jī)流向外部世界。7/27/20232第7章輸入輸出流
7.1流概述基本輸入輸出流基本的輸入輸出類是最簡單的類,它用來處理普通的流。其它的派生類是針對某些特定種類的輸入或輸出。這些類都包含在java.io包中。
圖7.1輸入輸出流的操作
7/27/20233第7章輸入輸出流7.1流概述流的分類7/27/20234第7章輸入輸出流7.1流概述字節(jié)流從InputStream和OutputStream派生出來的一系列類。這類流以字節(jié)(byte)為基本處理單位。InputStream、OutputStream
FileInputStream、FileOutputStream
PipedInputStream、PipedOutputStream
ByteArrayInputStream、ByteArrayOutputStream
FilterInputStream、FilterOutputStream
DataInputStream、DataOutputStream
BufferedInputStream、BufferedOutputStream字符流從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼表示的字符為基本處理單位。Reader、Writer
InputStreamReader、OutputStreamWriter
FileReader、FileWriter
CharArrayReader、CharArrayWriter
PipedReader、PipedWriter
FilterReader、FilterWriter
BufferedReader、BufferedWriter
StringReader、StringWriter7/27/20235第7章輸入輸出流7.1流概述Java.io這個軟件包包含的兩個抽象類,InputStream和OutputStream。所有其它字符數(shù)據(jù)流的輸入/輸出類都要擴(kuò)展這兩個基類。java.io軟件包提供了一些類和接口,它們在由InputStream和OuputStream類提供的讀寫操作的頂端定義了一些有用的抽象。例如,ObjectInputStream類提供了讓你把輸入/輸出流中的數(shù)據(jù)當(dāng)成對象來讀取的方法,而ObjectOutputStream類提供了讓你能夠把Java對象寫入數(shù)據(jù)流中的方法。這兩個類均為抽象類,也就是說它們不能被實(shí)例化,必須子類化之后才能夠?qū)崿F(xiàn)一定的功能。InputStream超類提供字符輸入流的編程接口和具體實(shí)現(xiàn)。OuputStream定義寫字節(jié)或字節(jié)型數(shù)組的方法。與輸入流InputStream類似,一個輸出流在創(chuàng)建時就自動打開,也可以用close()方法顯示關(guān)閉一個輸出流,或者在對象不再被引用,這個OuputStream要成為收集的垃圾時隱式地關(guān)閉。java.io包包含若干個實(shí)現(xiàn)具體輸入或輸出的InputStream和OuputStream的子類。例如:FileInputStream和FileOutStream就是在文件系統(tǒng)上進(jìn)行操作的輸入輸出流。圖7.3和7.4分別表示java.io包中的字節(jié)輸入流和字節(jié)輸出流類層次。7/27/20236第7章輸入輸出流7.1流概述java.io包中字節(jié)輸入流的類層次
7/27/20237第7章輸入輸出流7.1流概述java.io包中字節(jié)輸出流的類層次
7/27/20238第7章輸入輸出流7.1流概述包中字符輸入流的類層次
7/27/20239第7章輸入輸出流7.1流概述java.io包中字符輸出流的類層次7/27/202310第7章輸入輸出流7.2基本輸入輸出流InputStream類InputStream類是以字節(jié)為單位的輸入流。數(shù)據(jù)來源可以是鍵盤,也可以是諸如Internet這樣的網(wǎng)絡(luò)環(huán)境。
OutputStream類OutputStream位于OutputStream類層次的最頂層,它是一個抽象類,OutputStream是與InputStream相對應(yīng)的輸出流類,它具有所有輸出流的基本功能。
7/27/202311第7章輸入輸出流7.2.1InputStream類
InputStream類是以字節(jié)為單位的輸入流。數(shù)據(jù)來源可以是鍵盤,也可以是諸如Internet這樣的網(wǎng)絡(luò)環(huán)境。這個類可以作為許多輸入類的基類。InputStream類是一個抽象類,因此不能建立其實(shí)例類,相反用戶必須使用其子類。注意,大多數(shù)輸入方法都拋出了IOException例外。因此,如果程序中調(diào)用拉這些輸入方法,就必須捕獲和處理IOException例外。 類InputStream處于InputStream類層次的最頂層7/27/202312第7章輸入輸出流7.2.1InputStream類
read方法
read方法用于從指定的輸入流讀取以字節(jié)為單位的數(shù)據(jù),第一次從流的開始位置開始讀取,以后每次從上次的結(jié)束部位開始讀取,即自動實(shí)現(xiàn)了位移。read方法有以下三種形態(tài)publicintread(bytebuff[])throwsIOException 該方法以一字節(jié)型數(shù)組作為參數(shù),可用于一次讀取多個字節(jié),讀入字節(jié)直接放入數(shù)組buff中,并返回讀取的字節(jié)數(shù)。使用該方法必須保證數(shù)組有足夠的大小來保存所要讀入的數(shù)據(jù),否則Java就會拋出一個IOException。(例7-1)publicabstractintread()throwsIOException
即不帶參數(shù),該方法每次一個字節(jié)從指定的輸入流中讀取數(shù)據(jù)。返回值也是int類型,但它并不代表讀取的字節(jié)數(shù),而是從流中讀取的數(shù)據(jù)的本身,因數(shù)據(jù)本身是byte類型的,所以一般要強(qiáng)制進(jìn)行轉(zhuǎn)化;如果沒有數(shù)據(jù)返回的值是-1。在Java中,不能直接把一個整數(shù)轉(zhuǎn)換為字符,因?yàn)镴ava的整數(shù)為32位,而字符則是為16位。還須注意,該方法一般是通過子類來實(shí)現(xiàn)的,所以通常通過System.io.read()來調(diào)用。通過以下例題來說明該方法的使用。(例7-2)publicintread(bytebuff[],intstart,intlen) 從指定流讀取數(shù)據(jù),從start開始,填充len個字節(jié)到buff中,返回值為實(shí)際的填充數(shù),如果返回值<len,一般表示已將指定流中的數(shù)據(jù)讀完。這個方法還可以用于防止數(shù)組越界,其用法是:把start設(shè)置為0,len設(shè)成數(shù)組長度。這樣,既可填充整個數(shù)組,又能保證不會越界。
7/27/202313第7章輸入輸出流7.2.1InputStream類available方法 格式:publicintavailable()throwsIOException 功能:返回當(dāng)前流中可用字節(jié)數(shù)。 available方法用于計(jì)算指定流中當(dāng)前有多少字節(jié),如果指定的流是文件流,那么就返回文件的大小。Available返回的值是int類型。有的輸入流可能沒有能力返回字節(jié)數(shù),如果對這些輸入流使用avaiable方法,返回值為0。
close方法 格式:publicviodclose()throwsIOException
功能:關(guān)閉當(dāng)前流對象 對于打開的stream,Java可以自動回收,但是Java自動回收需要時間,所以最好自己調(diào)用close方法來關(guān)閉stream,這樣方便下一次重新指定的流。所以,I/O流在使用完后一定不要忘記關(guān)閉輸入流,使用close()方法執(zhí)行關(guān)閉操作。7/27/202314第7章輸入輸出流7.2.1InputStream類skip方法 格式:publiclongskip(longn)throwsIOException 功能:跳過指定的字節(jié)數(shù)。
skip方法類似于C語言中的lseek,都是用于定位的。Skip方法定義:longskip(longn),該方法使指定流中的當(dāng)前位置移動n個字節(jié),n的值可以是負(fù)值用于向前移,skip方法返回值為實(shí)際移動的字節(jié)數(shù),由于種種原因,如已到流尾或者其它原因返回的值往往小于n。對于讀取文件來說,小于n的原因最大的原因是讀到了文件尾。InputStream類的幾個常用方法還有:publicSynchronizedvoidmark(intreadlimit):在流中標(biāo)記一個位置。publicSynchronizedvoidreset()throwsIOException:返回流中放標(biāo)記的位置。publicBooleanmarkSupport():返回一個表示流是否支持標(biāo)記和復(fù)位操作的布爾值。7/27/202315第7章輸入輸出流7.2.1InputStream類使用InputStream的注意點(diǎn)當(dāng)程序中調(diào)用InputStream進(jìn)行請求,所調(diào)用的方法就處在等待狀態(tài),這種狀態(tài)就是“堵塞”。請分析下面一段程序:
Try{int.byt=System.in.read();}catch(IOExceptione){System.out.println(e.toString());}當(dāng)程序運(yùn)行到System.in.read()的時候就等待用戶輸入,直到用戶輸入一個回車鍵為止。
InputStream類操作的是字節(jié)數(shù)據(jù),不是字符。ASCII字符和字節(jié)數(shù)據(jù)對應(yīng)8位數(shù)據(jù),Java的字符為16位數(shù)據(jù),Unicode字符集對應(yīng)16位字節(jié)數(shù)據(jù),Java的整數(shù)為32位。這樣,利用InputStream類來接收鍵盤字符將收不到字符的高位信息。流是通過-1來標(biāo)記結(jié)束的。因此,必須用整數(shù)作為返回的輸入值才可以捕捉到流的結(jié)束。否則,如果使用的是相當(dāng)于無符號整數(shù)的字符來保存,則無法確認(rèn)流何時結(jié)束。從字節(jié)輸入流InputStream類的層次結(jié)構(gòu)圖可以看出,InputStream是所有基于字節(jié)的輸入流類的超類。由于它本身是抽象類,不能用來直接創(chuàng)建對象,它提供的方法通常是在其子類的對象中被使用的。7/27/202316第7章輸入輸出流7.2.1InputStream類FileInputStreamFileInputStream是從InputStream中繼承下來的,稱為文件字節(jié)輸入流,是將文件作為源端設(shè)備和目的端設(shè)備進(jìn)行字節(jié)處理的I/O流,也就是說,文件字節(jié)輸入流讀取對象是文件。該類的所有方法都是從InputStream類繼承來的。為了創(chuàng)建FileInputStream類的對象,可以使用構(gòu)造方法:FileInputStream(stringname)和FileInputStream(Filefile)。格式如下:publicFileInputStream(Stringname)throwsFileNotFoundExceptionpublicFileInputStream(Filefile)throwsFileNotFoundException讀取方法:
publicintread()throwsIOExceptionpublicintread(byte[]b)throwsIOExceptionpublicintread(byte[]b,intstart,intlen)throwsIOException 該組方法用于從文件中讀取數(shù)據(jù)。其中,b是保存存取到的數(shù)據(jù)的字節(jié)數(shù)組,start是輸入流的字節(jié)偏移量,len是將要讀取的字節(jié)長度。可以一次一個字節(jié)地讀取,也可以按字節(jié)數(shù)組的容量或指定字節(jié)長度成批地讀取。7/27/202317第7章輸入輸出流7.2.1InputStream類FileInputStream流順序地讀取文件,只要不關(guān)閉流,每次調(diào)用read()方法就順序地讀取文件中其余的內(nèi)容,直到文件的末尾或流被關(guān)閉。關(guān)閉方法格式如下:(例7_3)publicvoidclose()throwsIOExceptionPipedInputStream
管道流用于程序(或線程)之間的通訊。InputStream的派生類PipedInputStream一般與PipedOutputStream一起用構(gòu)成線程之間 雙向的通信管道。一個PipedInputStream必須連接一個PipedOutputStream,而且一個PipedOutputStream也必須連接一個PipedInputStream。PipedInputStream用于實(shí)現(xiàn)管道的輸入端,而PipedOutputStream用于實(shí)現(xiàn)管道的輸出端。
7/27/202318第7章輸入輸出流7.2.1InputStream類 PipedInputStream類用于從管道中讀取數(shù)據(jù),這個管道數(shù)據(jù)由PipedOutputStream類寫入。因此,在使用類PipedInputStream之前,必須將它連接到類PipedOutputStream??梢栽趯?shí)例化PipedInputStream類時建立這個連接,或者調(diào)用Connect()方法建立連接。PipedInputStream中包括用于讀數(shù)據(jù)的底層方法,同時也提供了讀數(shù)據(jù)的高層接口。PipedInputStream類創(chuàng)建的對象稱為一個輸入管道。在里先不介紹PipedInputStream的具體用法。FilterInputStream FilterInputStream也是從InputStream中繼承下來,不過FilterInputStream類基本上不能直接使用,一般上使用該類的派生類,如BufferedInputStream、DataInputStream、LineNumberInputStream、PushbackInputStream。該類的最大特點(diǎn)是,在定義時可以嵌套:
InputStreams=getAnInputStreamFromSomewhere();FilterInputStreams1=newFilterInputStream(s);FilterInputStreams2=newFilterInputStream(s1);FilterInputStreams3=newFilterInputStream(s2);所以該類的所有派生類都具有這個特性。各個派生類簡單介紹如下:
7/27/202319第7章輸入輸出流7.2.1InputStream類BufferedInputStream 它通過重寫其超類FilterInputStream的方法,在其中提供了內(nèi)部緩沖操作,內(nèi)部緩沖允許大量待讀取的數(shù)據(jù)存入緩沖區(qū)內(nèi)。即使重寫了FilterInputStream的方法,其過濾機(jī)器仍保留著。使用內(nèi)部緩沖,使得實(shí)際數(shù)據(jù)可以按塊讀取,如按照磁盤的塊大小進(jìn)行讀取。其后的讀請求由內(nèi)部緩沖區(qū)來響應(yīng),這樣訪問速度比磁盤的訪問速度快。 使用下面的構(gòu)造方法中的任何一個都可以建立BufferedInputStream對象:
publicBufferedInputStream(InputStreamin);publicBufferedInputStream(InputStreamin,intsize); 第一種形式使用一個缺省的緩沖區(qū)大小,而第二種形式用構(gòu)造方法的第二個參數(shù)指定緩沖區(qū)大小。DataInputStream 有許多應(yīng)用程序需要將處理的數(shù)據(jù)作為Java的一種基本類型(如布爾型,字節(jié),整數(shù)和浮點(diǎn)數(shù))。這就要用到類DataInputStream和DataOutStream.。使用這些類,可以讀或?qū)慗ava基本數(shù)據(jù)類型組成的流。DataInputStream擴(kuò)展了FilterInputStream的類,并實(shí)現(xiàn)了DataInput接口:
publicclassDataInputStreamextendsFilterInputStreamImplementsDataInput{…}
7/27/202320第7章輸入輸出流7.2.1InputStream類LineNumberInputStream LineNumberInputStream類用于記錄輸入流中的行號。行號在標(biāo)記/重置操作中記錄??梢杂胓etLineNumber()獲得當(dāng)前的行號,而setLineNumber()可以用于設(shè)置當(dāng)前行的行號。改變某一行的行號后,其后的行就從這個新的行號開始重新編號。類LineNumberInputStream是FilterInputStream類的子類。PushbackInputStream PushbackInputStream類利用unread()方法,可以將一個字節(jié)送回輸入流中。送回InputStream中的這個字符可以在下一次調(diào)用read()時被讀出。PushbackInputStream類可用于實(shí)現(xiàn)“先行”功能,它返回下一個要讀出的字符。編寫用于輸入分析的程序時,這個功能很有用。類PushbackInputStream是FilterInputStream類的子類。7/27/202321第7章輸入輸出流7.2.1InputStream類SequenceInputStream SequenceInputStream把多個輸入流順序接到一個輸入流中,即將不同的InputStream按先后順序串在一起。使用這個類可以將兩個獨(dú)立的流合并為一個邏輯流,如將兩個InputStream串起來:
InputStreams1=newFileInputStream("theFirstPart");InputStreams2=newFileInputStream("theRest");InputStreams=newSequenceInputStream(s1,s2);
以上只能實(shí)現(xiàn)兩個輸入流的串接,要實(shí)現(xiàn)兩個以上輸入流串接,需要用到Vector類,如下所示:
Vectorv=newVector(3);Enumeratione;v.addElement(s1);v.addElement(s2);v.addElement(s2);e=v.elements();InputStreams=newSequenceInputStream(e); 合并后的流中的數(shù)據(jù)按照在各個流中指定的順序讀出。第一個流結(jié)束時,使用無縫連接的方式開始從第二個流中讀數(shù)據(jù)。StringBufferInputStream允許程序?qū)⒁粋€StringBuffer用作輸入流,并使用ByteArrayInputStream從中讀取數(shù)據(jù)。
Stringbuffer="Nowisthetimeforallgoodmentocome...";InputStreams=newStringBufferInputStream(buffer);
7/27/202322第7章輸入輸出流7.2.1InputStream類ObjectInputStream ObjectInputStream與ObjectOutputStream相對應(yīng),ObjectInputStream類和ObjectOutputStream類分別是InputStream類和OutputStream類的子類。ObjectInputStream類創(chuàng)建的對象被稱為對象輸入流。對象輸入流使用readObject()從源中讀取一個對象到程序中。 ObjectInputStream將對象的值及類的定義等從指定的輸入流讀入,以便重新對象化:
FileInputStreamin=newFileInputStream("tmp");ObjectInputStreams=newObjectInputStream(in);Stringtoday=(String)s.readObject();Datedate
=(Date)s.readObject(); ObjectOutputStream和ObjectInputStream就可以實(shí)現(xiàn)對象的持久化,即要先將對象序列化保存到介質(zhì)中,在必要的時候重新恢復(fù)這些對象。
7/27/202323第7章輸入輸出流7.2.2OutputStream類
OutputStream位于OutputStream類層次的最頂層,它是一個抽象類,OutputStream是與InputStream相對應(yīng)的輸出流類,它具有所有輸出流的基本功能。下面列出輸出流類對應(yīng)的方法。write write方法與InputStream的read方法相對應(yīng),它有三個形態(tài):
publicviodwrite(bytebuff[])throwsIOException: 向流中寫入一個字節(jié)數(shù)組,即將指定buff數(shù)組中的數(shù)據(jù)輸出到指定Stream;
publicvoidwrite(bytebuff[],intoff,intlen)throwsIOException:
將指定buff數(shù)組中的數(shù)據(jù)從第二個參數(shù)開始,輸出第三個參數(shù)指定的長度到指定的Stream;
publicabstractvoidwirte(intbuff)throwsIOException;將一個int值輸出到指定的Stream;flush 格式:publicvoidflush()throwsIOException 功能:清空流并強(qiáng)制緩沖區(qū)中所有數(shù)據(jù)寫入到流中。7/27/202324第7章輸入輸出流7.2.2OutputStream類Close 格式:publicvoidclose()throwsIOException 功能:Close用于關(guān)閉指定的輸出流。 使用過程中要注意,OutputStream是抽象類,不能直接建立它的實(shí)例,但可以使用如下語句建立輸出流對象: OutputStreamos=newFileOutStream(“test.dat”); 從字節(jié)輸出流OutputStream類的層次結(jié)構(gòu)圖可以看出,OutputStream是所有基于字節(jié)的輸出流類的超類。由于它本身是抽象類,不能用來直接創(chuàng)建對象,它提供的方法通常是在其子類的對象中被使用的。以下我們具體介紹一下OutputStream的子類的用法
7/27/202325第7章輸入輸出流7.2.2OutputStream類FileOutputStream FileOutputStream與FileInputStream相對應(yīng),它提供了基本的文件寫入能力,稱為文件字節(jié)輸出流。文件字節(jié)輸出流按字節(jié)將數(shù)據(jù)寫入到文件中。 為了創(chuàng)建FileOutputStream類的對象,可以使用構(gòu)造方法: FileOutputStream(stringname)和FileOutputStream(Filefile)。 格式如下:
publicFileOutputStream(Stringname)throwsFileNotFoundException publicFileOutputStream(Filefile)throwsFileNotFoundException
參數(shù)是可以用字符串表示的文件名,也可以是創(chuàng)建時與指定文件關(guān)聯(lián)的文件對象出現(xiàn)異常時將拋出FileNotFoundException異常。
構(gòu)造方法參數(shù)指定的文件為輸出流的目的地,輸出流通過使用write()方法把數(shù)據(jù)寫入輸出流到達(dá)目的地。write方法的格式如下: publicviodwrite(intb)throwsIOException publicviodwrite(byte[]b)throwsIOException publicviodwrite(byte[]b,intstart,intlen)throwsIOException 該組方法用于向指定文件中寫入數(shù)據(jù)。其中,整型變量b是將要寫入的字節(jié)的整數(shù)值,字節(jié)數(shù)組b是將要寫入的字節(jié)數(shù)組,start是輸出流的字節(jié)偏移量,len是將要寫入的字節(jié)長度。可以一次一個字節(jié)地寫入,也可以按字節(jié)數(shù)組的容量或指定字節(jié)長度成批地寫入。 FileOutputStream流順序地寫文件,只要不關(guān)閉流,每次調(diào)用write()方法就順序地向文件寫入內(nèi)容,直到流被關(guān)閉。如果輸出流要寫入數(shù)據(jù)的文件已經(jīng)存在,該文件中的數(shù)據(jù)內(nèi)容就會被刷新;如果要寫入數(shù)據(jù)的文件不存在,該文件就會被建立。(例7-4)7/27/202326第7章輸入輸出流7.2.2OutputStream類PipedOutputStream PipedInputStream類創(chuàng)建的對象稱為一個輸入管道,PipedOutputStream類創(chuàng)建的對象稱為一個輸出管道。輸出管道與輸入管道連接就形成了一個傳輸數(shù)據(jù)的通道。使用這樣的管道,用戶可以在不同線程之間實(shí)現(xiàn)數(shù)據(jù)共享。也就是說,一個線程中的管道輸入流應(yīng)當(dāng)指向另一個線程中的管道輸出流;而一個線程中的管道輸出流應(yīng)當(dāng)指向另一個線程中的管道輸入流,然后管道輸入流就可以讀取寫入管道輸出流的數(shù)據(jù)了。相應(yīng)地PipedOutputStream與PipedInputSteam相互配合實(shí)現(xiàn)兩個線程之間的通信,它們的定義如下: PipedInputStreamsIn=PipedInputStream(); PipedOutputStreamsOut=PipedOutputStream(sIn); (例7-5) 說明:類ReadThread非常巧妙,它并沒有指定輸入輸出流的具體類型在MyPipe類中newReadThread("reader",System.in,readOut)語句使得從標(biāo)準(zhǔn)輸入設(shè)備中接收數(shù)據(jù),而從readOut輸出,而readOut是PipedOutputSteam,所以它可以被另一線程接收;newReadThread("writer",writeIn,System.out),從writeIn接收數(shù)據(jù),writeIn是readOut是成對的雙向管道,它接收從readOut發(fā)送過來的數(shù)據(jù)。再從標(biāo)準(zhǔn)設(shè)備中輸出。
7/27/202327第7章輸入輸出流7.2.2OutputStream類FilterOutputStream FilterOutputStream與FilterInputStream相對應(yīng),使用方法也相類似。FilterOutputStream用于建立一個輸出過濾器。FilterOutputStream類將另一個輸出流作為其類定義的一部分存儲。所有FilterOutputStream的方法調(diào)用都傳遞給它的內(nèi)部輸入流。當(dāng)構(gòu)造FilterOutputStream實(shí)例時,必須傳給它一個將在內(nèi)部存儲的輸入流的實(shí)例。 FilterOutputStream類本身并不做任何處理,只是將方法調(diào)用傳遞給它的內(nèi)部輸入流。如果希望它執(zhí)行有用的處理,必須建立它的子類,并在其中提供必要的操作。FilterOutputStream的標(biāo)準(zhǔn)子類是BufferedOutputStream、DataOutStream、PrintStream。以下將分別介紹這幾個子類的使用。BufferedOutputStream BufferedOutputStream從FilterOutputStream中繼承下來,它與BufferedInputStream相對應(yīng),作用也相類似,它主要為輸出流做緩沖,OutputStreams=newBufferedOutputStream(newFileOutputStream("foo")); 由于BufferedOutputStream是緩沖數(shù)據(jù)的,所以必要時,需要使用flush方法強(qiáng)制將緩沖中的數(shù)據(jù)真正寫入輸出流中。
7/27/202328第7章輸入輸出流7.2.2OutputStream類DataOutputStream DataOutputStream與DataInputStream相對應(yīng),它執(zhí)行輸入流中基本的Java數(shù)據(jù)類型的數(shù)據(jù)輸出。在繼承OutputStream的同時,實(shí)現(xiàn)了DataOutput接口,實(shí)現(xiàn)DataOutput接口格式如下:ublicclassDataOutputStreamextendsFilterOutputStreamimplementsDataOutput{…} 因此它具有DataOutput接中所規(guī)定的方法,這些方法與DataInput所規(guī)定的方法相反。 它還具有size方法,該方法返回向輸出流寫入的字節(jié)數(shù)。以下是實(shí)現(xiàn)復(fù)制功能的例子:
try{while(true)aDO.writeByte(aDI.readByte());}finally{aDI.close();aDO.close();} 使用下面的低層方法可以建立DataOutputStream的一個實(shí)例:
publicDataOutputStream(OutputStreamout);
7/27/202329第7章輸入輸出流7.2.2OutputStream類PrintStream 為了在標(biāo)準(zhǔn)輸出流中提供復(fù)雜的輸出,提供PrintStream類派生出輸出流對象。PrintStream是一個格式化的輸出流,是從FilterOutputStream繼承下來的。 PrintStream的構(gòu)造函數(shù):(1)PrintStream(booleanautoFlush,OutputStreamout)(2)PrintStream(OutputStreamout)(3)PrintStream(OutputStreamout,booleanautoFlush)(4)PrintStream(OutputStreamout,booleanautoFlush,Stringencoding)7/27/202330第7章輸入輸出流7.2.2OutputStream類ByteArrayOutputStream ByteArrayOutputStream類是將數(shù)據(jù)寫入流的內(nèi)部字節(jié)數(shù)組緩沖區(qū),同時,流內(nèi)部維護(hù)一個寫入字節(jié)的計(jì)數(shù)器,記錄寫入的字節(jié)數(shù)。實(shí)際執(zhí)行時將一個輸出流指向一個Byte數(shù)組,但這個Byte數(shù)組是ByteArrayOutputStream內(nèi)部內(nèi)置的,不需要我們來定義。該類有兩個構(gòu)造函數(shù):(1)ByteArrayOutputStream():該構(gòu)造函數(shù)會在內(nèi)部創(chuàng)建一個長度為32的Byte數(shù)組;(2)ByteArrayOutputStream(intn):在對象內(nèi)部創(chuàng)建一個長度為n的Byte數(shù)組。ByteArrayOutputStream從OutputStream類繼承下來,所以它具write、flush及close等方法,同時它還具有以下幾個特殊的方法:(1)toString():將對象內(nèi)部的Byte數(shù)組轉(zhuǎn)化成字符串(String(buf,0,count);(2)toString(intn):將對象對部的Byte數(shù)組轉(zhuǎn)化成字符串,編碼方式為n;(3)toString(Stringn):將對象對部的數(shù)組轉(zhuǎn)化成字符串,編碼方式為n;(4)toByteArray():返回對象內(nèi)部的Byte數(shù)組;(5)writeTo(OutputStream):將內(nèi)部Byte數(shù)組輸出到指定的輸出流;(6)reset():將對象內(nèi)部Byte數(shù)組的長度設(shè)為0,{count=0};(7)size():返回Byte數(shù)組長度。例7-67/27/202331第7章輸入輸出流7.2.2OutputStream類ObjectOutputStream ObjectOutputStream類是用于將原始數(shù)據(jù)類型以及整個對象寫到一個流中。ObjectOutputStream從OutputStream繼承下來,并實(shí)現(xiàn)了ObjectOutput,ObjectStreamConstants這兩個接口。它負(fù)責(zé)將指定對象輸出到指定的輸出流,可以將非static、非transient的屬性及值、對象的類定義輸出到指定的輸出流。該類有一個非常用的方法:
writeObject(Objectobj); 該方法將obj輸出到指定的輸出流,以下是該類的例子:
FileOutputStreamf=newFileOutputStream("tmp");ObjectOutputs=newObjectOutputStream(f);s.writeObject("Today");s.writeObject(newDate());s.flush(); 可以使用transient修飾符規(guī)定一些變量的值不被輸出到指定的輸出流.
7/27/202332第7章輸入輸出流7.2.3Reader類在JDK1.1之前,java.io包中的流只有普通的字節(jié)流(以byte為基本處理單位的流),這種流對于以16位的Unicode碼表示的字符流處理很不方便。從JDK1.1開始,java.io包中加入了專門用于字符流處理的類,它們是以Reader和Writer為基礎(chǔ)派生的一系列類。除了字節(jié)數(shù)據(jù)外,字符數(shù)據(jù)也是一種軟件經(jīng)常使用的數(shù)據(jù)類型,如文本數(shù)據(jù)的存取處理。Java提供了對字符類型的數(shù)據(jù)流操作,這就是字符流。與字節(jié)流不同,字符流的基本類是Reader類和Writer類。這兩個類是所有基于字符的流類的超類。與InputStream和OutPutStream相同,它們也是Object的子類,也是抽象類,只提供了一系列用于字符流處理的接口,不能直接用來創(chuàng)建對象。它們的方法與類InputStream和OutputStream類似,只不過其中的參數(shù)換成字符或字符數(shù)組
7/27/202333第7章輸入輸出流7.2.3Reader類Reader類是處理所有字符流輸入類的父類,Reader類具有以下方法:
讀取字符
publicintread()throwsIOException;//讀取一個字符,返回值為讀取的字符
publicintread(charcbuf[])throwsIOException;//讀取一系列字符到數(shù)組cbuf[]中,返回值為實(shí)際讀取的字符的數(shù)量
publicabstractintread(charcbuf[],intoff,intlen)throwsIOException;//讀取len個字符,從數(shù)組cbuf[]的下標(biāo)off處開始存放,返回值為實(shí)際讀取的字符數(shù)量,該方法必須由子類實(shí)現(xiàn)
標(biāo)記流
publicbooleanmarkSupported();//判斷當(dāng)前流是否支持做標(biāo)記
publicvoidmark(intreadAheadLimit)throwsIOException;//給當(dāng)前流作標(biāo)記,最多支持readAheadLimit個字符的回溯。
publicvoidreset()throwsIOException;//將當(dāng)前流重置到做標(biāo)記處
關(guān)閉流
publicabstractvoidclose()throwsIOException;//關(guān)閉輸入源。進(jìn)一步的讀取將會產(chǎn)生IOException異常
7/27/202334第7章輸入輸出流7.2.3Reader類以下將分別介紹Reader的各個子類的使用:FileReader FileReader類創(chuàng)建了一個可以讀取文件內(nèi)容的Reader類。它最常用的構(gòu)造函數(shù)顯示如下:
FileReader(StringfilePath)throwsFileNotFoundExceptionFileReader(FilefileObj)throwsFileNotFoundException 每一個都能引發(fā)一個FileNotFoundException異常。這里,filePath是一個文件的完整路徑,fileObj是描述該文件的File對象。 FileReader類沒有自己的實(shí)例方法,它的實(shí)例方法都是從InputStreamReader繼承而來的,讀取方法格式如下:
Publicintread()throwsIOExceptionpublicintread(char[]cbuf,intoff,intlen)throwsIOException 該組方法用于從文件中讀取字符數(shù)據(jù)。其中,cbuf是保存讀取到的數(shù)據(jù)的字符數(shù)組,off是輸入流的字符偏移量,len是將要讀取的字符數(shù)。可以用read()一次一個字符地讀取,也可以按字符數(shù)組的容量或指定的字符數(shù)成批地讀取。 關(guān)閉方法:Publicvoidclose()throwsIOException
其他方法: public
StringgetEncoding()該方法獲得文件流當(dāng)前使用的編碼機(jī)制,返回值是代表編碼名稱的字符串。(例7-7)7/27/202335第7章輸入輸出流7.2.3Reader類FilterReader是過濾字符輸入流的超類。其子類為PushbackReader,它允許將字符推回到流的字符流reader。構(gòu)造方法如下:
PushbackReader(Readerin):創(chuàng)建具有單字符推回緩沖區(qū)的新推回reader。
PushbackReader(Readerin,intsize):創(chuàng)建具有給定大小推回緩沖區(qū)的新推回reader。PushbackReader的方法主要有:voidclose():關(guān)閉該流。
voidmark(intreadAheadLimit):標(biāo)記流中的當(dāng)前位置。
booleanmarkSupported():判斷此流是否支持mark()操作(它一定不支持)。
intread():讀取單個字符。
intread(char[]cbuf,intoff,intlen):將字符讀入數(shù)組的某一部分。
booleanready():判斷是否準(zhǔn)備讀取此流。
voidreset():重置該流。
longskip(longn):跳過字符。
voidunread(char[]cbuf):推回一個字符數(shù)組,方法是將其復(fù)制到推回緩沖區(qū)前面。
voidunread(char[]cbuf,intoff,intlen):推回字符數(shù)組的某一部分,方法是將其復(fù)制到推回緩沖區(qū)的前面。
voidunread(intc):推回單個字符。
(例7-8)7/27/202336第7章輸入輸出流7.2.3Reader類●BufferedReaderBufferedReader類創(chuàng)建的對象稱為緩沖輸入流,該輸入流的指向必須是一個Reader流,稱為BufferedReader流的底層流,底層流負(fù)責(zé)將數(shù)據(jù)讀入緩沖區(qū)。BufferedReader流的源就是這個緩沖區(qū),緩沖輸入流從緩沖區(qū)中讀取數(shù)據(jù)。它有兩個構(gòu)造函數(shù):BufferedReader(ReaderinputStream)BufferedReader(ReaderinputStream,intbufSize)
第一種形式創(chuàng)建一個默認(rèn)緩沖器長度的緩沖字符流。第二種形式,緩沖器長度由bufSize傳入。和字節(jié)流的情況相同,緩沖一個輸入字符流同樣提供支持可用緩沖器中流內(nèi)反向移動的基礎(chǔ)。為支持這點(diǎn),BufferedReader實(shí)現(xiàn)了mark()和reset()方法,并且BufferedReader.markSupported()返回true.。
(例7-9)7/27/202337第7章輸入輸出流7.2.3Reader類PipedReaderr 管道I/O是專門用于線程通信。對于字節(jié)流Java提供了兩個類,PipedInputStream類和PipedOutputStream類被線程用來讀寫字節(jié)數(shù)據(jù)。兩個管道I/O流對象可以連接起來,這樣一個線程寫的數(shù)據(jù)就可以被另一個線程來讀。對于字符流也有兩個類,分別叫做PipedReader和PipedWriter。由于字節(jié)流的PipedInputStream類和PipedOutputStream類和字符流的PipedReader類和PipedWriter類在使用上非常相似,我們只詳細(xì)介紹字節(jié)流的管道I/O類,對于PipedReaderr類和PipedWriter類僅介紹其構(gòu)造方法和主要方法。 PipedReaderr類構(gòu)造方法如下:
publicPipedReader(PipedWritersrc)throwsIOException;//創(chuàng)建連接到傳送writersrc的PipedReader。寫入src的數(shù)據(jù)稍后將用作此流的輸入。
參數(shù)src為要連接的流。
publicPipedReader();//創(chuàng)建尚未連接的PipedReader。必須在使用之前將其連接到PipedWriter。
7/27/202338第7章輸入輸出流7.2.3Reader類其他方法:publicvoidconnect(PipedWritersrc)throwsIOException;//使此傳送reader連接到傳送writersrc。如果此對象已經(jīng)連接到其他某個傳送writer,則拋出IOException。src為要連接的傳送writer。
如果src為未連接的傳送writer,而snk為未連接的傳送reader,則可以通過以下任一調(diào)用使其連接:snk.connect(src)或:src.connect(snk)這兩個調(diào)用的效果相同。
publicintread()throwsIOException;//讀取此傳送流中的下一個數(shù)據(jù)字符。如果因流的末尾已到達(dá)而沒有可用的字符,則返回值-1。在輸入數(shù)據(jù)可用、檢測到流的末尾或者拋出異常前,此方法一直阻塞。
如果某個線程正向連接的傳送writer提供數(shù)據(jù)字符,但該線程不再處于活動狀態(tài),則拋出IOException。
publicintread(char[]cbuf,intoff,intlen)throwsIOException;//將此傳送流中最多l(xiāng)en數(shù)據(jù)字符讀入字符數(shù)組。如果已到達(dá)數(shù)據(jù)流的末尾,則讀取的字符數(shù)少于len。至少要有一個輸入字符可用,否則將阻塞此方法。如果某個線程正向連接的傳送輸出提供數(shù)據(jù)字符,但該線程不再處于活動狀態(tài),則拋出IOException。cbuf-讀入數(shù)據(jù)的緩沖區(qū)。off-數(shù)據(jù)的初始偏移量。len-讀取的最大字符數(shù)。返回讀入緩沖區(qū)的總字符數(shù),如果由于流末尾已到達(dá)而不再有數(shù)據(jù),則返回-1。
publicbooleanready()throwsIOException;//告知是否準(zhǔn)備讀取此流。如果循環(huán)緩沖區(qū)不空,則傳送字符流已做好被讀取準(zhǔn)備。如果保證下一個read()不阻塞輸入,則返回True,否則返回false。注意,返回false并不保證阻塞下一次讀取。
publicvoidclose()throwsIOException;//關(guān)閉此傳送流并釋放與該流相關(guān)的所有系統(tǒng)資源。7/27/202339第7章輸入輸出流7.2.3Reader類CharArrayReader CharArrayReader是一個把字符數(shù)組作為源的輸入流的實(shí)現(xiàn)。該類有兩個構(gòu)造函數(shù),每一個都需要一個字符數(shù)組提供數(shù)據(jù)源:
CharArrayReader(chararray[])CharArrayReader(chararray[],intstart,intnumChars) 這里,array是輸入源。第二個構(gòu)造函數(shù)從你的字符數(shù)組的子集創(chuàng)建了一個Reader,該子集以start指定的索引開始,長度為numChars。下面的例子用到了上述CharArrayReader的兩個構(gòu)造函數(shù):
7/27/202340第7章輸入輸出流7.2.3Reader類StringReader 為了使字符串操作更為方便,Java在還建立了一個字串流(StringReader和StringWriter)。字串流是以字符串為對象的字符流。通過StringReader和StringWriter類中提供的方法進(jìn)行字符串I/O操作。字符串的操作與字符流的相似,這里就不再詳細(xì)介紹。主要的類方法如下。
StringReader的構(gòu)造方法:publicStringReader(Strings);//創(chuàng)建一個新字符串reader。參數(shù):s為提供字符流的字符串
7/27/202341第7章輸入輸出流7.2.3Reader類StringReader的主要方法:publicintread()throwsIOException;
//讀取單個字符。返回讀取的字符,如果已到達(dá)流的末尾,則返回-1publicintread(char[]cbuf,intoff,intlen)throwsIOException;//將字符讀入數(shù)組的某一部分。參數(shù)cbuf為目標(biāo)緩沖區(qū),off為開始寫入字符處的偏移量,len為要讀取的最多字符數(shù)。返回讀取的字符數(shù),如果已到達(dá)流的末尾,則返回-1publiclongskip(longns)throwsIOException;//跳過流中指定數(shù)量的字符。返回跳過的字符數(shù)。如果讀取或跳讀了整個字符串,則此方法無效且始終返回0。
參數(shù)ns為要跳過的字符數(shù),返回實(shí)際跳過的字符數(shù)。publicbooleanready()throwsIOException;//告知是否準(zhǔn)備讀取此流。如果保證下一個read()不阻塞輸入,則返回True。
publicbooleanmarkSupported();//告知此流是否支持mark()操作以及支持哪一項(xiàng)操作。當(dāng)且僅當(dāng)此流支持此mark操作時,返回true。publicvoidmark(intreadAheadLimit)throwsIOException;//標(biāo)記流中的當(dāng)前位置。對reset()的后續(xù)調(diào)用會將該流重新定位到此點(diǎn)。
publicvoidreset()throwsIOException;//將該流重置為最新的標(biāo)記,如果從未標(biāo)記過,則將其重置到該字符串的開頭。publicvoidclose();//關(guān)閉該流。7/27/202342第7章輸入輸出流7.2.4Writer類Writer類是處理所有字符流輸出類的父類。Writer類的方法如下:
向輸出流寫入字符
publicvoidwrite(intc)throwsIOException;//將整型值c的低16位寫入輸出流
publicvoidwrite(charcbuf[])throwsIOException;//將字符數(shù)組cbuf[]寫入輸出流
publicabstractvoidwrite(charcbuf[],intoff,intlen)throwsIOException;
//將字符數(shù)組cbuf[]中的從索引為off的位置處開始的len個字符寫入輸出流
publicvoidwrite(Stringstr)throwsIOException;//將字符串str中的字符寫入輸出流
publicvoidwrite(Stringstr,intoff,intlen)throwsIOException;
//將字符串str中從索引off開始處的len個字符寫入輸出流
刷新輸出緩沖abstractvoidflush();//定制輸出狀態(tài)以使每個緩沖器都被清除。也就是刷新輸出緩沖
關(guān)閉流
publicabstractvoidclose()throwsIOException;//關(guān)閉輸出流。關(guān)閉后的寫操作會產(chǎn)生IOException異常7/27/202343第7章輸入輸出流7.2.4Writer類FileWriter FileWriter創(chuàng)建一個可以寫文件的Writer類。它最常用的構(gòu)造函數(shù)如下:FileWriter(StringfilePath)FileWriter(StringfilePath,booleanappend)FileWriter(FilefileObj) 它們可以引發(fā)IOException或SecurityException異常。這里,filePath是文件的完全路徑,fileObj是描述該文件的File對象。如果append為true,輸出是附加到文件尾的。FileWriter類的創(chuàng)建不依賴于文件存在與否。在創(chuàng)建文件之前,F(xiàn)ileWriter將在創(chuàng)建對象時打開它來作為輸出。如果試圖打開一個只讀文件,將引發(fā)一個IOException異常。 與FileReader相同,F(xiàn)ileWriter類也沒有自己的實(shí)力方法,它的實(shí)例方法都是從OutputStreamWriter繼承而來。寫入方法格式如下:publicvoidwirte(intc)throwsIOExceptionpublicvoidwirte(char[]cbuf,intoff,intlen)throwsIOExceptionpublicvoidwirte(Stringstr,intoff,intlen)throwsIOException關(guān)閉方法格式如下:publicvoidclose()throwsIOException(例7-10)7/27/202344第7章輸入輸出流7.2.4Writer類FilterWriter 用于寫入已過濾的字符流的抽象類。抽象類FilterWriter自身提供了一些將所有請求傳遞給所包含的流的默認(rèn)方法。FilterWriter的子類應(yīng)重寫這些方法中的一些方法,并且還可以提供一些額外的方法和字段。FilterWriter的構(gòu)造方法如下:protectedFilterWriter(Writerout);//創(chuàng)建一個新的filteredwriter。參數(shù):out-提供基礎(chǔ)流的Writer對象。
FilterWriter的主要方法如下:
publicvoidwrite(intc)throwsIOException;//寫入單個字符。
publicvoidwrite(char[]cbuf,intoff,intlen)throwsIOException;//將字符寫入數(shù)組的某一部分。參數(shù):cbuf:待寫入的字符緩沖區(qū),off:偏移量,從該處開始讀取字符,len:待寫入字符的數(shù)量
publicvoidwrite(Stringstr,intoff,intlen)throwsIOException寫入一部分字符串。
publicvoidflush()throwsIOException;//刷新該流的緩沖。
publicvoidclose()throwsIOException;//關(guān)閉該流。
7/27/202345第7章輸入輸出流7.2.4Writer類BufferedWriter 該類將文本寫入字符輸出流并緩沖字符以便能提供單字符、數(shù)組和行的高效寫入。BufferedWriter是一個增加了flush()方法的Writer。flush()方法可以用來確保數(shù)據(jù)緩沖器確實(shí)被寫到實(shí)際的輸出流。用BufferedWriter可以通過減小數(shù)據(jù)被實(shí)際的寫到輸出流的次數(shù)而提高程序的性能。BufferedWriter有兩個構(gòu)造函數(shù):BufferedWriter(WriteroutputStream)BufferedWriter(WriteroutputStream,intbufSize) 第一種形式創(chuàng)建了使用默認(rèn)大小緩沖器的緩沖流。第二種形式中,緩沖器大小是由bufSize參數(shù)傳入的。 如果在讀取文件時,每次準(zhǔn)備讀取文件的一行,F(xiàn)ileReader沒有提供讀取整行的方法。為了能實(shí)現(xiàn)按行讀取,我們將BufferedReader與FileReader連接,然后BufferedReader就可以按行讀取FileReader指向的文件。類似地,可以將BufferedWriter流和FileWriter流連接在一起,然后使用BufferedWriter流將數(shù)據(jù)寫到目的地。FileWriter流稱為BufferedWriter的底層流,BufferedWriter流將數(shù)據(jù)寫入緩沖區(qū),底層流負(fù)責(zé)將數(shù)據(jù)寫到最終的目的地。(例7-11)7/27/202346第7章輸入輸出流7.2.4Writer類PipedWriter PipedWriter類是傳送的字符輸出流。PipedWriter的構(gòu)造方法如下:publicPipedWriter(PipedReadersnk)throwsIOException;//創(chuàng)建傳送writer,使其連接到指定的傳送reader。寫入此流的數(shù)據(jù)字符稍后將用作snk的輸入。參數(shù):snk-連接的傳送reader。
publicPipedWriter();//創(chuàng)建一個尚未連接到傳送reader的傳送writer。必須在使用之前將其連接到傳送reader(既可由接收方連接,也可由發(fā)送方連接)。
7/27/202347第7章輸入輸出流7.2.4Writer類主要方法:publicvoidconnect(PipedReadersnk)throwsIOException;//將此傳送writer連接到接收方。如果此對象已經(jīng)連接到其他某個傳送reader,則拋出IOException。
如果snk為未連接的傳送reader,而src為未連接的傳送writer,則可以通過以下任一調(diào)用使其連接:src.connect(snk)或:snk.connect(src)這兩個調(diào)用的效果相同。
publicvoidwrite(intc)throwsIOException;//將指定的char寫入傳送輸出流。如果某個線程正從連接的傳送輸入流讀取數(shù)據(jù)字符,但該線程不再處于活動狀態(tài),則拋出IOException。
publicvoidwrite(char[]cbuf,intoff,intlen)throwsIOException;//將len字符從指定初始偏移量為off的字符數(shù)組寫入到此傳送輸出流。如果某個線程正從連接的傳送輸入流讀取數(shù)據(jù)字符,但該線程不再處于活動狀態(tài),則拋出IOException。
publicvoidflush()throwsIOException;//刷新此輸出流并強(qiáng)制寫出所有緩沖的輸出字符。這將通知所有reader,告知它們管道中的字符處于等待中。publicvoidclose()throwsIOException;//關(guān)閉此傳送輸出流并釋放與此流相關(guān)的所有系統(tǒng)資源。此流可能無法再用于寫入字符。7/27/202348第7章輸入輸出流7.2.4Writer類CharArrayWriter
CharArrayWriter實(shí)現(xiàn)了以數(shù)組作為目標(biāo)的輸出流。CharArrayWriter有兩個構(gòu)造函數(shù):
CharArrayWriter()CharArrayWriter(intnumChars)
第一種形式,創(chuàng)建了一個默認(rèn)長度的緩沖器。第二種形式,緩沖器長度由numChars指定。緩沖器保存在CharArrayWriter的buf成員中。緩沖器大小在需要的情況下可以自動增長。緩沖器保持的字符數(shù)包含在CharArrayWriter的count成員中。buf和count都是受保護(hù)的域。
(例7-12)7/27/202349第7章輸入輸出流7.2.4Writer類StringWriter可以用其回收在字符串緩沖區(qū)中的輸出來構(gòu)造字符串。
構(gòu)造方法如下:publicStringWriter();//創(chuàng)建具有默認(rèn)初始字符串緩沖區(qū)大小的新字符串writer。
publicStringWriter(intinitialSize);//創(chuàng)建具有指定初始字符串緩沖區(qū)大小的新字符串writer。initialSize為一個指定緩沖區(qū)初始大小的int。
主要方法如下:publicvoidwrite(intc);//寫入單個字符。參數(shù)c指定要寫入字符的int。publicvoidwrite(char[]cbuf,intoff,intlen);//寫入字符數(shù)組的某一部分。參數(shù)cbuf為字符數(shù)組,off為開始寫入字符處的偏移量,len為要寫入的字符數(shù)。publicvoidwrite(Stringstr);//寫入一個字符串。
參數(shù)str為要寫入的字符串publicvoidwrite(Stringstr,intoff,intlen);//寫入字符串的某一部分。參數(shù):str為要寫入的字符串;off是開始寫入字符處的偏移量,len是要寫入的字符數(shù)。publicStringWriterappend(CharSequencecsq);//將指定的字符序列追加到此writer。csq為要追加的字符串序列。publicStringWriterappend(CharSequencecsq,intstart,intend);//將指定字符序列的子序列追加到此writer。csq是子序列將被追加的字符序列,start是子序列中第一個字符的索引,end是子序列中最后一個字符后面的字符的索引。publicStringWriterappend(charc);//將指定字符追加到此writer。
publicStringtoString();//以字符串的形式返回該緩沖區(qū)的當(dāng)前值。publicStringBuffergetBuffer();//返回該字符串緩沖區(qū)本身。
publicvoidflush();
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)項(xiàng)目咨詢合同范例
- 共營合同標(biāo)準(zhǔn)文本
- 主體房屋砌墻合同標(biāo)準(zhǔn)文本
- ppp招投標(biāo)合同標(biāo)準(zhǔn)文本
- 大班幼兒園教案(3篇)
- 業(yè)主房屋轉(zhuǎn)讓合同標(biāo)準(zhǔn)文本
- 2025年聯(lián)合站干化池污泥清理項(xiàng)目服務(wù)合同協(xié)議書
- 假如我是一朵花作文(6篇)
- 公路護(hù)墻合同標(biāo)準(zhǔn)文本
- 2025年上海市物業(yè)服務(wù)合同范本(合同版本)
- 物理-重慶市南開中學(xué)高2025屆高三第七次質(zhì)量檢測暨3月月考試題和答案
- 2025屆高考地理二輪復(fù)習(xí)高考非選擇題專練專練八以世界典型區(qū)域?yàn)楸尘暗木C合題含解析
- 2025年單位節(jié)日集體福利慰問品采購合同8篇
- 大學(xué)生網(wǎng)絡(luò)安全與道德規(guī)范管理指南
- 2025屆泉州市高三語文三檢作文題目解析及相關(guān)范文:光靠理性還不足以解決我們社會生活的問題
- 第16課《大家排好隊(duì)》名師課件
- 湖北咸寧咸安區(qū)招引碩士、博士研究生人才41人高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2024江西撫州市市屬國有企業(yè)招聘員工入闈人員筆試參考題庫附帶答案詳解
- T-CWEC 37-2023 著生藻類監(jiān)測技術(shù)規(guī)范
- 1、工貿(mào)行業(yè)重大事故隱患重點(diǎn)排查事項(xiàng)清單
- 2025年紀(jì)檢工作要點(diǎn)
評論
0/150
提交評論