Як перевірити, чи існує файл на Java?


841

Як я можу перевірити, чи існує файл, перш ніж відкрити його для читання на Java (еквівалент Perl -e $filename )?

Єдине подібне запитання щодо SO стосується написання файлу, і на це відповіли, використовуючи FileWriterякий, очевидно, тут не застосовується.

Якщо можливо, я віддаю перевагу справжньому виклику API, що повертає true / false, на відміну від деяких "API API для відкриття файлу і виловлення, коли він видає виняток, який ви перевіряєте на" відсутність файлу "в тексті", але я можу жити з лист.


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

6
Слід зазначити, що це небезпечно. Файлова система може змінюватися в будь-який час, включаючи відразу після повернення вашого методу "чи існує цей файл". Оскільки у будь-якому випадку вам доведеться займатися цією справою, такий метод викликає сумнівну корисність. Якщо ви збираєтесь відкрити файл, правильний спосіб зробити це - відкрити файл та обробити відповідний виняток.
Кевін

1
@kevin хороший момент, але це безперечна корисність у не одночасному середовищі, що трапилося в тому випадку, коли мені це було потрібно;)
DVK

@DVK: Ви працюєте на операційній ОС, що попереджає багатозадачність? Або це, або це спеціально розроблений чіп Java . Якщо перший, ви знаходитесь в одночасному середовищі. Інші процеси можуть змінити файлову систему з-під вас.
Кевін

2
@kevin не те, що це має значення, але це єдине потокове додаток, призначене для особистого використання. Шанси, що виділений файл якось буде створений / змінений з-під нього, неймовірно низькі.
DVK

Відповіді:


1341

Використання 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 (), щоб уникнути пробілів
Асим

427

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

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повернути помилкове, існування файлу не може бути перевірено. (можливо, немає права доступу до цього шляху)

Ви можете перевірити, чи pathце каталог чи звичайний файл.

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

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

Перевірте цей підручник Java SE 7 .


2
Що таке досягнення в порівнянні з новим File (path) .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 ).
Майк C

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! = null. f + (...) використовує java.io.File.toString
просто хтось

@just, власне, він використовує String.valueOf(), що обробляє нулі
GreenGiant

12

Не варто. Просто зафіксуйте FileNotFoundException.файлову систему, щоб перевірити, чи існує файл. Немає сенсу робити все це двічі, і кілька причин цього не робити, наприклад:

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

Не намагайтеся вдруге відгадати систему. Це знає. І не намагайтеся передбачити майбутнє. Взагалі найкращий спосіб перевірити наявність будь-якого ресурсу - це просто спробувати його використати.


Що робити, якщо я хочу перевіряти кожну годину, щоб побачити, чи файл був депонований у прямому місці. У мене є проект webMethods, який повинен перевірити, чи певний файл завантажено на певний диск. Як би це було зроблено. Скажімо, що я хочу перевіряти кожну годину, щоб побачити, чи файл є. Я можу використовувати Java для написання класу, який робить це, ймовірно, за допомогою якогось таймера.
Дуг Хауф

2
Ловити виняток - це значно дорожче. У моєму тесті перевірка нового File (). Postoji () була в 10 разів швидшою, ніж ловити FileNotFoundException. Отже, якщо у вас є сценарій, коли зазвичай очікується відсутність файлів (наприклад, кеш-диска), виняток є неправильним. Крім того, система вдруге здогадується.
Нік Фролов

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

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
Спосіб не відповісти на питання. Я погоджуюсь, що у спільноти є багато корисного, але, можливо, ми могли б зробити цей крок далі та дати відповідь на запитання, яке поставив ОП.
demongolem

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

Не використовуйте конструктор файлів зі String.
Це може не спрацювати!
Замість цього використовуйте URI:

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

Може не працювати, чому б і ні? І як за допомогою URI це виправити?
користувач207421

У нас виникла проблема. f.exists () було правдою, і ми навіть могли отримати вміст файлу. Проблема була в тому, що шлях був неправильним, але ім'я файлу було нормально, навіть це був інший файл. Змінивши виклик конструктора з URI, виправили проблему.
iviorel

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
Cristian Chaparro А.

0

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

  1. isFile () : перевіряє, чи є файл, позначений цим абстрактним іменем шляху, звичайним файлом.
  2. існує () : Тестує, чи існує файл або каталог, позначений цим абстрактним іменем шляху. 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
Це нічого не додає. Те, що ви говорите, було сказано в кількох відповідях. Будь ласка, не видайте шум.
клот
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.