国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

BufferedReader的ready與readLine使用,以及Premature EOF異常

2019-11-14 20:49:25
字體:
供稿:網(wǎng)友
BufferedReader的ready與readLine使用,以及PRemature EOF異常

我的個(gè)人主頁:http://www.foreyou.net

  有些人在讀取服務(wù)器端返回的數(shù)據(jù)的時(shí)候,使用了BufferedReader類的ready:

1 while(reader.ready()) {2  //執(zhí)行讀取操作,即readLine 3 }

  這個(gè)方法很經(jīng)常被用到, 但是返回的卻都是空,這是什么原因呢,查看了一下幫助文檔,以及上網(wǎng)查了查,總結(jié)如下:

  1. ready是查看流是否已經(jīng)準(zhǔn)備好被讀,是一個(gè)非阻塞的方法,所以會(huì)立刻返回,由于服務(wù)器沒有準(zhǔn)備好被讀,所以會(huì)立刻返回,所以讀取到的都是null。

  2. readLine是一個(gè)阻塞的方法,只要沒有斷開連接,就會(huì)一直等待,直到有東西返回,那么什么時(shí)候返回空呢,只有讀到數(shù)據(jù)流最末尾,才返回null。

  以上摘自:http://blog.csdn.net/neusoftware_20063500/article/details/3723176

  實(shí)際上,在讀網(wǎng)絡(luò)數(shù)據(jù)的時(shí)候經(jīng)常會(huì)遇到數(shù)據(jù)延遲等問題。

這時(shí)就可以使用 ready函數(shù)查看BufferedReader是否已經(jīng)準(zhǔn)備好。

while(!reader.ready){ //阻塞,等待一段時(shí)間 } while(reader.readLine()!==null){ //執(zhí)行操作 }

  特別要注意的是當(dāng)reader.readLine已經(jīng)讀完之后,如果繼續(xù)執(zhí)行ready操作,會(huì)返回false; 因此,下面兩段代碼可能造成死循環(huán):

  1.

while(reader.readLine()!==null){      //執(zhí)行操作       while(!reader.ready){       //阻塞,等待一段時(shí)間       }  }

2.

while(reader.readLine()!==null){  //執(zhí)行操作  }  while(!reader.ready){  //阻塞,等待一段時(shí)間  }

Premature EOF

在讀取網(wǎng)絡(luò)流的數(shù)據(jù)時(shí)很容易遇到 java.io.IOException: Premature EOF的異常。

  發(fā)生Premature EOF的可能有:  1. 在stream到達(dá)EOF之前,stream已經(jīng)結(jié)束。( no EOF marker),顯然這種情況下很有可能是響應(yīng)超時(shí)、服務(wù)端處理錯(cuò)誤、網(wǎng)絡(luò)問題、防火墻。  2. EOF過早地出現(xiàn)了。( EOF marker comes earlier before it shoud be.)

目前,沒有找到很好的有效的解決方法。因?yàn)椋@個(gè)問題出現(xiàn)的原因有很多。有些是客戶端問題,這種問題可以通過改善良好的代碼習(xí)慣來杜絕。比如,要記住關(guān)閉流以及網(wǎng)絡(luò)連接,合理使用網(wǎng)絡(luò)和計(jì)算機(jī)資源。在讀取網(wǎng)絡(luò)流之前可以試探流是否已經(jīng)準(zhǔn)備好。

  本人也遇到過Premature EOF的問題,最開始這個(gè)問題很令人頭疼。當(dāng)時(shí)是一個(gè)多線程的程序(而且線程數(shù)相對(duì)較多,10個(gè)),雖然對(duì)于一些線程返回的結(jié)果正常,然而也有一大部分的Premature EOF異常。為此,我檢查了一遍又一遍的代碼,上網(wǎng)找了許多潛在的解決方法,但均沒有很好地解決問題。

  考慮到這個(gè)異常有可能是服務(wù)器端的錯(cuò)誤,以及我當(dāng)時(shí)所調(diào)用的服務(wù)器的資源情況,最后我將線程數(shù)設(shè)置為2個(gè)這種異常便不再出現(xiàn)了。因此,可以猜測到程序的多線程調(diào)用造成了服務(wù)端程序的資源爭搶等問題導(dǎo)致了Premature EOF異常。所以,在開發(fā)應(yīng)用程序的過程中也應(yīng)該注意到合理使用服務(wù)器的資源。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 方山县| 彰武县| 天全县| 普格县| 迁安市| 竹溪县| 甘德县| 共和县| 汝城县| 呼图壁县| 博罗县| 巴林右旗| 绥宁县| 剑阁县| 从化市| 南阳市| 阳山县| 奈曼旗| 翁牛特旗| 观塘区| 汝南县| 淳安县| 内丘县| 静安区| 紫云| 郎溪县| 古浪县| 阳信县| 江川县| 防城港市| 珠海市| 益阳市| 衡东县| 金沙县| 泰安市| 松原市| 兴义市| 墨玉县| 杂多县| 德昌县| 固原市|