2012-07-13 38 views
0

有人可以向我解釋爲什麼這個工作正常,但in.available()> 0註釋掉了,但是當我把它放回去時呢?BufferedInputStream表示它不可用,但無論如何工作

mySocket = new Socket("blahblah", 12345); 
BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream()); 
.... 
char result[] = new char[length];  
for (int i = 0; i < length && !mySocket.isClosed() /*&& in.available()>0*/; i++){ 
    result[i] = (char)in.read(); 
} 

更具體地說:我正在做一個Android應用程序,用戶可以在搜索項,該搜索被髮送到星際一些啄,我回來XML形式的結果,做的東西他們。當我返回的xml足夠小時(請參閱上面的代碼中的「length」),代碼在in.available()> 0左側時工作得很好。但是如果長度很大,則in.available()返回0。但有了這個評論,所有事情都可以繼續順利進行。

這是爲什麼?這是我需要擔心和解決的問題嗎?

+0

您還應該刪除isClosed()測試。它不符合你的想法:它只會告訴你是否自己關閉了套接字。這不是EOS測試:read()返回-1告訴你。如果你自己關閉了套接字,那麼你首先不應該接近這個代碼。 – EJP 2012-07-13 17:57:48

回答

1

我認爲數據較大時in.available()== 0的原因是因爲它還沒有機會將它寫入套接字。你不需要使用in.available()。另外,我不會建議一次讀取一個字符,這將會非常緩慢,並且很多數據並且在網絡上非常健談。考慮讀大小爲「length」的字節數組。

2

in.available()讓你知道你是否可以在沒有阻塞的情況下讀取數據。由於套接字有一個數據流,它可能不會立即可用,但在很短的時間內。例如如果您有1 Gbit連接,則完整的數據包不會超過15微秒,這對於計算機來說是很長的時間。

相關問題