Я пишу и читаю из файла 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.