Перейти к содержимому

Java как проверить существует ли файл

  • автор:

Java как проверить существует ли файл

У Вас есть a Path экземпляр, представляющий файл или каталог, но тот файл, существует на файловой системе? Действительно ли это читаемо? Перезаписываемый? Исполнимая программа?

Проверка Существования Файла или каталога

  • Файл проверяется, чтобы существовать.
  • Файл проверяется, чтобы не существовать.
  • Состояние файла неизвестно. Этот результат может произойти, когда у программы нет доступа к файлу.

Если оба exists и notExists возвратиться false , существование файла не может быть проверено.

Проверка Доступности Файла

Чтобы проверить, что программа может получить доступ к файлу как необходимый, можно использовать isReadable(Path) , isWritable(Path) , и isExecutable(Path) методы.

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

Path file = . ; boolean isRegularExecutableFile = Files.isRegularFile(file) & Files.isReadable(file) & Files.isExecutable(file);

Отметьте: Как только любой из этих методов завершается, нет никакой гарантии, что к файлу можно получить доступ. Дефект коллективной безопасности во многих приложениях должен выполнить проверку и затем получить доступ к файлу. Для получения дополнительной информации используйте свою любимую поисковую систему, чтобы искать TOCTTOU (объявленный TOCK-также).

Проверка, определяют Ли Два Пути Местоположение Того же самого Файла

Когда у Вас есть файловая система, которая использует символьные ссылки, возможно иметь два различных пути, которые определяют местоположение того же самого файла. isSameFile(Path, Path) метод сравнивает два пути, чтобы определить, определяют ли они местоположение того же самого файла на файловой системе. Например:

Path p1 = . ; Path p2 = . ; if (Files.isSameFile(p1, p2)) < // Logic when the paths locate the same file >

Проверьте, существует ли файл или каталог в Java

В этом кратком руководстве мы познакомимся с различными способами проверки существования файла или каталога.

Сначала мы начнем с современных API-интерфейсов NIO, а затем рассмотрим устаревшие подходы к вводу-выводу.

2. Использование java.nio.file.Files ​

Чтобы проверить, существует ли файл или каталог, мы можем использовать метод Files.exists (Path) . Как видно из сигнатуры метода, мы должны сначала получить путь к нужному файлу или каталогу. Затем мы можем передать этот путь в метод Files.exists(Path) :

 Path path = Paths.get("does-not-exist.txt");   assertFalse(Files.exists(path)); 

Поскольку файл не существует, он возвращает false . Также стоит упомянуть, что если метод Files.exists(Path) встречает IOException , он также возвращает false .

С другой стороны, когда данный файл существует, он вернет true , как и ожидалось:

 Path tempFile = Files.createTempFile("foreach", "exist-article");   assertTrue(Files.exists(tempFile)); 

Здесь мы создаем временный файл, а затем вызываем метод Files.exists(Path) .

Это работает даже для каталогов :

 Path tempDirectory = Files.createTempDirectory("foreach-exists");   assertTrue(Files.exists(tempDirectory)); 

Если мы специально хотим знать, существует ли файл или каталог, мы также можем использовать методы Files.isDirectory(Path) или Files.isRegularFile(Path) :

 assertTrue(Files.isDirectory(tempDirectory));   assertFalse(Files.isDirectory(tempFile));   assertTrue(Files.isRegularFile(tempFile)); 

Существует также метод notExists(Path) , который возвращает true , если заданный путь не существует:

 assertFalse(Files.notExists(tempDirectory)); 

Иногда Files.exists(Path) возвращает false , потому что у нас нет необходимых прав доступа к файлам . В таких сценариях мы можем использовать метод Files.isReadable(Path) , чтобы убедиться, что файл действительно доступен для чтения текущему пользователю:

 assertTrue(Files.isReadable(tempFile));   assertFalse(Files.isReadable(Paths.get("/root/.bashrc"))); 

2.1. Символические ссылки​

По умолчанию метод Files.exists(Path) следует символическим ссылкам . Если файл A имеет символическую ссылку на файл B , то метод Files.exists(A) возвращает значение true тогда и только тогда, когда файл B уже существует:

 Path target = Files.createTempFile("foreach", "target");   Path symbol = Paths.get("test-link-" + ThreadLocalRandom.current().nextInt());   Path symbolicLink = Files.createSymbolicLink(symbol, target);   assertTrue(Files.exists(symbolicLink)); 

