日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > Java > 正文

Java 網絡編程---I/O部分學習筆記整理1

2019-11-17 06:34:30
字體:
來源:轉載
供稿:網友

       網絡程序的很大一部分是簡單的輸入輸出,即從一個系統向另一個系統移動字節。字節就是字節,在很大程度上,讀服務器發送的數據與讀取文件沒什么不同;向客戶傳送數據與寫入一個文件也沒有什么區別。

       java中輸入和輸出組織不同于大多數其他語言。它是建立在流(stream)上。不同的基本流類(如java.io.FileInputStream和sun.net.TelnetOutputStream)用于讀寫特定的數據資源。但是所有的基本輸出流使用同一種基本方法讀數據。

       過濾器流可以連接到輸入流或輸出流。它可以修改已經讀出或寫人的數據(例如,加密或壓縮數據),或者可以簡單地提供附加方法將已經讀出或寫入的數據轉化成其他格式。

       最后Reader和Writer也可以鏈接到輸入流和輸出流,從而答應程序讀出和寫入文本(即字符)而不是字節。假如使用正確,Reader和Writer能夠處理多種類型的字符編碼,包括SJIS和UTF-8等多字節字符集。

 

一、輸出流

java的基本輸出流是 java.io.OutputStream.

public abstract class OutputStream

n         public abstract void write(int b) throws IOException

n         public void write(byte[] data) throws IOException

n         public void write(byte[] data,int offset,int length) throws IOException

n         public void flush() throws IOException

n         public void close() throws IOException

OutputStream的子類使用這些方法向指定媒體寫入數據。

 

我使用相信,我們理解了問什么它們存在,就會更好地記住它們,好,現在開始說一下OutputStream類的方法的由來

Ø         public abstract void write(int b) throws IOException

OutputStream的基本方法是write(int b)。該方法將介于0到255之間的整數看作變量,并將相應的字節寫到一個輸出流。該方法聲明是個抽象方法,因為子類需要改變它以處理特定媒體。例如,ByteArrayOutputStream可以使用拷貝字節到其數組的純Java代碼來實現方法。但是,FileOutputStream就需要使用代碼,此代碼應該理解如何在主機平臺上將數據寫入文件。注重:盡管該方法把整形值作為變量,但是它實際上寫入的是一個無符號字節。Java沒有無符號字節數據類型,因此這里使用整型來代替。無符號字節和有符號字節之間的真正區別是編譯器對它們的解釋。二者都是由8位組成,并且當使用write(int b)將一個int寫入到網絡連接流時,只有8位數據傳送。假如將一個超出0-255范圍的int傳給write(int b),則寫入該數字的低位字節,而忽略余下的三個字節(大家都知道java的int是4個字節的,這里本質就是將int轉換為byte)。

 

Ø         public void write(byte[] data) throws IOException和public void write(byte[] data,int offset,int length) throws IOException

每次寫入一個字節通常效率不高。因此,大部分TCP/ip程序將數據存入一定長度的緩沖區,即在內存中累積字節,并僅當累積了一定數目字節或過了一定的時間段,才將它們發送到最終的目的地。因此write(byte[] data)和write(byte[] data,int offset,int length)就是這樣產生了。

 

Ø         public void flush() throws IOException

我們可以在軟件中或直接在Java代碼中對流實施緩沖操作,也可以在網絡硬件中對流實施緩沖操作。就似乎BufferedOutputStream或BufferedWriter鏈接到底層流來實現流緩沖。因此,假如正在寫入數據,則刷新輸出流是相當重要的。例如,假設已經寫入了一個300字節的請求給一個HTTP Keep-Alive的HTTP服務器,通常希望在發送更多數據之間等待響應。但是,假如輸出流有一個1024字節的緩沖區,則該流可能在將數據發送出緩沖區之前正在等待更多的數據到達,但是這些數據似乎不會到達的,因為它們還沒有發送出去,但是緩沖流不會發送數據給服務器,除非它從底層流獲得更多的數據,但是底層流不會發送更多的數據,除非它從服務器獲得數據,而服務器不會發送數據,除非它獲得保留在緩沖區中的數據(死鎖了!),flush()方法就可以解決了這個僵局,因為即使緩沖區未滿,他也會強制要求實行緩沖操作的流傳送數據。注重:是否對流實行了緩沖操作,這決定于你如何獲得指向流的引用(例如,不論是否希望對System.out執行緩沖操作,都會對其實施緩沖)。假如刷新流需要刷新時,就必須刷新,但是假如刷新失敗了就會導致不可預料、不可重復的程序掛起(flush()返回值是void啊),假如事先不了解掛起問題所在,就很難解決這個問題了。因此,在關閉所有流之前,應當立即刷新它們。否則,關閉流前,緩沖區中的剩余數據可能會丟失。

 

