Как установить время ожидания при чтении из Java RandomAccessFile - PullRequest
0 голосов
/ 07 сентября 2018

Я пишу и читаю из файла Linux в Java, который в действительности является портом связи с аппаратным устройством. Для этого я использую RandomAccessFile (я объясню почему позже), и в большинстве случаев он работает хорошо. Но иногда байт теряется, и моя рутина блокируется на неопределенный срок, так как у метода read нет времени ожидания.

Чтобы дать более подробную информацию о файле: это чековый принтер USB, который создает файл с именем / dev / usb / lp0, и хотя я могу использовать драйвер cups для печати, мне все еще нужен низкоуровневый обмен данными через этот файл. запросить состояние принтера.

Причина, по которой я использую RandomAccessFile, заключается в том, что у меня может быть один и тот же объект для чтения и записи. Вместо этого я попытался создать версию с InputStream и OutputStream (поскольку это позволило бы мне использовать метод available () для реализации моего тайм-аута). Но когда я сначала открываю InputStream, а затем OutputStream, я получаю исключение при открытии OutputStream, поскольку файл занят.

Я пытался писать с помощью OutputStream и затем закрывать его перед открытием InputStream для чтения, но затем я теряю часть или весь ответ до того, как он открыл InputStream.

Я попытался переключиться на каналы вместо (Files.newByteChannel ()). Это также позволяет мне иметь только один объект, и в документации сказано, что он читает только доступные байты и возвращает счетчик (что также позволяет мне реализовать тайм-аут). Но он все равно блокируется в методе чтения, когда читать нечего, несмотря на то, что написано в документации.

Я также попробовал несколько способов реализации тайм-аутов в RandomAccessFile с использованием потоков. Первый подход состоял в том, чтобы запустить отдельный поток одновременно с началом чтения, и если в потоке истекло время ожидания, я закрыл файл из потока, надеясь, что это разблокирует операцию read () с исключением, но не (он остался заблокированным). Я также попытался выполнить чтение в отдельном потоке и жестоко убить его устаревшим Thread.stop () по истечении этого времени. Это работало один раз, но после этого было невозможно снова открыть файл.

Единственное решение, которое я сделал, - это создать отдельный поток, который непрерывно вызывает read, и всякий раз, когда он получает байт, он помещает его в LinkedBlockingQueue, из которого я могу читать с тайм-аутом. Этот подход работает, но недостатком является то, что я никогда не могу закрыть файл (опять же по тем же причинам, которые были описаны выше, я не могу разблокировать заблокированное чтение). И мое приложение требует, чтобы я иногда закрывал это соединение с оборудованием.

Кто-нибудь, кто может придумать способ чтения из файла с тайм-аутом, который будет работать в моем случае (который позволяет мне одновременно иметь права на чтение и запись для файла)?

Кстати, я использую Java8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...