Знаете ли вы способ прервать чтение из Java InputStream
, не закрывая связанный сокет?
Вот текущая стратегия построения для захвата входного потока сокета и преобразования в прерываемый DataInputStream:
InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);
Здесь используется ReadableByteChannel
, который предлагает метод чтения (ByteBuffer)
с поддержкой для выброса исключения ClosedByInterruptException
.
Проблема в том, что вызов прерывания в потоке, вызывающем read ()
, вызывает DataInputStream
, вызывает закрытие базового сокета.
В моем контексте мне нужно, чтобы сокет оставался открытым; вызов read
ожидает ввода пользователя, который не поступает, поэтому я использую прерывание, чтобы передать управление обратно вышестоящему компоненту, а затем в конечном итоге снова возвращаюсь к read
.
Я был бы очень благодарен, если бы кто-нибудь мог предложить способ достижения этого с помощью встроенных классов JDK или, возможно, указать, что это невозможно с некоторой информацией.
Я понимаю, что есть другие способы достичь того же эффекта, но тем не менее мне любопытно узнать, возможен ли этот подход.