2011-12-13 102 views
9

您是否知道在不關閉關聯套接字的情況下中斷Java InputStream的讀取的方法?任何使用java.nio。*中斷InputStream的方法#read()不關閉套接字?

這裏是用於抓取一個插座輸入流並轉換爲可中斷DataInputStream所當前構建策略:

InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream())); 
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream); 

這使得使用一個ReadableByteChannel它提供了一個read(ByteBuffer)方法與用於ClosedByInterruptException拋出支持。

問題是調用read()調用read()調用線程上的中斷將導致底層套接字被關閉。

對於我的上下文,我需要套接字保持打開; read調用正在等待用戶輸入未到來,所以我正在使用中斷將控制權交還給更高的組件,然後再次返回到read

如果有人能夠建議一種使用JDK內置類來實現此目的的方法,或者指出某些信息無法實現,我將不勝感激。

我知道還有其他的方法可以達到同樣的效果,但是我很好奇地知道這種方法是否可行。

+0

你可以在套接字上使用`Selector`和`.select(int)`。 – fge 2011-12-13 19:24:32

+1

在套接字上設置讀取超時。 – jtahlborn 2011-12-13 19:50:10

回答

2

如果您在讀取期間中斷InterruptibleChannel,它將被關閉並拋出ClosedByInterruptException。如果你只是想要讀取超時,根本不要使用通道,只是一個普通的Socket;以較短的超時調用Socket.setSoTimeout(),並在每次超時觸發時檢查線程的isInterrupted()狀態。更好的是,查看你的要求來中斷線程。那個有什麼用途?