Czy znasz sposób przerwania odczytu z Javy InputStream
bez zamykania powiązanego gniazda?Jakikolwiek sposób użycia pliku java.nio. * Do przerwania metody InputStream # read() bez zamykania gniazda?
Tutaj jest obecny strategia budowy do przechwytywania strumienia wejściowego gniazda i konwersji do przerywanej DataInputStream:
InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);
Dzięki zastosowanie ReadableByteChannel
który oferuje metodę read(ByteBuffer)
obsługującą ClosedByInterruptException
ratunkowym.
Problem polega na tym, że wywołanie przerwania w wątku wywołującym read()
wywołania na DataInputStream
powoduje zamknięcie podstawowego gniazda.
Dla mojego kontekstu potrzebuję gniazda do pozostania otwartym; wywołanie read
oczekuje na dane wejściowe użytkownika, które nie nadchodzą, więc używam przerwania, aby przekazać sterowanie z powrotem do wyższego komponentu, a następnie ponownie powrócić do read
ponownie.
Byłbym bardzo wdzięczny, gdyby ktoś mógł zaproponować sposób osiągnięcia tego przy użyciu wbudowanych klas JDK, lub może wskazać, że nie jest to możliwe z niektórymi informacjami.
Rozumiem, że istnieją inne sposoby osiągnięcia tego samego efektu, ale mimo to jestem ciekawy, czy takie podejście jest wykonalne.
Możesz użyć 'Selector' i' .select (int) 'na gnieździe. – fge
ustawić limit czasu odczytu na gnieździe. – jtahlborn
@fge - Dziękuję. Zbadałem, co zasugerowałeś i wygląda to na wiarygodne. Więc jeśli uruchomię mySelector.select() w moim wątku zamiast read() bezpośrednio, a następnie przerwie wątek, gniazdo pozostanie otwarte? – KomodoDave