Проверка наличия файла или каталога в Java

с этой Java учебник по oracle:

обратите внимание, что !Файлы.exists (путь) не эквивалентен Файлы.notExists(путь).

Почему бы им не быть эквивалентными? она не идет дальше в плане объяснения. Кто-нибудь знает больше об этом? Заранее спасибо!

5 ответов


!Files.exists() возвращает:

  • true если файл не существует или его существование не может быть определено
  • false если существует файл

Files.notExists() возвращает:

  • true если файл не существует
  • false Если файл существует и его существование не может быть определено

как мы видим из файлы.существует обратный результат:

TRUE if the file exists; 
FALSE if the file does not exist or its existence cannot be determined.

и файлы.notExists обратный результат:

TRUE if the file does not exist; 
FALSE if the file exists or its existence cannot be determined

если !Files.exists(path) возвращение TRUE означает, что он не существует или существование не может быть определено (2 возможности) и Files.notExists(path) возвращение TRUE означает, что он не существует (только 1 возможность).

вывод !Files.exists(path) != Files.notExists(path) или 2 possibilities not equals to 1 possibility (см. объяснение выше про возможности).


глядя в исходном коде на различия, они оба делают то же самое с 1 большой разницей. The notExist(...) метод имеет дополнительное исключение для перехвата.

Exist:

public static boolean exists(Path path, LinkOption... options) {
    try {
        if (followLinks(options)) {
            provider(path).checkAccess(path);
        } else {
            // attempt to read attributes without following links
            readAttributes(path, BasicFileAttributes.class,
                           LinkOption.NOFOLLOW_LINKS);
        }
        // file exists
        return true;
    } catch (IOException x) {
        // does not exist or unable to determine if file exists
        return false;
    }

}

Нет:

public static boolean notExists(Path path, LinkOption... options) {
    try {
        if (followLinks(options)) {
            provider(path).checkAccess(path);
        } else {
            // attempt to read attributes without following links
            readAttributes(path, BasicFileAttributes.class,
                           LinkOption.NOFOLLOW_LINKS);
        }
        // file exists
        return false;
    } catch (NoSuchFileException x) {
        // file confirmed not to exist
        return true;
    } catch (IOException x) {
        return false;
    }
}

в результате различия следующие:

  • !exists(...) возвращает файл не существует, если IOException выбрасывается при попытке получить файл.

  • notExists(...) возвращает файл как несуществующий, убедившись, что конкретный IOException subexception NoSuchFileFound не выдается, и что он не subexception на IOException вызывая не найден результат


С Oracle docs of notExists.

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

мой подсветка.


вы можете просто указать абсолютный путь, если каталог/каталоги не выходит, он создаст каталог/каталоги.

private void createDirectoryIfNeeded(String directoryName)
{
File theDir = new File(directoryName); 
if (!theDir.exists())
    theDir.mkdirs();
}