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

691

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

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

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

  • 3
    Также хочу добавить, что вы хотите проверить наличие соответствующих прав доступа к файлу: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File имеет методы canRead , canWrite и canExecute для проверить это.
  • 6
    Следует отметить, что это опасно. Файловая система может измениться в любое время, в том числе сразу после возврата вашего метода «существует ли этот файл». Так как в любом случае вы должны разобраться с этим делом, такой метод вызывает сомнение. Если вы собираетесь открыть файл, правильный способ сделать это - открыть файл и обработать соответствующее исключение.
Показать ещё 3 комментария
Теги:
io
file-io

21 ответ

1211
Лучший ответ

Используя java.io.File:

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}
  • 12
    В некоторых случаях существует () вернет неверный результат. Например, при использовании файловой системы NFS существует проблема с устаревшими дескрипторами файлов: bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 Это не совсем понятно , но это является причиной некоторых неприятных ошибок в рабочем коде. до.
  • 3
    if(f.isFile()) используйте if(f.isFile()) .
377

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

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

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

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

Используя 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
}

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

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

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

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

Проверьте этот учебник Java SE 7.

  • 1
    Что такое Advatages по сравнению с новым File (путь) .exists ()? Для палин существует проверка
  • 2
    @RaghuKNair java.nio.file.Files.exists() намного быстрее, чем java.io.File.exists() (из моего небольшого теста на единственном тестированном компьютере: Windows Server 2012 под управлением Java 1.7.0_45 x64).
Показать ещё 2 комментария
39

Использование Java 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}
  • 1
    Files.exists() принимает два аргумента. Как правило, вам нужно что-то вроде Files.exists(path, LinkOption.NOFOLLOW_LINKS ) .
  • 1
    @MikeC Интересно, какой метод вызывается без второго аргумента. Документ даже не показывает никакой информации об этом.
Показать ещё 1 комментарий
26
File f = new File(filePathString); 

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

f.createNewFile();

So f.exists() может использоваться для проверки наличия или отсутствия такого файла.

23
f.isFile() && f.canRead()
  • 2
    Перл -e также гарантирует, что приложение "может читать" файл?
14

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

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 "));
    }
}
  • 0
    Нет необходимости проверять, если f! = Null, прежде чем проверять f.exists, если новое ключевое слово завершится неудачно, оно сгенерирует исключение.
  • 0
    нет проверки, если f! = ноль. f + (...) использует java.io.File.toString
Показать ещё 1 комментарий
11

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

  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
    
9

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

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

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

  • 0
    Что делать, если я хочу проверять каждый час, чтобы увидеть, был ли файл передан в прямом месте. У меня есть проект webMethods, который должен проверить, был ли загружен определенный файл на определенный диск. Как бы это было сделано. Допустим, я хочу каждый час проверять, есть ли файл. Я могу использовать Java для написания класса, который делает это, вероятно, с каким-то таймером.
  • 2
    Поймать исключение намного дороже. В моем тесте проверка нового File (). Exist () была более чем в 10 раз быстрее, чем перехват исключения FileNotFoundException. Таким образом, если у вас есть сценарий, в котором обычно ожидается отсутствие файлов (например, дискового кэша), исключение является неправильным. Кроме того, второе предположение система крутая.
Показать ещё 2 комментария
8

Для меня комбинация принятого ответа Шона А. О. Harney и итоговый комментарий Cort3z, по-видимому, являются лучшим решением.

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

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

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

4

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

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

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

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

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

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

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

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

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

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

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

boolean exists = tmpDir.exists();

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

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

1

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

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

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

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

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}
  • 0
    Он не работал со String, и мне интересно, почему?
  • 0
    Может не сработать, почему нет? И как с помощью URI это исправить?
Показать ещё 1 комментарий
1
new File("/path/to/file").exists(); 

выполнит трюк

1

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

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

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

0

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

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}
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;
        }
    }
}
-2

Чтобы проверить, существует ли файл, просто импортируйте библиотеку 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
    Это ничего не добавляет. То, что вы говорите, было сказано в нескольких ответах. Пожалуйста, не производите шум.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню