




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、網(wǎng)絡(luò)程序的很大一部分是簡(jiǎn)單的輸入輸出,即從一個(gè)系統(tǒng)向另一個(gè)系統(tǒng)移動(dòng)字節(jié)。字節(jié)就是字節(jié),在很大程度上,讀服務(wù)器發(fā)送的數(shù)據(jù)與讀取文件沒(méi)什么不同;向客戶傳送數(shù)據(jù)與寫入一個(gè)文件也沒(méi)有什么區(qū)別。 Java中輸入和輸出組織不同于大多數(shù)其他語(yǔ)言。它是建立在流(stream)上。不同的基本流類(如和.TelnetOutputStream)用于讀寫特定的數(shù)據(jù)資源。但是所有的基本輸出流使用同一種基本方法讀數(shù)據(jù)。過(guò)濾器流可以連接到輸入流或輸出流。它可以修改已經(jīng)讀出或?qū)懭说臄?shù)據(jù)(例如,加密或壓縮數(shù)據(jù)),或者可以簡(jiǎn)單地提供附加方法將已經(jīng)讀出或?qū)懭氲臄?shù)據(jù)轉(zhuǎn)化成其他格式。最后Reader和Writer也可以鏈接到輸入流和輸
2、出流,從而允許程序讀出和寫入文本(即字符)而不是字節(jié)。如果使用正確,Reader和Writer能夠處理多種類型的字符編碼,包括SJIS和UTF-8等多字節(jié)字符集。一、輸出流java的基本輸出流是 java.io.OutputStream.public abstract class OutputStreamn public abstract void write(int b) throws IOExceptionn
3、160; public void write(byte data) throws IOExceptionn public void write(byte data,int offset,int length) throws IOExceptionn public void flush() throws IOExceptionn
4、0; public void close() throws IOExceptionOutputStream的子類使用這些方法向指定媒體寫入數(shù)據(jù)。我使用相信,我們理解了問(wèn)什么它們存在,就會(huì)更好地記住它們,好,現(xiàn)在開(kāi)始說(shuō)一下OutputStream類的方法的由來(lái)Ø public abstract void write(int b) throws IOExceptionOutputStream的基本方法是write(int b)。該方法將介于0到255之間的整數(shù)看作變量,并將相應(yīng)的字
5、節(jié)寫到一個(gè)輸出流。該方法聲明是個(gè)抽象方法,因?yàn)樽宇愋枰淖兯蕴幚硖囟襟w。例如,ByteArrayOutputStream可以使用拷貝字節(jié)到其數(shù)組的純Java代碼來(lái)實(shí)現(xiàn)方法。但是,F(xiàn)ileOutputStream就需要使用代碼,此代碼應(yīng)該理解如何在主機(jī)平臺(tái)上將數(shù)據(jù)寫入文件。注意:盡管該方法把整形值作為變量,但是它實(shí)際上寫入的是一個(gè)無(wú)符號(hào)字節(jié)。Java沒(méi)有無(wú)符號(hào)字節(jié)數(shù)據(jù)類型,因此這里使用整型來(lái)代替。無(wú)符號(hào)字節(jié)和有符號(hào)字節(jié)之間的真正區(qū)別是編譯器對(duì)它們的解釋。二者都是由8位組成,并且當(dāng)使用write(int b)將一個(gè)int寫入到網(wǎng)絡(luò)連接流時(shí),只有8位數(shù)據(jù)傳送。如果將一個(gè)超出0-255范圍的int
6、傳給write(int b),則寫入該數(shù)字的低位字節(jié),而忽略余下的三個(gè)字節(jié)(大家都知道java的int是4個(gè)字節(jié)的,這里本質(zhì)就是將int轉(zhuǎn)換為byte)。Ø public void write(byte data) throws IOException和public void write(byte data,int offset,int length) throws IOException每次寫入一個(gè)字節(jié)通常效率不高。因此,大部分TCP/IP程序?qū)?shù)據(jù)存入一定長(zhǎng)度的緩沖區(qū),即在內(nèi)存中累積字
7、節(jié),并僅當(dāng)累積了一定數(shù)目字節(jié)或過(guò)了一定的時(shí)間段,才將它們發(fā)送到最終的目的地。因此write(byte data)和write(byte data,int offset,int length)就是這樣產(chǎn)生了。Ø public void flush() throws IOException我們可以在軟件中或直接在Java代碼中對(duì)流實(shí)施緩沖操作,也可以在網(wǎng)絡(luò)硬件中對(duì)流實(shí)施緩沖操作。就好像BufferedOutputStream或BufferedWriter鏈接到底層流來(lái)實(shí)現(xiàn)流緩沖。因此,如果正在
8、寫入數(shù)據(jù),則刷新輸出流是相當(dāng)重要的。例如,假設(shè)已經(jīng)寫入了一個(gè)300字節(jié)的請(qǐng)求給一個(gè)HTTP Keep-Alive的HTTP服務(wù)器,通常希望在發(fā)送更多數(shù)據(jù)之間等待響應(yīng)。但是,如果輸出流有一個(gè)1024字節(jié)的緩沖區(qū),則該流可能在將數(shù)據(jù)發(fā)送出緩沖區(qū)之前正在等待更多的數(shù)據(jù)到達(dá),但是這些數(shù)據(jù)似乎不會(huì)到達(dá)的,因?yàn)樗鼈冞€沒(méi)有發(fā)送出去,但是緩沖流不會(huì)發(fā)送數(shù)據(jù)給服務(wù)器,除非它從底層流獲得更多的數(shù)據(jù),但是底層流不會(huì)發(fā)送更多的數(shù)據(jù),除非它從服務(wù)器獲得數(shù)據(jù),而服務(wù)器不會(huì)發(fā)送數(shù)據(jù),除非它獲得保留在緩沖區(qū)中的數(shù)據(jù)(死鎖了!),flush()方法就可以解決了這個(gè)僵局,因?yàn)榧词咕彌_區(qū)未滿,他也會(huì)強(qiáng)制要求實(shí)行緩沖操作的流傳送數(shù)據(jù)
9、。注意:是否對(duì)流實(shí)行了緩沖操作,這決定于你如何獲得指向流的引用(例如,不論是否希望對(duì)執(zhí)行緩沖操作,都會(huì)對(duì)其實(shí)施緩沖)。如果刷新流需要刷新時(shí),就必須刷新,但是如果刷新失敗了就會(huì)導(dǎo)致不可預(yù)料、不可重復(fù)的程序掛起(flush()返回值是void啊),如果事先不了解掛起問(wèn)題所在,就很難解決這個(gè)問(wèn)題了。因此,在關(guān)閉所有流之前,應(yīng)當(dāng)立即刷新它們。否則,關(guān)閉流前,緩沖區(qū)中的剩余數(shù)據(jù)可能會(huì)丟失。Ø public void close() throws IOException最后當(dāng)利用完流之后,應(yīng)當(dāng)調(diào)用cl
10、ose()方法關(guān)閉流。它會(huì)釋放所有與這個(gè)流相關(guān)的資源,如文件句柄或端口。一旦輸出流關(guān)閉了,再向其寫入數(shù)據(jù)就會(huì)觸發(fā)IOException異常。但是,有些類型可能允許對(duì)對(duì)象進(jìn)行一定操作。如一個(gè)已關(guān)閉的ByteArrayOutputStream仍然可以轉(zhuǎn)化成一個(gè)實(shí)際的字節(jié)數(shù)組,而且一個(gè)已關(guān)閉的DigestOutputStream仍可以返回其摘要。二、輸入流java的基本輸入流是public abstract class InputStreamn public abstract int read() thr
11、ows IOExceptionn public int read(byte data) throws IOExceptionn public int read(byte data,int offset,int length) throws IOExceptionn public long skip(long n
12、) throws IOExceptionn public int available() throws IOExceptionn public void close() throws IOExceptionInputStream的具體子類使用這些方法從指定媒體讀取數(shù)據(jù)。但是不論讀取何種資源,幾乎只能使用這六種方法。有時(shí)你甚至可能不知道正在從哪種類型的流中讀取數(shù)據(jù)。如隱藏在包中TelnetInputStre
13、am是一個(gè)文檔沒(méi)有說(shuō)明的類。TelnetInputStream的實(shí)例由包中的多種方法返回;如的openStram()方法。但是,這些方法僅聲明了返回InputStream,而不是更加明確的子類TelnetInputStream,這又是多態(tài)性在起作用了。子類的實(shí)例可以作為超類的實(shí)例透明使用。來(lái)了,又來(lái)說(shuō)明方法的由來(lái)了。Ø public abstract void read() throws IOExceptionInputStream類的基本方法是沒(méi)有參量的read()方法(這個(gè)與Outpu
14、tStream不同了)。該方法從輸入流資源讀取一個(gè)單個(gè)字節(jié)數(shù)據(jù)并將數(shù)據(jù)作為0到255之間的數(shù)返回,返回-1時(shí)表示流的結(jié)尾。因?yàn)镴ava沒(méi)有無(wú)符號(hào)字節(jié)的數(shù)據(jù)類型,所以數(shù)據(jù)以整型類型返回。Read()方法等待和阻塞該方法后人和代碼的執(zhí)行,直到獲得數(shù)據(jù)的一個(gè)字節(jié)并準(zhǔn)備讀取該字節(jié)。因此,輸入和輸出可能相當(dāng)慢,這時(shí)用戶如果需要完成其他比較重要的任務(wù)時(shí),最好試圖將I/O放到它們自己的線程中。Read()方法被聲明為抽象方法,因?yàn)樽宇愋枰淖兯鼇?lái)處理特定媒體。給個(gè)例子byte input=new byte10;for(int i=0;i<INPUT.LENGTH;I+)< FONT>int
15、 b=in.read();if(b=-1) break;inputi=(byte)b;上面盡管read()方法僅讀取字節(jié),但是它返回的是整型值。因此在將結(jié)果存儲(chǔ)到字節(jié)數(shù)組之前,需要一個(gè)類型轉(zhuǎn)換的過(guò)程。當(dāng)然,這會(huì)產(chǎn)生一個(gè)介于-128到127的有符號(hào)字節(jié),而不是read()方法返回的0到255之間的一個(gè)無(wú)符號(hào)字節(jié)。但是,只要用戶清楚使用的是無(wú)符號(hào)還是有符號(hào)字節(jié)就不會(huì)有很大問(wèn)題。因此,我們可以把一個(gè)有符號(hào)字節(jié)轉(zhuǎn)化成無(wú)符號(hào)字節(jié)(轉(zhuǎn)換的原因是只有范圍在0-255的整數(shù)才可以被存儲(chǔ)在java的一個(gè)byte類型的變量中)。int i=b>=0?b:256+b;這里費(fèi)了大篇幅,說(shuō)明了read()返回的與
16、java的byte類型的處理問(wèn)題,大家可要注意阿,如果對(duì)java的原始數(shù)據(jù)類型還有興趣,可以看一下我的原始數(shù)據(jù)類型學(xué)習(xí)筆記(未完成)。Ø public int read(byte data) throws IOException、public int read(byte data,int offset,int length) throws IOException每次讀取一個(gè)字節(jié)和每次寫入一個(gè)字節(jié)效率都不高,因此read(byte data)和read(byte data,int offse
17、t,int length)也相應(yīng)產(chǎn)生了。這兩個(gè)方法將從流中讀取的多個(gè)字節(jié)填充到一個(gè)指定的數(shù)組中。注意:這些填充到數(shù)組的操作不一定會(huì)成功的。一個(gè)很普遍的情況是一個(gè)讀試圖不會(huì)完全失敗也不會(huì)完全成功,它可能讀出請(qǐng)求數(shù)據(jù)的一部分字節(jié),而不是全部字節(jié)。例如,當(dāng)實(shí)際上只有512字節(jié)已經(jīng)到達(dá)服務(wù)器時(shí),用戶可能會(huì)試圖從一個(gè)網(wǎng)絡(luò)流上讀取1024字節(jié),而其他字節(jié)仍然在傳送中,這些字節(jié)最終會(huì)到達(dá)服務(wù)器,但到達(dá)時(shí)卻已是不可以獲得的。因此,多字節(jié)讀取方法會(huì)返回實(shí)際讀取的字節(jié)數(shù)目。給個(gè)例子byte input=new byte1024;int bytesRead=in.read(input);代碼段試圖從InputStr
18、eam in讀取1024字節(jié)到數(shù)組input中。但是,如果僅有512字節(jié)可以獲得,則這些字節(jié)就是將要讀取的全部字節(jié),并且bytesRead值會(huì)設(shè)為512。但我們?yōu)榱吮WC在實(shí)際上讀取到所有的字節(jié),怎么辦?看int bytesRead=0;int byteToRead=1024;byte input=new bytebyteToRead;while(bytesRead<BYTETOREAD)< FONT>bytesRead+=in.read(input,bytesRead,byteToRead-bytesRead);Ø
19、160; public int available() throws IOException如果由于某種原因用戶不希望讀取數(shù)據(jù),除非用戶想要的全部數(shù)據(jù)可以立即得到,這時(shí)候就可以用available()方法返回的字節(jié)數(shù)是能夠讀取的最小字節(jié)數(shù),而在實(shí)際上可以讀取更多的字節(jié),但是能夠讀取的字節(jié)數(shù)據(jù)至少與available()返回的字節(jié)數(shù)一樣多??蠢觟nt bytesAvailable=in.available();byte input=new bytebytesAvailable;int byteTead=in.read(input,0,bytesAvailab
20、le);/其他代碼這里我們可以斷言bytesRead正好等于bytesAvailable,但不能斷言bytesRead>0,因?yàn)閍vailable()返回0是有可能的。流結(jié)束時(shí):available()返回0;read(byte data,int offset,int length)通常返回-1;流沒(méi)有結(jié)束,可讀取字節(jié)數(shù)即available()得到的值為0時(shí)read(byte data,int offset,int length)會(huì)忽略流的結(jié)束,返回0;Ø public long sk
21、ip(long n) throws IOException在極少數(shù)情況下,用戶可能希望跳過(guò)數(shù)據(jù)而不去讀取它們。Skip()方法就是實(shí)現(xiàn)這個(gè)功能的。這個(gè)方法在從文件讀取數(shù)據(jù)時(shí)較為有用,而在網(wǎng)絡(luò)連接流上則用處較小。因?yàn)榫W(wǎng)絡(luò)連接流是有序的而且通常很慢,因此讀取數(shù)據(jù)的耗時(shí)不會(huì)太多的超過(guò)跳過(guò)數(shù)據(jù)的耗時(shí)。文件可以隨機(jī)訪問(wèn),因此我們通過(guò)重定位文件指針就能簡(jiǎn)單的實(shí)現(xiàn)數(shù)據(jù)的跳轉(zhuǎn),而不是跳過(guò)每一個(gè)字節(jié)。Ø public void close() throws IOException和輸出流一樣,程序利用完輸入流之后,就應(yīng)該調(diào)用close()方法關(guān)閉該輸入流了(要記住啊)。該方法會(huì)釋放與輸入流有關(guān)的所有資源,如文件句柄和端口。一旦輸入流關(guān)閉,再?gòu)乃x取數(shù)據(jù)時(shí)會(huì)觸發(fā)IOException。但是,有些類型的流可能仍允許對(duì)對(duì)象進(jìn)行一定的操作。例如,用戶通常不希望從中獲取報(bào)文摘要,除非已經(jīng)讀取了所有數(shù)據(jù)并且關(guān)閉了輸入流??吹竭@里或許你還會(huì)問(wèn)怎么還有三個(gè)方法沒(méi)有呢,對(duì)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 前臺(tái)工作的職業(yè)發(fā)展路徑計(jì)劃
- 財(cái)務(wù)資金分配計(jì)劃
- 通信行業(yè)月度個(gè)人工作計(jì)劃
- 《六盤水市東風(fēng)煤業(yè)有限公司水城區(qū)東風(fēng)煤礦(優(yōu)化重組)礦產(chǎn)資源綠色開(kāi)發(fā)利用方案(三合一)》評(píng)審意見(jiàn)
- 攀枝花駿恒礦業(yè)有限責(zé)任公司爐房箐鐵礦礦山地質(zhì)環(huán)境保護(hù)與土地復(fù)墾方案情況
- 保健植物知識(shí)培訓(xùn)課件
- 蛋白還原酸護(hù)理教程
- 小學(xué)信息技術(shù)四年級(jí)上冊(cè)第5課《 精彩游戲-軟件的下載》教學(xué)設(shè)計(jì)001
- 2025年銅川貨運(yùn)從業(yè)資格證考試模擬考試題庫(kù)下載
- 2025年新鄉(xiāng)貨運(yùn)從業(yè)資格證怎么考試
- 《空氣動(dòng)力學(xué)基礎(chǔ)》緒論課件
- 卡通插畫幼兒園國(guó)防教育主題班會(huì)課程PPT實(shí)施課件
- 紅樓夢(mèng)人物關(guān)系圖譜可A4打印版
- 第一屆全國(guó)中學(xué)生地球科學(xué)競(jìng)賽初賽試題試題含答案
- 石化公司建設(shè)項(xiàng)目竣工文件整理歸檔規(guī)范
- A4線纜標(biāo)簽數(shù)據(jù)模板
- 加油站電器火災(zāi)應(yīng)急預(yù)案演練記錄
- 沖壓件,汽車表面零件缺陷及原因分析
- 電熔旁通鞍型
- 2022八年級(jí)下冊(cè)道德與法治全冊(cè)知識(shí)點(diǎn)梳理
- 工程數(shù)學(xué)線性代數(shù)第一章同濟(jì)第五版ppt課件
評(píng)論
0/150
提交評(píng)論