2012-08-23 29 views
2

available()是否可靠用於Java編程的socket編程?是BufferedInputStream.available()在Socket編程中可靠嗎?

我只在乎它告訴我什麼時候有字節可供閱讀,以便在我調用讀取方法時不會阻止它們。

BufferedInputStream.available()依賴於InputStream.available()

爲InputStream.available()的文檔這樣說:

注意的是,雖然InputStream的一些實現將流中返回的字節 總數,許多人不會。從來沒有 正確使用此方法的返回值來分配旨在保存此流中的所有數據的緩衝區 。 http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()

我不在乎,如果它給正確的字節數與否,只是它不給我0時,有可用於讀取字節。我想知道如果BufferedInputStream.available()總是適用於Windows和Linux。

此外,我不確定「實現」文檔意味着什麼。這是指什麼?到InputStream的子類?到不同的操作系統上的Java?到不同的JVM?

有沒有人在Windows或Linux或其他系統上使用過(),它沒有工作?

+0

切勿使用'available'。永遠。如果你希望''read''有字節'時可以通知,請看[非阻塞IO](http://www.developer.com/java/article.php/3837316/Non-阻斷-IO-定製的可能,在-Java.htm)。 – Jeffrey

+0

從不使用可用的原因是什麼?如果我們不應該使用它,爲什麼它存在? – mudge

+0

如果你確定你知道'available'如何使用你的'InputStream',那麼你可以使用它。然而,InputStream的大多數用法歸結爲FileInputStream或Socket.getInputStream(),它們都不能保證返回正確的可用值。 – Jeffrey

回答

2

,你在你的問題鏈接到同一個醫生說:

一次讀取或跳過這麼多字節將不會阻止,但可以讀取或跳過較少的字節。

所以我會說,它是「安全的」,因爲I/O不會阻塞,當它不返回0.另一方面,不保證它會返回時非零事實上,有些字節需要讀取。

請注意,InputStream是一個抽象類,所以任何你需要的InputStream對象將是一個子類。這就是文檔通過「實施」所表達的意思。任何具體的子類都將實現所有的抽象方法。

+0

感謝您的解釋。 – mudge

+1

@mudge如果你真的想要非阻塞I/O,試試看[NIO](http://rox-xmlrpc.sourceforge.net/niotut/index.html)。 – oldrinb

1

這絕對是當週圍的SSLSocket包裹着,因爲我已經告訴你在你other thread可靠。它總是返回零。