Ø         public void close() throws IOException

最后當利用完流之后,應當調用close()方法關閉流。它會釋放所有與這個流相關的資源,如文件句柄或端口。一旦輸出流關閉了,再向其寫入數據就會觸發IOException異常。但是,有些類型可能答應對對象進行一定操作。如一個已關閉的ByteArrayOutputStream仍然可以轉化成一個實際的字節數組,而且一個已關閉的DigestOutputStream仍可以返回其摘要。

 

二、輸入流

java的基本輸入流是java.io.InputStream

public abstract class InputStream

n         public abstract int read() throws IOException

n         public int read(byte[] data) throws IOException

n         public int read(byte[] data,int offset,int length) throws IOException

n         public long skip(long n) throws IOException

n         public int available() throws IOException

n         public void close() throws IOException

InputStream的具體子類使用這些方法從指定媒體讀取數據。但是不論讀取何種資源,幾乎只能使用這六種方法。有時你甚至可能不知道正在從哪種類型的流中讀取數據。如隱藏在sun.net包中TelnetInputStream是一個文檔沒有說明的類。TelnetInputStream的實例由java.net包中的多種方法返回;如java.net.URL的openStram()方法。但是,這些方法僅聲明了返回InputStream,而不是更加明確的子類TelnetInputStream,這又是多態性在起作用了。子類的實例可以作為超類的實例透明使用。

來了,又來說明方法的由來了。

Ø         public abstract void read() throws IOException

InputStream類的基本方法是沒有參量的read()方法(這個與OutputStream不同了)。該方法從輸入流資源讀取一個單個字節數據并將數據作為0到255之間的數返回,返回-1時表示流的結尾。因為Java沒有無符號字節的數據類型,所以數據以整型類型返回。Read()方法等待和阻塞該方法后人和代碼的執行,直到獲得數據的一個字節并預備讀取該字節。因此,輸入和輸出可能相當慢,這時用戶假如需要完成其他比較重要的任務時,最好試圖將I/O放到它們自己的線程中。Read()方法被聲明為抽象方法,因為子類需要改變它來處理特定媒體。給個例子

byte[] input=new byte[10];

for(int i=0;i<input.length;i++){

       int b=in.read();

       if(b==-1) break;

       input[i]=(byte)b;

}

上面盡管read()方法僅讀取字節,但是它返回的是整型值。因此在將結果存儲到字節數組之前,需要一個類型轉換的過程。當然,這會產生一個介于-128到127的有符號字節,而不是read()方法返回的0到255之間的一個無符號字節。但是,只要用戶清楚使用的是無符號還是有符號字節就不會有很大問題。因此,我們可以把一個有符號字節轉化成無符號字節(轉換的原因是只有范圍在0-255的整數才可以被存儲在java的一個byte類型的變量中)。

int i=b>=0?b:256+b;

這里費了大篇幅,說明了read()返回的與java的byte類型的處理問題,大家可要注重阿,假如對java的原始數據類型還有愛好,可以看一下我的原始數據類型學習筆記(未完成)。

 

Ø         public int read(byte[] data) throws IOException、public int read(byte[] data,int offset,int length) throws IOException

