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


842

Как я могу проверить, существует ли файл, прежде чем открывать его для чтения в Java (эквивалент Perl -e $filename )?

Единственный похожий вопрос на SO касается написания файла и, таким образом, получил ответ, используя FileWriterкоторый, очевидно, здесь не применим.

Если возможно, я бы предпочел, чтобы реальный вызов API возвращал значение true / false, а не какой-то «вызов API для открытия файла и перехвата, когда он выдает исключение, которое вы проверяете на отсутствие файла в тексте», но я могу жить с последний.


3
Также хочу добавить , что вы хотите , чтобы проверить соответствующие права доступа к файлам: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File имеет методы canRead, canWriteи , canExecuteчтобы проверить , что ,
Киркланд

6
Следует отметить, что это опасно. Файловая система может измениться в любое время, в том числе сразу после возврата вашего метода «существует ли этот файл». Так как в любом случае вы должны разобраться с этим делом, такой метод вызывает сомнение. Если вы собираетесь открыть файл, правильный способ сделать это - открыть файл и обработать соответствующее исключение.
Кевин

1
@ Кевин, хорошая мысль, но это неоспоримая полезность в непараллельной среде, в которой, как оказалось, я нуждался в этом;)
DVK

@DVK: Вы работаете в ОС с многозадачностью? Либо так, либо это специально разработанный Java-чип . Если первое, вы находитесь в параллельной среде. Другие процессы могут изменить файловую систему из-под вас.
Кевин

2
@ Кевин не то, чтобы это имело значение, но это однопоточное приложение, предназначенное для личного использования. Вероятность того, что его выделенный файл будет каким-либо образом создан / изменен из-под него, невероятно мала.
ДВК

Ответы:


1342

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

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}

15
В некоторых случаях существует () вернет неверный результат. Например, при использовании файловой системы NFS существует проблема с устаревшими дескрипторами файлов: bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 Это неясно, но является причиной некоторых неприятных ошибок в рабочем коде. перед.
CAW

22
Используйте if(f.isFile())вместо этого.
Леон

1
не забудьте использовать filePathString.trim (), чтобы избежать пробелов
Asim

427

Я бы порекомендовал использовать isFile()вместо exists(). Большую часть времени вы пытаетесь проверить, указывает ли путь к файлу не только на то, что он существует. Помните, что exists()вернет true, если ваш путь указывает на каталог.

new File("path/to/file.txt").isFile();

new File("C:/").exists() вернет true, но не позволит вам открывать и читать из него как файл.


1
@ ylun.ca Пример включает в себя подкаталоги? Если вы хотите спросить, вернется ли текущий каталог /path, если указан правильный полный путь , ответ будет большим «нет» (если не существует другого файла ). new File("file.txt").exists()true/path/to/file.txt/path/file.txt
Матфей, ​​прочитанный

149

Используя nio в Java SE 7,

import java.nio.file.*;

Path path = Paths.get(filePathString);

if (Files.exists(path)) {
  // file exist
}

if (Files.notExists(path)) {
  // file is not exist
}

Если оба existsи notExistsвозвращают false, существование файла не может быть проверено. (возможно нет права доступа к этому пути)

Вы можете проверить, pathявляется ли каталог или обычный файл.

if (Files.isDirectory(path)) {
  // path is directory
}

if (Files.isRegularFile(path)) {
  // path is regular file
}

Пожалуйста, проверьте этот учебник Java SE 7 .


2
Что такое Advatages по сравнению с новым File (путь) .exists ()? Для пейлин существует проверка
Raghu K Nair

2
@RaghuKNair java.nio.file.Files.exists()это намного быстрее , чем java.io.File.exists()(из моего небольшого теста на единственном компьютере , я тестировал: Windows Server 2012 работает Java 1.7.0_45 x64).
Матье

1
Я только попробовал это сам и java.nio.file.Files.exists()был в 5 раз МЕНЬШЕ, чем java.io.File.exists. (Win7 Java 1.7.0_79 - x86)
ParkerHalo

Это также имеет тот недостаток, что Paths.get генерирует исключение, если строка недопустима
Ричард

46

Используя Java 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}

2
Files.exists()принимает два аргумента. Как правило, вы хотите что-то вроде Files.exists(path, LinkOption.NOFOLLOW_LINKS ).
Майк С,

1
@MikeC Интересно, какой метод вызывается без второго аргумента. Документ даже не показывает никакой информации об этом.
PowerFlower

1
@PowerFlower: есть только один метод Files.exists (). Не передавая второй аргумент, он по-прежнему вызывает тот же метод. Второй аргумент - переменная varargs и может передавать 0 или более LinkOptions.
TK8

27
File f = new File(filePathString); 

Это не создаст физический файл. Будет просто создать объект класса File. Чтобы физически создать файл, вы должны явно создать его:

f.createNewFile();

Таким образом, f.exists()можно использовать, чтобы проверить, существует ли такой файл или нет.



16

Есть несколько способов достичь этого.

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

    new File("/path/to/file").exists();
  2. Проверить файл

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
    
  3. Проверьте каталог.

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isDirectory()) {}
    
  4. Java 7 способ.

    Path path = Paths.get("/path/to/file");
    Files.exists(path)  // Existence 
    Files.isDirectory(path)  // is Directory
    Files.isRegularFile(path)  // Regular file 
    Files.isSymbolicLink(path)  // Symbolic Link
    


14

Первое совпадение для "Java-файла существует" в Google:

import java.io.*;

public class FileTest {
    public static void main(String args[]) {
        File f = new File(args[0]);
        System.out.println(f + (f.exists()? " is found " : " is missing "));
    }
}

