我的個人主頁:http://www.foreyou.net
有些人在讀取服務器端返回的數據的時候,使用了BufferedReader類的ready:
1 while(reader.ready()) {2 //執行讀取操作,即readLine 3 }
這個方法很經常被用到, 但是返回的卻都是空,這是什么原因呢,查看了一下幫助文檔,以及上網查了查,總結如下:
1. ready是查看流是否已經準備好被讀,是一個非阻塞的方法,所以會立刻返回,由于服務器沒有準備好被讀,所以會立刻返回,所以讀取到的都是null。
2. readLine是一個阻塞的方法,只要沒有斷開連接,就會一直等待,直到有東西返回,那么什么時候返回空呢,只有讀到數據流最末尾,才返回null。
以上摘自:http://blog.csdn.net/neusoftware_20063500/article/details/3723176
實際上,在讀網絡數據的時候經常會遇到數據延遲等問題。
這時就可以使用 ready函數查看BufferedReader是否已經準備好。
while(!reader.ready){ //阻塞,等待一段時間 } while(reader.readLine()!==null){ //執行操作 }
特別要注意的是當reader.readLine已經讀完之后,如果繼續執行ready操作,會返回false; 因此,下面兩段代碼可能造成死循環:
1.
while(reader.readLine()!==null){ //執行操作 while(!reader.ready){ //阻塞,等待一段時間 } }
2.
while(reader.readLine()!==null){ //執行操作 } while(!reader.ready){ //阻塞,等待一段時間 }
Premature EOF
在讀取網絡流的數據時很容易遇到 java.io.IOException: Premature EOF的異常。
發生Premature EOF的可能有: 1. 在stream到達EOF之前,stream已經結束。( no EOF marker),顯然這種情況下很有可能是響應超時、服務端處理錯誤、網絡問題、防火墻。 2. EOF過早地出現了。( EOF marker comes earlier before it shoud be.)
目前,沒有找到很好的有效的解決方法。因為,這個問題出現的原因有很多。有些是客戶端問題,這種問題可以通過改善良好的代碼習慣來杜絕。比如,要記住關閉流以及網絡連接,合理使用網絡和計算機資源。在讀取網絡流之前可以試探流是否已經準備好。
本人也遇到過Premature EOF的問題,最開始這個問題很令人頭疼。當時是一個多線程的程序(而且線程數相對較多,10個),雖然對于一些線程返回的結果正常,然而也有一大部分的Premature EOF異常。為此,我檢查了一遍又一遍的代碼,上網找了許多潛在的解決方法,但均沒有很好地解決問題。
考慮到這個異常有可能是服務器端的錯誤,以及我當時所調用的服務器的資源情況,最后我將線程數設置為2個這種異常便不再出現了。因此,可以猜測到程序的多線程調用造成了服務端程序的資源爭搶等問題導致了Premature EOF異常。所以,在開發應用程序的過程中也應該注意到合理使用服務器的資源。
新聞熱點
疑難解答