Альтернатива File.exists() в Java

Я никогда не думал, что это случится со мной, но я столкнулся с моей первой ошибкой в ​​Java:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5003595

Я в значительной степени в той же самой ситуации, как описано в ошибке (NFS в Linux), и я вижу, что File.exists() не возвращает правильное значение (по крайней мере, не сразу).

Поэтому мой вопрос: есть ли альтернатива этому методу проверки, существует ли файл? Я бы предпочел сохранить независимость от ОС, если это возможно.

РЕДАКТИРОВАТЬ: я нашел обходной путь. Если вы вызываете 'ls $filedir', NFS обновляет любой кеш / метаданные, которые вызывают проблемы с Java, и File.exists() возвращает правильное значение. Конечно, это не совсем идеально, так как это вредит переносимости, но есть способы решить эту проблему.

Спасибо, Бен

6 ответов

Решение

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

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

Я испытал ту же проблему и решил ее с помощью звонка file.getParentFile().list(), По сути то же самое, что и ваше решение, но ОС не зависит.

Что будет, если File.exists() возвращает true, затем кто-то удаляет файл / ваше NFS-монтирование исчезает, затем вы пытаетесь открыть файл? В принципе, File.exists() бесполезен, так как вам нужно обрабатывать исключения, которые могут возникнуть при открытии файла в любом случае.

Все File.exists говорит вам, существовал ли файл в какой-то момент в прошлом. Это не говорит вам:

  • Будет ли оно существовать при попытке открыть его
  • Есть ли у вас разрешение на его открытие?
  • Ничего полезного, правда

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

Я заметил, что метод Java 7 java.nio.file.Path.exists() возвращает false, если файл не существует или его существование не может быть определено. Поэтому может показаться, что ложные негативы будут присутствовать некоторое время, и что ваш код должен их терпеть.

Очевидная альтернатива - File.isFile(). Попробуйте сначала.

Хотя это станет неточным при чтении файлов только для чтения, вы всегда можете использовать File.canWrite(), чтобы проверить, существует ли файл.

Если оба вышеперечисленных сбоя, вы можете использовать File.length(). Если он возвращает 0L, вы знаете, что файл не существует.

Другие вопросы по тегам