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

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

6 голосов
/ 30 сентября 2010

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

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

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

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

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

Спасибо, -Бен

Ответы [ 6 ]

6 голосов
/ 03 августа 2015

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

5 голосов
/ 01 октября 2010

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

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

5 голосов
/ 30 сентября 2010

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

4 голосов
/ 30 сентября 2010

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

  • Будет ли оно существовать при попытке открыть его
  • Имеете ли вы разрешение открыть его
  • Что-нибудь полезное вообще,действительно

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

2 голосов
/ 30 сентября 2010

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

1 голос
/ 30 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...