Jak sprawdzić, czy plik istnieje w Javie?

Jak mogę sprawdzić, czy plik istnieje, przed otwarciem go do odczytu w Java (odpowiednik Perla -e $filename)?

Jedyne podobne pytanie na SO dotyczy zapisu pliku i w ten sposób zostało udzielone FileWriter, co oczywiście nie ma tu zastosowania.

Jeśli to możliwe wolałbym prawdziwe API wywołanie zwracające true/false w przeciwieństwie do jakiegoś " wywołania API, aby otworzyć plik i złapać, gdy rzuca wyjątek które sprawdzasz "Brak pliku " w tekście", ale z tym drugim mogę żyć.

Author: Arsen Khachaturyan, 2009-11-29

17 answers

Za pomocą java.io.File:

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}
 1392
Author: Sean A.O. Harney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 12:40:28

Zalecałbym użycie isFile() zamiast exists(). Przez większość czasu sprawdzasz, czy ścieżka wskazuje na plik nie tylko na to, że istnieje. Pamiętaj, że exists() zwróci true, jeśli ścieżka wskazuje na katalog.

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

new File("C:/").exists() zwróci true, ale nie pozwoli Ci otworzyć i odczytać z niego pliku.

 452
Author: Chris Dail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-11 06:41:57

Używając nio w Javie 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
}

Jeśli zarówno exists jak i notExists zwrócą false, istnienie pliku nie może być zweryfikowane. (być może brak prawa dostępu do tej ścieżki)

Możesz sprawdzić czy path jest katalogiem czy zwykłym plikiem.

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

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

Proszę sprawdzić ten Java SE 7 tutorial.

 167
Author: Wonil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-09 16:58:00

Używanie Javy 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}
 49
Author: Wendel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-01 13:33:32
File f = new File(filePathString); 

To nie utworzy fizycznego pliku. Po prostu utworzy obiekt z pliku klasy. Aby fizycznie utworzyć plik, musisz go jawnie utworzyć:

f.createNewFile();

Więc f.exists() może być użyty do sprawdzenia, czy taki plik istnieje, czy nie.

 28
Author: rizwan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-28 11:06:21
f.isFile() && f.canRead()
 27
Author: jhumble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 15:03:09

Istnieje wiele sposobów, aby to osiągnąć.

  1. W przypadku sprawiedliwego istnienia. Może to być plik lub katalog.

    new File("/path/to/file").exists();
    
  2. Sprawdź plik

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
    
  3. Sprawdź Katalog.

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

    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
    
 19
Author: Raghu K Nair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 15:50:24

Możesz użyć: File.exists()

 15
Author: Francis Upton IV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-01 11:16:33

Pierwsze trafienie dla "Plik java istnieje" w 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 "));
    }
}
 15
Author: just somebody,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-07 11:35:32

Nie. po prostu złap FileNotFoundException. system plików musi sprawdzić, czy plik i tak istnieje. Nie ma sensu robić tego wszystkiego dwa razy i kilka powodów, aby tego nie robić, takich jak:

  • podwojenie kodu
  • problem z oknem czasowym, przez który plik może istnieć podczas testowania, ale nie po otwarciu, lub odwrotnie, i
  • fakt, że jak pokazuje istnienie tego pytania, możesz zrobić zły test i uzyskać złą odpowiedź.

Nie próbuj zastanów się nad systemem. To wie. I nie próbuj przewidywać przyszłości. Ogólnie rzecz biorąc, najlepszym sposobem sprawdzenia, czy dowolny zasób jest po prostu spróbować go użyć.

 13
Author: user207421,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-03 09:39:12

Dla mnie połączenie zaakceptowanej odpowiedzi Seana A. O. Harneya i uzyskanego komentarza Cort3z wydaje się najlepszym rozwiązaniem.

Użyto następującego fragmentu:

File f = new File(filePathString);
if(f.exists() && f.isFile()) {
    //do something ...
}
Mam nadzieję, że to komuś pomoże.
 9
Author: X-Fate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-21 11:02:14

Wiem, że trochę się spóźniłem w tym wątku. Jednak oto moja odpowiedź, ważna od Javy 7 i nowszych.

Następujący fragment

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

Jest idealnie satifactory, ponieważ metoda isRegularFile zwraca false Jeśli plik nie istnieje. Dlatego nie ma potrzeby sprawdzania, czy Files.exists(...).

Zauważ, że inne parametry są opcjami wskazującymi, jak linki powinny być obsługiwane. Domyślnie stosowane są dowiązania symboliczne.

Z Dokumentacji Java Oracle

 6
Author: avi.elkharrat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 09:39:21

Warto też zapoznać się z Commons FileUtils https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html Ma to dodatkowe metody zarządzania plikami i często lepsze niż JDK.

 5
Author: peter.murray.rust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-10 23:05:57

Prosty przykład z dobrymi praktykami kodowania i obejmujący wszystkie przypadki:

 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);
            }
        }
    }

Odniesienie i więcej przykładów na

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

 3
Author: Amandeep Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-04 09:16:26

Nie używaj konstruktora plików z łańcuchem znaków.
To może się nie udać!
Zamiast tego użyj URI:

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}
 1
Author: iviorel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-01 08:21:43

You can make it this way

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}
 0
Author: Rodrigo Pavan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-17 13:57:06

Istnieje szczególny cel projektowania tych metod. Nie możemy powiedzieć, że użyj kogokolwiek, aby sprawdzić, czy plik istnieje, czy nie.

  1. isFile () : sprawdza, czy plik oznaczony tą abstrakcyjną nazwą ścieżki jest plikiem normalnym.
  2. exists () : sprawdza, czy istnieje plik lub katalog oznaczony tą abstrakcyjną nazwą ścieżki. docs.oracle.com
 0
Author: Atul Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-03 12:18:57