Теперь, если мы удалим цель ссылки, Files.exists(Path) вернет false :

 Files.deleteIfExists(target);   assertFalse(Files.exists(symbolicLink)); 

Поскольку цель ссылки больше не существует, переход по ссылке ни к чему не приведет, а Files.exists(Path) вернет false .

Можно даже не переходить по символическим ссылкам, передав соответствующий LinkOption в качестве второго аргумента:

 assertTrue(Files.exists(symbolicLink, LinkOption.NOFOLLOW_LINKS)); 

Поскольку сама ссылка существует, метод Files.exists(Path) возвращает значение true. Кроме того, мы можем проверить, является ли путь символической ссылкой, используя метод Files.isSymbolicLink(Path) :

 assertTrue(Files.isSymbolicLink(symbolicLink));   assertFalse(Files.isSymbolicLink(target)); 

3. Использование java.io.File ​

Если мы используем Java 7 или более новую версию Java, настоятельно рекомендуется использовать современные API-интерфейсы Java NIO для таких требований .

Однако, чтобы убедиться, что файл или каталог существует в устаревшем мире ввода-вывода Java, мы можем вызвать метод exists () для экземпляров File :

 assertFalse(new File("invalid").exists()); 

Если файл или каталог уже существует, он вернет true :

 Path tempFilePath = Files.createTempFile("foreach", "exist-io");   Path tempDirectoryPath = Files.createTempDirectory("foreach-exists-io");    File tempFile = new File(tempFilePath.toString());   File tempDirectory = new File(tempDirectoryPath.toString());    assertTrue(tempFile.exists());   assertTrue(tempDirectory.exists()); 

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

Однако метод isFile() возвращает true , если указанный путь является существующим файлом:

 assertTrue(tempFile.isFile());   assertFalse(tempDirectory.isFile()); 

Точно так же метод isDirectory() возвращает true , если указанный путь является существующим каталогом:

 assertTrue(tempDirectory.isDirectory());   assertFalse(tempFile.isDirectory()); 

Наконец, метод canRead() возвращает true , если файл доступен для чтения:

 assertTrue(tempFile.canRead());   assertFalse(new File("/root/.bashrc").canRead()); 

Когда он возвращает false , файл либо не существует, либо текущий пользователь не имеет разрешения на чтение файла.

4. Вывод​

В этом кратком руководстве мы увидели, как убедиться, что файл или каталог существует в Java. Попутно мы говорили о современном NIO и устаревших API-интерфейсах ввода-вывода. Кроме того, мы увидели, как NIO API обрабатывает символические ссылки.

