У меня есть процесс Java, который читает данный файл с помощью Java RandomAccessFile и выполняет некоторую обработку на основе содержимого файла. Этот файл представляет собой файл журнала, который обновляется другим процессом Java. Процесс Java, который читает файл, находится на другом компьютере и имеет настройку монтирования NFS для доступа к файлу на удаленном сервере. В основном процесс, который читает файл, будет опрашивать изменения в файле на основе длины файла и положения RandomAccessFile и вызывать метод обработчика для каждого встречающегося байта. Проблема в том, что я иногда получаю символы ASCII 'NUL', возвращаемые из метода чтения RandomAccessFile.
int charInt = read();
то есть charInt в некоторых случаях возвращает 0, а через некоторое время возвращает допустимые символы. Но тогда мне не хватает символов во время чтения потока в NUL
Я попытался использовать http://commons.apache.org/io/apidocs/org/apache/commons/io/input/Tailer.html, где я получаю уведомления о каждой строке. но затем в этих строках я иногда замечаю символы ASCII NUL. Я также прошел через Java IO реализацию хвоста unix/linux - f - мой java-процесс чем-то похож, но потом я начинаю думать, что проблема связана с монтированием NFS или каким-то ошибочным вводом-выводом java при попытке чтения с монтирования NFS. Я провел некоторое тестирование чтения из обычного файла (который не находится в монтировании NFS) и имел процесс, который постоянно записывает в него. Все эти испытания прошли успешно. Я также попробовал java BufferedReader, поскольку поток файлов на самом деле является потоком символов, хотя я могу рассматривать его как поток байтов. Тем не менее я получаю символы NUL.
не уверен, будет ли это иметь значение - монтирование NFS доступно только для чтения (ro). Ценим любую помощь в этом. Спасибо.
Я также пробовал следующее:
FileWriter fileWriter;
try {
fileWriter = new FileWriter("<OUT_FILE>", true);
} catch (IOException e) {
throw new RuntimeException("Exception while creating file to write sent messages ", e);
}
BufferedWriter bufWriter = new BufferedWriter(fileWriter);
Runtime r = Runtime.getRuntime();
Process p = r.exec("tail -f <PATH_TO_IN_FILE>");
Scanner s = new Scanner(p.getInputStream());
while (s.hasNextLine()) {
String line = s.nextLine();
bufWriter.write(line);
bufWriter.write(System.getProperty("line.separator"));
bufWriter.flush();
}
bufWriter.close();
и все же я получаю символы NUL. Здесь я записываю прочитанные строки в файл, чтобы затем сравнить файл IN и файл OUT. Я вижу, что в одном случае строки пропускаются (с символами NUL). все остальные строки сравниваются нормально, поэтому из примерно 13000 строк мы видим несоответствие примерно в 100 строках. Еще одна странность заключается в том, что у меня было меньше работы, и я также вижу здесь символы NUL, они в основном в форме ^C^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@^@^@^@^@^@^@^@, а затем допустимые строки. еще одна вещь, которую я заметил в то время, когда строки были пропущены, файл очень быстро обновлялся в процессе записи, поэтому в основном сообщение xml было записано в файл по адресу 20110729 13:44:06.070097, а затем следующее сообщение по адресу 20110729 13. :44:06.100007. строки были пропущены из этого второго сообщения xml. дополнительные выводы: путь к файлу, по которому мы считываем файлы, находится в общем NAS.