Очистите символьное устройство от java при запуске приложения

#java #file-io #nonblocking

#java #file-io #неблокирующее

Вопрос:

мое приложение считывает данные с символьного устройства, которое заполняется из пространства ядра. В настоящее время я обращаюсь к нему с помощью RandomAccessFile, который работает нормально.

Моя проблема в том, что перед запуском моего приложения данные уже записаны на символьное устройство. (Имеются постоянные данные с частотой не менее 1 в секунду)

Итак, я хочу «игнорировать» данные, которые были вставлены до того, как я запустил свое приложение.

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

Я думаю, что есть способ буквально «очистить» символьное устройство, прежде чем я начну считывать с него данные, может быть, кто-нибудь сможет указать мне правильное направление. Я никогда не работал с неблокирующим вводом-выводом, таким как java.nio. stuff, это правильный путь?

К сожалению, если у вас нет готового кода для публикации, если он вам нужен, дайте мне знать.

Ответ №1:

Хорошо, я не нашел красивого способа решить эту проблему.

Единственное решение, которое я нашел, это пропустить его вручную, проверяя System.nanoTime (код Scala!):

 var run = true
val test = new Array[Byte](10000); //<- needs to be that big!
var count = 0;
device = new RandomAccessFile("/dev/mydevice", "r")
while (run) {
  val time = System.nanoTime();
  device.read(test)
  count = count  1
  if ((System.nanoTime() - time)>100000000) {
    run = false
  }
}
device.close
println("Skipped [" count "] lines")
  

Если кто-нибудь может предложить лучшее решение, я ценю это.

Ответ №2:

я предполагаю, что вы уже пробовали RandomAccessFile.setLength(0) (хотя я сомневаюсь, что это сработает, на самом деле каналы используются не так)? Как насчет использования FileInputStream и вызова skip() до тех пор, пока вы не сможете пропускать дальше?

Комментарии:

1. Привет, нет, я этого не пробовал. Как я читал в документации SetLength, он пытается получить доступ к длине. Всякий раз, когда к length обращаются, я получаю исключение незаконного поиска. Я пытался использовать FileInputStream, но столкнулся с теми же проблемами с этим незаконным поиском. Я проверяю, работает ли у меня пропуск.

2. Еще раз привет, ни SetLength, ни skip не работают. Я всегда получаю недопустимое исключение seek IOException.