1
Нет необходимости проверять, если f! = Null, прежде чем проверять f.exists, если новое ключевое слово завершится неудачно, оно сгенерирует исключение.
Шон А.О. Харни

нет проверки, если f! = ноль. f + (...) использует java.io.File.toString
просто кто-то

@ на самом деле, он использует String.valueOf(), который обрабатывает нули
GreenGiant

12

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

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

Не пытайтесь угадать систему. Это знает. И не пытайтесь предсказать будущее. В общем, лучший способ проверить, доступен ли какой-либо ресурс, это просто попытаться использовать его.


Что делать, если я хочу проверять каждый час, чтобы увидеть, был ли файл передан в прямом месте. У меня есть проект webMethods, который должен проверить, загружен ли определенный файл на определенный диск. Как бы это было сделано. Допустим, я хочу каждый час проверять, есть ли файл. Я могу использовать Java для написания класса, который делает это, вероятно, с каким-то таймером.
Даг Хауф

2
Поймать исключение намного дороже. В моем тесте проверка нового File (). Exist () была более чем в 10 раз быстрее, чем перехват исключения FileNotFoundException. Таким образом, если у вас есть сценарий, в котором обычно ожидается отсутствие файлов (например, дискового кэша), исключение является неправильным. Кроме того, второе предположение система крутая.
Ник Фролов

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

1
@DougHauf в вашем случае нет проблем, так как вы не пытаетесь что-либо делать после проверки существования. Но ОП попросил специально проверить перед открытием. В этом случае лучше просто попробовать / поймать открытый файл.
Дан Пассаро,

8

Для меня сочетание принятого ответа Шона А.О. Харни и полученного в результате комментария от Cort3z представляется наилучшим решением.

Использовал следующий фрагмент:

File f = new File(filePathString);
if(f.exists() && f.isFile()) {
    //do something ...
}

Надеюсь, это может кому-то помочь.


4

Я знаю, что немного опоздал в этой теме. Тем не менее, вот мой ответ, действительный начиная с Java 7 и выше.

Следующий фрагмент

if(Files.isRegularFile(Paths.get(pathToFile))) {
    // do something
}

является совершенно логичным, потому что метод isRegularFileвозвращает, falseесли файл не существует. Поэтому не нужно проверять, если Files.exists(...).

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

Из документации Java Oracle


Из сонарных документов: Метод Files.exists заметно снижает производительность в JDK 8 и может значительно замедлить работу приложения, когда используется для проверки файлов, которые на самом деле не существуют. То же самое Files.notExists, Files.isDirectoryи Files.isRegularFile. лучшая альтернатива этому:path.toFile().exists()
Genaut

4

Также стоит ознакомиться с Commons FileUtils https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html. Здесь есть дополнительные методы для управления файлами и часто лучше, чем JDK.


19
Способ не ответить на вопрос. Я согласен, что у сообщества есть много полезного, но, возможно, мы могли бы сделать еще один шаг и дать ответ на вопрос, заданный ОП.
Демонголем

4
Он дал достаточно ответа для меня.
яростный


2

Простой пример с хорошей практикой кодирования и охватывающий все случаи:

 private static void fetchIndexSafely(String url) throws FileAlreadyExistsException {
        File f = new File(Constants.RFC_INDEX_LOCAL_NAME);
        if (f.exists()) {
            throw new FileAlreadyExistsException(f.getAbsolutePath());
        } else {
            try {
                URL u = new URL(url);
                FileUtils.copyURLToFile(u, f);
            } catch (MalformedURLException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Ссылка и другие примеры на

https://zgrepcode.com/examples/java/java/nio/file/filealreadyexistsexception-implementations


1

Если вы хотите проверить наличие Fileв каталогеdir

String directoryPath = dir.getAbsolutePath()
boolean check = new File(new File(directoryPath), aFile.getName()).exists();

и проверь checkрезультат



1

Не используйте конструктор файлов со строкой.
Это может не сработать!
Вместо этого используйте URI:

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}

Может не работать, почему нет? И как с помощью URI это исправить?
Маркиз Лорн

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

1

File.exists()чтобы проверить, существует ли файл, он вернет логическое значение, чтобы указать состояние операции проверки; истина, если файл существует; ложь, если не существует.

File f = new File("c:\\test.txt");

if(f.exists()){
    System.out.println("File existed");
}else{
    System.out.println("File not found!");
}

0

Вы можете использовать следующий код для проверки:

import java.io.File;
class Test{
    public static void main(String[] args){
        File f = new File(args[0]); //file name will be entered by user at runtime
        System.out.println(f.exists()); //will print "true" if the file name given by user exists, false otherwise

        if(f.exists())
        {
             //executable code;
        }
    }
}

0

Вы можете сделать это так

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}

Чтобы принять во внимание, ваш ответ имеет лучшую производительность по сравнению с File.is Exist()или Files.isRegularFile()в JDK 8
Кристиан Чапарро А.

0

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

  1. isFile () : проверяет, является ли файл, обозначенный этим абстрактным путем, нормальным файлом.
  2. exist () : Проверяет, существует ли файл или каталог, обозначенный этим абстрактным путем. docs.oracle.com

-5

Чтобы проверить, существует ли файл, просто импортируйте библиотеку java.io. *

File f = new File(“C:\\File Path”);

if(f.exists()){
        System.out.println(“Exists”);        //if file exists
}else{
        System.out.println(“Doesn't exist”);         //if file doesn't exist
}

Источник: http://newsdivariotipo.altervista.org/java-come-controllare-se-un-file-esiste/


2
Это ничего не добавляет. То, что вы говорите, было сказано в нескольких ответах. Пожалуйста, не производите шум.
klutt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.