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

842

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

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

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

DVK
источник
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 .

Wonil
источник
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()можно использовать, чтобы проверить, существует ли такой файл или нет.

Ризван
источник
25
f.isFile() && f.canRead()
jhumble
источник
2
Перл -eтакже гарантирует, что приложение "может читать" файл?
Ограниченное искупление
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

Вы можете использовать следующее: File.exists()

Фрэнсис Аптон IV
источник
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 ...
}

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

X-Fate
источник
4

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

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

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

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

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

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

avi.elkharrat
источник
Из сонарных документов: Метод 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.

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

Например, если у вас есть каталог с файлами, и вы хотите проверить, существует ли он

File tmpDir = new File("/var/tmp");

boolean exists = tmpDir.exists();

exists вернет false если файл не существует

источник: https://alvinalexander.com/java/java-file-exists-directory-exists

ID127898
источник
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результат

user3618182
источник
1
new File("/path/to/file").exists(); 

сделает свое дело

user4833142
источник
1

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

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}
iviorel
источник
Может не работать, почему нет? И как с помощью 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;
        }
    }
}
Pankti
источник
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