每次讀取一個字節和每次寫入一個字節效率都不高,因此read(byte[] data)和read(byte[] data,int offset,int length)也相應產生了。這兩個方法將從流中讀取的多個字節填充到一個指定的數組中。注重:這些填充到數組的操作不一定會成功的。一個很普遍的情況是一個讀試圖不會完全失敗也不會完全成功,它可能讀出請求數據的一部分字節,而不是全部字節。例如,當實際上只有512字節已經到達服務器時,用戶可能會試圖從一個網絡流上讀取1024字節,而其他字節仍然在傳送中,這些字節最終會到達服務器,但到達時卻已是不可以獲得的。因此,多字節讀取方法會返回實際讀取的字節數目。給個例子

byte[] input=new byte[1024];

int bytesRead=in.read(input);

代碼段試圖從InputStream in讀取1024字節到數組input中。但是,假如僅有512字節可以獲得,則這些字節就是將要讀取的全部字節,并且bytesRead值會設為512。但我們為了保證在實際上讀取到所有的字節,怎么辦?看

int bytesRead=0;

int byteToRead=1024;

byte[] input=new byte[byteToRead];

while(bytesRead<byteToRead){

       bytesRead+=in.read(input,bytesRead,byteToRead-bytesRead);

}

Ø         public int available() throws IOException

假如由于某種原因用戶不希望讀取數據,除非用戶想要的全部數據可以立即得到,這時候就可以用available()方法返回的字節數是能夠讀取的最小字節數,而在實際上可以讀取更多的字節,但是能夠讀取的字節數據至少與available()返回的字節數一樣多。

看例子

int bytesAvailable=in.available();

byte[] input=new byte[bytesAvailable];

int byteTead=in.read(input,0,bytesAvailable);

//其他代碼

這里我們可以斷言bytesRead正好等于bytesAvailable,但不能斷言bytesRead>0,因為available()返回0是有可能的。

流結束時:

available()返回0;

read(byte[] data,int offset,int length)通常返回-1;

       流沒有結束,可讀取字節數即available()得到的值為0時

read(byte[] data,int offset,int length)會忽略流的結束,返回0;

 

Ø         public long skip(long n) throws IOException

在極少數情況下,用戶可能希望跳過數據而不去讀取它們。Skip()方法就是實現這個功能的。這個方法在從文件讀取數據時較為有用,而在網絡連接流上則用處較小。因為網絡連接流是有序的而且通常很慢,因此讀取數據的耗時不會太多的超過跳過數據的耗時。文件可以隨機訪問,因此我們通過重定位文件指針就能簡單的實現數據的跳轉,而不是跳過每一個字節。

 

Ø         public void close() throws IOException

和輸出流一樣,程序利用完輸入流之后,就應該調用close()方法關閉該輸入流了(要記住啊)。該方法會釋放與輸入流有關的所有資源,如文件句柄和端口。一旦輸入流關閉,再從它讀取數據時會觸發IOException。但是,有些類型的流可能仍答應對對象進行一定的操作。例如,用戶通常不希望從java.security.DigestInputStream中獲取報文摘要,除非已經讀取了所有數據并且關閉了輸入流。

 

看到這里或許你還會問怎么還有三個方法沒有呢,對,還有三個不常用的方法

public void mark(int readAheadLimit)

public void reset() throws IOException

public boolean markSupported();

這些方法答應程序備份和重新讀取已經讀取過的數據。要實現這個功能,需要用mark()方法在輸入流中的當前位置作個標記,在以后的某點可以使用reset()方法重新將流定位到標記處,隨后的讀取將返回從標記初開始的數據。但是,從標記處到重新將流定位點不能任意長。重新定位到標記處之前答應讀取的字節數就是由mark()的變量readAheadLimit決定。多長就會觸發IOException,而且任何指定時刻,輸入流中只可以有一個標記,假如標記了第二個標記,就會覆蓋第一個標記了。其實標記和重新設置位置都是通過存儲從內部緩沖區中的標記位置讀出每一字節來實現。最麻煩的狀況是,并非所有輸入流都支持標記和重新設置位置的。所以在設置之前要用markSupported()方法檢測一下。

實際上不支持標記和重新設置位置的流多于支持它們的流。Elliotte Rusty Harold大師覺得這幾個方法設計的標準不高,將功能性與一個許多甚至可能是大部分子類都不可用的抽象超類結合是一個相當拙劣的想法。最好是將這三個方法放在不同的接口中。提供類似于markSupported()方法在運行時進行功能性檢測是較為傳統,非面向對象的解決方法。面向對象的方法將通過接口和類把該方法嵌入到面向對象系統中,從而在編譯時檢測所有的流。