Как обычно, все примеры доступны на GitHub .

  • 1. Обзор
  • 2. Использование java.nio.file.Files
    • 2.1. Символические ссылки

    Проверка существования каталога

    Как проверить существует ли каталог? Так можно проверить существование каталога или только существование файла?

    File file = new File(filepath); if (file.exists())

    Отслеживать
    задан 3 мар 2017 в 21:35
    860 4 4 золотых знака 18 18 серебряных знаков 40 40 бронзовых знаков
    Если директория уже существует, то она и не создастся. А так Files.exists(path)
    3 мар 2017 в 21:40

    1 ответ 1

    Сортировка: Сброс на вариант по умолчанию

    Проверить существование папки или файла можно следующим образом:

    import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; . Path path = Paths.get("E:\\NecessaryFolder"); if (Files.exists(path)) < // действия, если папка существует >. 

    Прочитать об этом подробнее можно здесь: docs.oracle.com.
    Аналогичный вопрос: How to check if a folder exists.
    А также здесь: клик.

    Java: проверка, пуст ли файл или каталог

    В Java работа с файлами и каталогами довольно распространена. Нас также часто интересует содержимое этих файлов и каталогов.

    В зависимости от содержимого файла мы можем вести себя по-другому. Возможно, мы записываем некоторые данные в файл и сначала хотим проверить, содержит ли он уже некоторую информацию, прежде чем перезаписывать ее. Точно так же мы могли бы захотеть удалить каталог, если он пуст. Знание того, пуст он или нет, в таких случаях может иметь жизненно важное значение.

    В этом руководстве мы рассмотрим несколько примеров того, как проверить, пуст ли файл или каталог в Java.

    Проверьте, является ли файл пустым в Java

    Есть два способа проверить пуст ли File .

    Мы будем работать с двумя файлами, одним пустым и одним непустым:

    09/17/2020 01:00 PM 0 file 09/17/2020 01:00 PM 2 file2 

    file — 0 байт, а длина file2 — 2 байта.

    Стоит отметить, что перед выполнением каких-либо операций с файлом или каталогом вы должны проверить, существует ли файл или каталог, а также их тип, чтобы избежать запуска неправильных методов.

    Использование File.length()

    Согласно документации, объект File представляет собой «абстрактное представление путей к файлам и каталогам». У каждого объекта File есть методы для получения информации об этом конкретном файле.

    Давайте продолжим и создадим простой вспомогательный метод, который возвращает true , если длина File равна, 0 и false если это не так:

    public boolean isFileEmpty(File file)

    Теперь давайте проверим это на пустом и непустом файле:

    File file1 = new File("/file"); File file2 = new File("/file2"); System.out.println(isFileEmpty(file1)); System.out.println(isFileEmpty(file2)); 

    Этот код возвращает:

    true false 
    Использование BufferedReader

    Другой способ проверить, соответствует ли длина файла 0 — использовать расширение BufferedReader . Это позволяет нам получить доступ к символьному содержимому из потоков (например, файлов). Если в файле нет содержимого, он пуст:

    public boolean isFileEmpty(File file)

    Объявление метода остается таким же, как и раньше: он принимает File и возвращает boolean . Хотя на этот раз мы создали экземпляр BufferedReader и предоставили ему, FileReader который принимает наши File . Это немного сложнее, чем раньше, но также хорошо выполняет свою работу.

    Затем, если BufferedReader нечего читать из файла, мы знаем, что он пуст.

    Опять же, давайте проверим это на пустом и не пустом файле:

    File file1 = new File("/file"); File file2 = new File("/file2"); System.out.println(isFileEmpty(file1)); System.out.println(isFileEmpty(file2)); 

    Этот код возвращает:

    true false 

    Проверка, пуст ли каталог в Java

    Также есть два способа проверить, пуст ли каталог в Java.

    Использование File.list()

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

    public boolean isDirectoryEmpty(File directory)

    Метод возвращает массив имен записей. Если значение этого массива length равно 0 , каталог пуст.

    Давайте запустим это в пустом и не пустом каталоге:

    File directory1 = new File("/empty_directory"); File directory2 = new File("/directory"); System.out.println(isDirectoryEmpty(directory1)); System.out.println(isDirectoryEmpty(directory1)); 
    true false 
    Использование DirectoryStream

    Еще одна быстрая, хотя и более продвинутая методика предполагает использование потоков. Сначала мы создаем новый DirectoryStream , вызывая класс Files.newDirectoryStream() . Этот метод принимает Path , поэтому нам нужно преобразовать наш File в Path , вызвав метод toPath() :

    public boolean isDirectoryEmpty(File directory) throws IOException < DirectoryStreamstream = Files.newDirectoryStream(directory.toPath()); return !stream.iterator().hasNext(); > 

    Затем мы собираем итератор потока и проверяем, содержит ли он следующую запись, вызывая hasNext() . Если он не содержит хотя бы одной записи, каталог пуст.

    Запустим этот код:

    File directory1 = new File("/empty_directory"); File directory2 = new File("/directory"); System.out.println(isDirectoryEmpty(directory1)); System.out.println(isDirectoryEmpty(directory1)); 

    И это приводит к:

    true false 

    Вывод

    В этом руководстве мы привели несколько примеров для проверки того, пусты ли файлы и каталоги. Сначала мы проверили, пусты ли файлы, используя класс File и его метод length() , а затем применили подход BufferedReader .

    Затем мы проверили, пуст ли каталог, используя File.list() и создав файл DirectoryStream .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *