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