2009-04-19 2 views
1

Я хочу прочитать из java.io.InputStream с таймаутом. По-видимому, правильный способ сделать это - использовать java.nio.channels.SelectableChannel и java.nio.channels.Selector. К сожалению, неясно, как перейти от InputStream к SelectableChannel.Как получить SelectableChannel из InputStream?

InputStream исходит из нетрадиционного источника - http://java.sun.com/products/javacomm/reference/api/javax/comm/CommPort.html#getInputStream()

+2

Извините, Гили, это не сработает с javax.comm. Возможно, вы сможете взломать проект rxtx, чтобы реализовать свой собственный канал выбора ... но если вы не пытаетесь интегрироваться с пакетом, который уже работает с * любым * SelectableChannel, это, вероятно, больше работы, чем необходимо, чтобы получить неблокирующий серийный номер I/вывода. – erickson

+1

Как бы вы реализовали новый SelectableChannel? Неясно, как RXTX может даже обеспечить свою собственную реализацию. – Gili

ответ

2

Не все InputStream s гарантированно будет выбирать, так что нет простого способа сделать это. К сожалению, класс CommPort не имеет метода для возврата SelectableChannel; нет простого, переносимого способа выполнить это (т. е. без полного разрушения инкапсуляции).

1

NIO нарушается в этом отношении. Все, что вам нужно сделать, это немного взглянуть на код и увидеть все роли, которые требуют, чтобы каналы были SocketChannel и т. Д. В NIO нельзя использовать что-либо еще для другого типа канала ввода-вывода на основе filedescriptor, как и должно быть.

Последнее, что я спросил, не было никаких намерений исправить это для общего повторного использования.

Смежные вопросы