我的個(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ù)器的資源。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注