Я работаю над Java-программой, требующей проверки существования файлов.
Что ж, достаточно просто, код использует вызовы File.exists () для проверки существования файла. И проблема у меня заключается в том, что он сообщает о ложном срабатывании. Это означает, что файл на самом деле не существует, но существует () метод возвращает значение true. Не было зафиксировано ни одного исключения (по крайней мере, исключение, например «устаревший дескриптор NFS»). Программе даже удалось прочитать файл через InputStream, получив 0 байт, как и ожидалось, и все же не исключение. Целевым каталогом является Linux NFS. И я на 100% уверен, что искомый файл никогда не существует.
Я знаю, что для java.io.File.exists () существуют известные ошибки (своего рода ограничение API). Поэтому я добавил еще один способ, проверив существование файла с помощью команды Linux "ls". Вместо вызова File.exists () код Java теперь запускает команду Linux для «ls» целевого файла. Если код выхода равен 0, файл существует. В противном случае файл не существует.
Количество раз, когда проблема решается, кажется, уменьшено с введением трюка, но все еще появляется. Опять же, нигде не было зафиксировано никаких ошибок (на этот раз stdout). Это означает, что проблема настолько серьезна, что даже собственная команда Linux не будет исправлена в течение 100% времени.
Итак, есть пара вопросов:
- Я полагаю, что хорошо известная проблема Java в File.exists () связана с сообщением о ложном отрицании. Где сообщалось, что файл не существует, но на самом деле существует. Поскольку API не выдает IOException для File.exists (), он решает проглотить исключение в случае сбоя при вызове базовых собственных функций ОС, например. Тайм-аут NFS. Но тогда это не объясняет ложный положительный случай, который я имею, учитывая, что файл никогда не существует. Любой бросок на этом?
- Насколько я понимаю, в Linux "ls" код выхода: 0 означает, что файл эквивалентен. Это понимание неправильно? Справочная страница "ls" не совсем понятна при объяснении значения кода выхода: статус выхода равен 0, если все в порядке, 1, если небольшие проблемы, 2, если серьезные проблемы.
- Хорошо, вернемся к теме. Любой верный способ проверить существование файла с Java на Linux? Прежде чем мы увидим JDK7 с официально выпущенным NIO2.
Спасибо:)