Java.io中總是支持標記的輸入流:BufferedInputStream和ByteArrayInputStream。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产在线欧美| 日韩在线 中文字幕| 91精品婷婷国产综合久久竹菊| 日韩在线中文视频| 欧美日韩精品免费在线观看视频| 在线视频国内一区二区| 日韩国产91| aaa大片在线观看| 欧美一级在线免费| 91精品国产综合久久久久久 | 国产嫩草影院久久久久| 69av亚洲| 色综合天天综合网天天狠天天 | 1区2区3区在线视频| √新版天堂资源在线资源| 国产在线黄色片| 日韩在线欧美| 一区二区三区高清在线| 91av久久久| 中文 欧美 日韩| 亚洲视频日韩| www..com日韩| 久久永久免费视频| 国产一卡2卡3卡4卡网站免费 | 国内不卡的二区三区中文字幕| 欧美黄页在线免费观看| aaa欧美日韩| 国产福利第一页| www.三级.com| 中文国产字幕在线观看| 欧美日韩一二三| 日韩欧美不卡在线| 欧美激情视频一区二区三区在线播放| 国产欧美久久久精品影院| 成人欧美亚洲| 欧美日韩精品综合在线| 欧美黄页在线免费观看| 在线观看国产一级片| 中文字幕国产欧美| 一级特黄aaa大片在线观看| 国产综合成人久久大片91| 999在线视频| 国产福利久久久| 国产日韩成人精品| 国产专区中文字幕| 国产日韩在线亚洲字幕中文| 国产欧美日韩在线看| 日韩在线欧美| 精品久久久久久无| 日韩国产欧美在线视频| 精品国产1区二区| 日本精品国语自产拍在线观看| 99色在线视频| 国产真实乱子伦精品视频| 精品人妻一区二区免费视频| 欧美日韩精品中文字幕| 国产婷婷在线观看| 欧美日韩国产高清| 在线免费视频一区二区| 国产在线www| 国产欧亚日韩视频| 97久久精品午夜一区二区| 欧美不卡123| 免费一级欧美在线观看视频| 日韩欧美不卡| 日韩精品欧美| 日韩欧美在线中字| 亚洲一级影院| 婷婷中文字幕在线观看| 国产99对白在线播放| 欧美三级中文字幕在线观看| 欧美日韩夫妻久久| 欧美性生交大片免费| 亚洲成av人片在线| 亚洲一区在线观看免费| 亚洲视频资源在线| 日韩.欧美.亚洲| 欧美成人精品在线| 日韩亚洲欧美中文字幕| 亚洲福利精品视频| 国内激情久久| 欧美日韩成人综合| 亚洲理论中文字幕| 在线视频观看日韩| 91精品国产色综合久久久蜜香臀| 欧美中文字幕在线观看视频| 中文字幕在线视频第一页| 日韩av二区| 九九视频精品免费| www中文字幕| 日韩欧美亚洲国产一区| 人人做人人澡人人爽欧美| 亚洲免费看av| www.中文字幕在线| 日韩国产成人精品| 久久99精品久久久久久青青日本| 婷婷中文字幕在线观看| 精品精品久久| 精品国产欧美成人夜夜嗨| 午夜国产福利一区二区| 日韩av不卡在线观看| 欧美日韩国产高清视频| 亚洲日产av中文字幕| 色国产在线视频| 欧美日韩国产综合久久 | 欧美日韩免费视频| 麻豆一区二区99久久久久| 国产欧美日韩最新| 亚洲综合日韩中文字幕v在线| 日本免费在线视频不卡一不卡二| 中文字幕欧美日韩在线不卡| 欧美国产亚洲一区| 日韩欧美国产高清91| 国产95在线|亚洲| 欧美中文字幕视频在线观看| 国产欧美日韩亚州综合| 久久精品国产99| 久久久精品网| 91精选在线| 日韩精品在线私人| 中文字幕一区不卡| 国产成人中文字幕| 日韩一级免费在线观看| 91精品视频播放| 一区二区三区四区五区视频在线观看| 蜜臀久久精品| 国产视频一区三区| 日韩高清不卡一区二区| 日韩精品视频中文在线观看| 中文字幕日韩在线观看| 黄色一区二区在线| av免费在线不卡| 区日韩二区欧美三区| a视频在线播放| 日韩国产专区| 精品久久久视频| 国产在线视频不卡| 久久精品蜜桃| 免费在线亚洲| 欧美中文字幕第一页| 精品免费久久久| 日韩欧美中文| 日韩久久在线| 在线手机中文字幕| 91精品久久久久久久久| 日韩国产成人| 欧美日韩综合色| 在线视频第一页| av一区二区高清| 欧美日韩三级视频| 在线一区二区三区精品| 国产 欧美在线| 国产性一级片| 91精品在线观看入口| 欧美日韩亚洲国内综合网| 日韩国产成人| 91精品网站| 日韩欧美国产1| a天堂中文在线官网在线| 一区精品在线播放| 在线视频亚洲| 中文字幕 乱码 中文乱码91| 欧美日韩亚洲天堂| 日韩视频不卡中文| 日韩精品欧美| 日韩精品首页| 99久久www免费| 国产导航在线| 国产免费不卡av| 欧美日韩精品电影| 久久精品网站免费观看| 日本精品在线播放| 日韩在线中文| 久久精品电影| 国产一区成人| 蜜桃久久av| 亚洲欧洲日韩精品在线| 日韩中文首页| 中文字幕欧美亚洲| 欧美日韩中文字幕在线| 色猫猫国产区一区二在线视频| 中文字幕精品国产| 欧美日韩成人一区二区| 久久99久久久久久久噜噜| 亚洲最新免费视频| 日韩在线中文字幕| 精品日韩欧美| 国产午夜在线观看| 91精品电影| 欧美日韩精品国产| 日韩三级在线播放| 亚洲视频色图| 午夜视频在线观看一区| 国产日韩av高清| 99综合精品久久| 中文字幕欧美日韩| 国产日韩中文字幕| 91精品在线观看国产| 中文字幕亚洲一区二区av在线| 精品成人久久av| 在线视频第一页| 中文字幕日韩精品在线| 一区二区三区在线播| 精品成人久久久| 国产一区日韩欧美| 亚洲a级在线播放观看| 国产三级在线播放| 亚洲黄色www| 中文字幕在线观看欧美| 国产欧美日韩在线观看| 国产在线二区| 国产成人精品999| 亚洲欧洲日产国码av系列天堂| 国产99在线 | 亚洲| 亚洲热线99精品视频| 国产日韩中文字幕在线| 日韩视频一区在线观看| 91精品日本| 国产91久久久久蜜臀青青天草二| 国产一级视频在线播放| av一区二区高清| 久久久精品福利| 亚洲欧洲综合另类| 色综合天天综合网天天狠天天| 欧美日韩综合在线观看| 色综合天天性综合| 99色在线视频| 国产高清在线观看| 欧美亚洲天堂网| 国产一二三精品| 精品国产免费视频| 欧美日韩在线播放一区| 国产区日韩欧美| av免费观看国产| 亚洲一区日韩精品中文字幕| 日韩国产成人精品| 久久69成人| 日本精品在线播放| 日韩精品视频在线观看网址| 精品日韩一区二区三区免费视频| 中文字幕国产欧美| 国产黄在线观看| 久99久视频| 99精品999| 黄色在线播放网站| 1024国产在线| 欧美亚洲专区| 免费视频久久| 中文字幕亚洲一区在线观看| 色综合天天综合网天天狠天天| 亚洲福利在线看| 91精品久久久久久久久久| 国产在线高清精品| 91亚洲欧美| 中文字幕欧美日韩在线| 欧美日韩中文字幕| 日韩精品欧美在线| 亚洲校园欧美国产另类| 日韩av一区二| 91精品国产91久久久久久不卡 | 日韩三级视频在线| 91精品国产自产在线观看永久∴ | 91精品国产免费| 中文字幕 亚洲视频| 黄色欧美日韩| 久久在线91| 久久精品国产99| 欧美日韩国产三级| 日韩欧美中文在线视频| 国产中文伊人| www.日韩免费| 中文字幕在线视频久| 日本а中文在线天堂| 午夜影院在线观看欧美| 综合图区亚洲白拍在线| 在线看欧美日韩| 91欧美日韩麻豆精品| 日韩一级网站| 51精品免费网站| 美国av一区二区| 国产一二三视频| 国产亚洲二区| 欧美日韩国产亚洲一区| 精品日韩在线播放| 亚洲福利一区二区三区| 黄色国产网站在线观看| 国产999在线观看| 精品一区二区三区中文字幕 | 日韩欧美一级精品久久| 日韩中文字幕国产| 日韩欧美在线第一页| 中文字幕在线观看播放| 亚洲综合欧美在线| 欧美在线视频一区二区| 不卡一区二区三区视频| 国产婷婷色一区二区三区在线| 日韩久久99| 日韩精品在线网站| 欧美日韩国产在线播放| 国产欧美日韩在线看| 欧美日韩在线播放一区| 丰满少妇一区| 韩国av一区二区| 中文欧美字幕免费| 日韩精品视频免费播放| 中文字幕精品视频在线| 一级片免费在线| 亚洲黄色www| 91精品婷婷国产综合久久竹菊| 欧美日韩中文字幕日韩欧美| 久久riav| 97最新国自产拍视频在线完整在线看 | 国产成人一区二区精品非洲| 日韩精品在线观看视频| 亚洲欧美小说国产图片| 欧美一级手机免费观看片 | 国产成人精品综合网站| 在线国产1区| 欧美日韩亚洲91| 欧美在线视频第一页| av免费在线网站| 91麻豆精品国产91久久久使用方法| 中文字幕精品国产| 日本黄色一区二区三区| 亚洲免费精品| 国产一区 二区 三区一级| 国产欧美在线观看| 日韩欧中文字幕| 国产中文在线| 欧美日韩在线视频免费观看 | 国产xxx在线| 一区二区日韩av| 一级片免费网站| 精品国产1区2区3区| 日韩国产一区久久| 精品国产乱码久久久久久蜜臀| 欧美亚洲天堂网| 日韩欧美国产免费播放| 中文在线中文字幕| a天堂中文在线官网在线| 精品视频在线视频| 在线免费视频一区二区| 不卡在线视频| 国产手机精品视频| 欧美三级视频在线| 亚洲高清免费一级二级三级| 中文精品电影| 最新中文在线视频| 日韩不卡高清视频| 亚洲高清不卡一区| 一区二区视频在线| 一区二区三区高清在线| 亚洲区中文字幕| 中文字幕国产在线| 二区中文字幕| 精品欧美不卡一区二区在线观看| 丰满少妇一区二区| 交视频在线观看国产| 成人无遮挡免费网站视频在线观看 | 国产欧美第一页| 亚洲一区在线观看网站| 中文 欧美 日韩| 7799精品视频天天看| 日韩久久不卡| 日本黄色一区二区三区| 免费视频二区| 欧美日韩国产首页在线观看| 亚洲制服丝袜一区| 欧美日韩国产系列| 国产手机精品视频| 影音先锋中文字幕在线观看| 91色在线看| 日韩欧美国产三级| 欧美三级免费观看| 中文字幕一区免费| 日韩精品免费视频一区二区三区| 日韩欧美亚洲国产一区| 国产一区久久| 精品福利二区三区| 91麻豆精品国产91久久久使用方法 | 国产欧美日韩不卡免费| 日韩精品在线观| 日韩中文字幕久久| 午夜av一区| 91精品国产综合久久蜜臀| 最近中文av字幕在线中文| 国产亚洲欧美色| 国产免费电影网站入口| 国产不卡精品在线| 午夜福利一区二区三区| 国产成人va亚洲电影| 日韩视频在线一区| 欧美日韩亚洲不卡| 精品国产免费观看一区| 日韩在线视频观看正片免费网站| 免费高清在线一区| 二区中文字幕| 日韩亚洲不卡在线| 欧美日韩高清一区二区| 日韩国产在线观看一区|