Единственный действительно безопасный способ справиться с отсутствующими файлами - справиться с исключением. Учтите это:
if (file.exists() && file.canRead()) {
try {
is = new FileInputStream(file);
} catch (IOException ex) {
// Never happens
}
}
Фактически, случай "никогда не бывает" МОЖЕТ случиться. Например:
Если file
на самом деле является каталогом, то открытие не удастся. (Вы можете справиться с этим, позвонив по номеру file.isDirectory()
, но есть и другие случаи, с которыми трудно разобраться ... например, создание файла на съемном носителе с ошибками.)
Предположим, что какое-то внешнее приложение удаляет файл или изменяет его разрешения в крошечном окне между этим приложением, которое проверяет файл и пытается открыть его. Просто нет способа справиться с этим состоянием гонки ...
Кроме того, каждый из этих тестов, вероятно, является системным вызовом. Системные вызовы стоят дорого - примерно так же дорого, как создание / создание / перехват исключения.
Итак, лучший способ справиться с возможностью исключений ввода-вывода при открытии файла - это ДАЙТЕ ИМ ПРОИЗОЙТИ. Обязательно используйте API File
для диагностики проблемы, но не полагайтесь на него, чтобы избежать исключения ввода-вывода.