2013-05-20 22 views
0

爲什麼這部分客戶端代碼始終爲零?InputDataStream.available()始終爲0 Java Socket Client

InputStream inputStream = clientSocket.getInputStream(); 
int readCount = inputStream.available(); // >> IS ALWAYS ZERO 
byte[] recvBytes = new byte[readCount]; 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
int n = inputStream.read(recvBytes); 

...

+0

你的插座是否連接? – Nick

+1

@Nick如果沒有連接,'getInputStream()'會引發異常。 – EJP

回答

2

大概是因爲沒有收到數據還有available()嘗試返回可用的數據量現在沒有阻塞,所以如果在連接後直接調用available(),我預計大部分時間都會收到0。如果你等一會兒,你可能會發現available()返回一個不同的值。

但是,我個人通常不會使用available()。我創造了一些情況適當大小的緩衝區,而只是讀成:

byte[] data = new byte[16 * 1024]; 
int bytesRead = stream.read(data); 

這將阻止,直到一些數據是可用的,但它很可能返回讀取數據比16K的。如果你想繼續閱讀,直到你到達流的末尾,你需要循環。

基本上它取決於你想要做什麼,但available()很少用於我的經驗。

+0

嗯..完美的,我可以改變我的邏輯,以傳遞關於流的長度信息,並從那裏讀取..或我等待和使用可用(),我不認爲會有助於在mycase ..但我選擇第一個選項:)謝謝你喬恩:) –

+1

'等待和使用可用'是完全沒有意義的。只是阻止。這會阻塞正確的時間。等待不會也不會,因爲你不知道等待多久,所以你會猜測,並猜測錯誤,所以你會睡過頭然後,調用available()告訴你有多少閱讀不會做任何只是調用read()都不會做的事情。 – EJP

0

java docs

返回可以從該輸入流不被的下一次調用無阻塞讀取(或跳過)的字節數的估計值該輸入流的方法。下一次調用可能是同一個線程或另一個線程。單個讀取或跳過這麼多字節不會被阻塞,但可以讀取或跳過更少的字節。 請注意,儘管InputStream的某些實現將返回流中的總字節數,但許多不會。使用此方法的返回值分配旨在保存此流中所有數據的緩衝區永遠是不正確的。

如果通過調用close()方法關閉了此輸入流,則該子類的該方法的實現可能會選擇拋出IOException。

類InputStream可用的方法總是返回0

此方法應該由子類覆蓋。

這裏是一個音符理解爲什麼它返回0

在InputStreams,閱讀()的調用都表示要「堵」的方法調用。這意味着如果在方法調用時沒有數據可用,該方法將等待數據可用。

available()方法告訴您可以讀取多少個字節,直到read()調用將阻止程序的執行流程。在大多數輸入流中,所有對read()的調用都被阻塞,這就是默認情況下返回0的原因。

但是,在某些流(例如BufferedInputStream,它具有內部緩衝區)中,有些字節會被讀取並保存在內存中,因此您可以在不阻止程序流的情況下讀取它們。在這種情況下,available()方法會告訴您緩衝區中保留了多少個字節。

0

根據文檔,available()只返回可以從流中讀取的字節數,不會阻止。這並不意味着讀取操作不會返回任何內容。

你應該在延遲後檢查這個值,看看它是否增加。

0

available()的正確用法很少,並且這不是其中之一。在這種情況下,沒有數據到達,所以它返回零,這是它應該做的。

只讀,直到你有你需要的。它會阻塞,直到數據可用。