Wie überprüfe ich, ob eine Datei in Java vorhanden ist?

842

Wie kann ich überprüfen, ob eine Datei vorhanden ist, bevor ich sie zum Lesen in Java öffne (entspricht Perl -e $filename )?

Die einzige ähnliche Frage zu SO befasst sich mit dem Schreiben der Datei und wurde daher mit beantwortet, FileWriterwas hier offensichtlich nicht anwendbar ist.

Wenn möglich, würde ich einen echten API- Aufruf bevorzugen , der true / false zurückgibt, im Gegensatz zu einer "Aufruf-API zum Öffnen einer Datei und zum Abfangen, wenn eine Ausnahme ausgelöst wird, bei der Sie im Text auf" keine Datei "prüfen", aber ich kann damit leben Letzteres.

DVK
quelle
3
Hinzufügen möchten auch , dass Sie für entsprechende Dateiberechtigungen überprüfen wollen: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File Methoden hat canRead, canWriteund canExecutezu überprüfen , dass .
Kirkland
6
Es ist zu beachten, dass dies gefährlich ist. Das Dateisystem kann jederzeit geändert werden, auch unmittelbar nachdem Ihre Methode "Existiert diese Datei?" Zurückgegeben wurde. Da Sie diesen Fall sowieso behandeln müssen, ist eine solche Methode von fragwürdigem Nutzen. Wenn Sie die Datei öffnen möchten, müssen Sie die Datei ordnungsgemäß öffnen und die entsprechende Ausnahme behandeln.
Kevin
1
@ Kevin guter Punkt, aber es ist von unbestreitbarem Nutzen in nicht gleichzeitiger Umgebung, was zufällig der Fall war, in dem ich dies brauchte;)
DVK
@ DVK: Laufen Sie auf einem präventiv Multitasking-Betriebssystem? Entweder das, oder es ist ein speziell entwickelter Java-Chip . In diesem Fall befinden Sie sich in einer gleichzeitigen Umgebung. Andere Prozesse können das Dateisystem unter Ihnen ändern.
Kevin
2
@kevin nicht, dass es wichtig ist, aber es ist eine Single-Threaded-App für den persönlichen Gebrauch. Die Wahrscheinlichkeit, dass eine dedizierte Datei daraus erstellt / geändert wird, ist unglaublich gering.
DVK

Antworten:

1342

Verwenden von java.io.File:

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}
Sean AO Harney
quelle
15
In einigen Fällen gibt exist () ein falsches Ergebnis zurück. Wenn Sie beispielsweise ein NFS-Dateisystem verwenden, tritt ein Problem mit veralteten Dateihandles auf : bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 Es ist etwas dunkel, hat aber einige frustrierende Fehler im Produktionscode verursacht Vor.
CAW
22
Verwenden Sie if(f.isFile())stattdessen.
Leon
1
Denken Sie daran, filePathString.trim () zu verwenden, um Leerzeichen zu vermeiden
Asim
427

Ich würde empfehlen, isFile()anstelle von zu verwenden exists(). Meistens möchten Sie überprüfen, ob der Pfad auf eine Datei verweist und nicht nur darauf, dass sie vorhanden ist. Denken Sie daran, dass exists()true zurückgegeben wird, wenn Ihr Pfad auf ein Verzeichnis verweist.

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

new File("C:/").exists() gibt true zurück, erlaubt Ihnen jedoch nicht, es als Datei zu öffnen und daraus zu lesen.

Chris Dail
quelle
1
@ ylun.ca Das Beispiel enthält Unterverzeichnisse? Wenn Sie meinen , zu fragen , ob ein aktuelles Verzeichnis angegeben /path, new File("file.txt").exists()wird zurückkehren , truewenn die richtige vollständigen Pfad ist /path/to/file.txt, ist die Antwort ein großes Nein (es sei denn , eine andere Datei /path/file.txtvorhanden ist ).
Matthew Read
149

Durch die Verwendung von nio in 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
}

Wenn beide existsund notExistsfalse zurückgeben, kann das Vorhandensein der Datei nicht überprüft werden. (möglicherweise kein Zugriffsrecht auf diesen Pfad)

Sie können überprüfen, ob pathes sich um ein Verzeichnis oder eine reguläre Datei handelt.

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

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

Bitte überprüfen Sie dieses Java SE 7-Tutorial .

Wonil
quelle
2
Was sind die Vorteile gegenüber der neuen Datei (Pfad) .exists ()? Für einen Palin existiert Scheck
Raghu K Nair
2
@RaghuKNair java.nio.file.Files.exists()ist viel schneller als java.io.File.exists()(von meinem kleinen Benchmark auf dem einzigen Computer, den ich getestet habe: Windows Server 2012 mit Java 1.7.0_45 x64).
Matthieu
1
Ich habe es einfach selbst versucht und java.nio.file.Files.exists()war 5 mal langsamer als java.io.File.exists. (Win7 Java 1.7.0_79 - x86)
ParkerHalo
Dies hat auch den Nachteil, dass Paths.get eine Ausnahme auslöst, wenn die Zeichenfolge nicht gültig ist
Richard
46

Verwenden von Java 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}
Wendel
quelle
2
Files.exists()nimmt zwei Argumente. Normalerweise möchten Sie so etwas wie Files.exists(path, LinkOption.NOFOLLOW_LINKS ).
Mike C
1
@ MikeC Ich frage mich, welche Methode ohne das zweite Argument aufgerufen wird. Das Docu zeigt nicht einmal Informationen darüber an.
PowerFlower
1
@PowerFlower: Es gibt nur eine Files.exists () -Methode. Ohne das zweite Argument zu übergeben, wird immer noch dieselbe Methode aufgerufen. Das zweite Argument ist varargs variable und kann 0 oder mehr LinkOptions übergeben.
TK8
27
File f = new File(filePathString); 

Dadurch wird keine physische Datei erstellt. Erstellt nur ein Objekt der Klasse Datei. Um eine Datei physisch zu erstellen, müssen Sie sie explizit erstellen:

f.createNewFile();

So f.exists()kann verwendet werden , um zu überprüfen , ob eine solche Datei vorhanden ist oder nicht.

Rizwan
quelle
25
f.isFile() && f.canRead()
jhumble
quelle
2
Stellt Pearl's -eauch sicher, dass die Anwendung die Datei "lesen" kann?
Begrenzte Versöhnung
16

Es gibt mehrere Möglichkeiten, dies zu erreichen.

  1. Im Falle von nur für die Existenz. Es kann sich um eine Datei oder ein Verzeichnis handeln.

    new File("/path/to/file").exists();
  2. Nach Datei suchen

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
  3. Nach Verzeichnis suchen.

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

    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
Raghu K Nair
quelle
14

Sie können Folgendes verwenden: File.exists()

Francis Upton IV
quelle
14

Erster Treffer für "Java-Datei existiert" bei 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 "));
    }
}
nur jemand
quelle
1
Es ist nicht erforderlich zu prüfen, ob f! = Null ist, bevor f.exists überprüft wird. Wenn das neue Schlüsselwort fehlschlägt, wird eine Ausnahme generiert.
Sean AO Harney
Es gibt keine Überprüfung, ob f! = null ist. f + (...) verwendet java.io.File.toString
nur jemand
@ nur tatsächlich verwendet es String.valueOf(), die Nullen behandelt
GreenGiant
12

Tu es nicht. Fangen Sie einfach das FileNotFoundException.Das Dateisystem muss testen, ob die Datei trotzdem existiert. Es macht keinen Sinn, das alles zweimal zu tun, und es gibt mehrere Gründe, dies nicht zu tun, wie zum Beispiel:

  • Verdoppeln Sie den Code
  • das Timing-Fenster-Problem, bei dem die Datei möglicherweise beim Testen vorhanden ist, nicht jedoch beim Öffnen oder umgekehrt, und
  • Die Tatsache, dass Sie, wie die Existenz dieser Frage zeigt, möglicherweise den falschen Test durchführen und die falsche Antwort erhalten.

Versuchen Sie nicht, das System zu überdenken. Es weiß. Und versuchen Sie nicht, die Zukunft vorherzusagen. Im Allgemeinen können Sie am besten testen, ob eine Ressource verfügbar ist, indem Sie versuchen, sie zu verwenden.

Marquis von Lorne
quelle
Was ist, wenn ich jede Stunde überprüfen möchte, ob eine Datei an einem direkten Ort abgelegt wurde? Ich habe ein webMethods-Projekt, das überprüfen muss, ob eine bestimmte Datei auf ein bestimmtes Laufwerk hochgeladen wurde. Wie würde das gemacht werden? Angenommen, ich möchte jede Stunde überprüfen, ob die Datei vorhanden ist. Ich kann Java verwenden, um eine Klasse zu schreiben, die dies wahrscheinlich mit einem Timer tut.
Doug Hauf
2
Eine Ausnahme zu fangen ist viel teurer. In meinem Test war das Überprüfen der neuen Datei (). Exists () mehr als zehnmal schneller als das Abfangen von FileNotFoundException. Wenn Sie also ein Szenario haben, in dem normalerweise Dateien fehlen (z. B. Festplatten-Cache), ist die Ausnahme falsch. Auch das zweite Erraten des Systems ist cool.
Nick Frolov
1
@Gnawer Sie haben keines der von mir angesprochenen Probleme angesprochen. Die Ausnahme wird nur ausgelöst, wenn die Datei nicht geöffnet werden kann. und Operationen, die einmal pro Stunde stattfinden, erfordern keine Mikrooptimierung. Dein letzter Satz ist Unsinn.
Marquis von Lorne
1
@DougHauf in Ihrem Fall gibt es kein Problem, da Sie nicht versuchen, etwas zu tun, nachdem Sie die Existenz überprüft haben. Das OP bat jedoch ausdrücklich darum, dies vor dem Öffnen zu überprüfen. In diesem Fall ist es besser, einfach zu versuchen, die geöffnete Datei abzufangen.
Dan Passaro
8

Für mich scheint eine Kombination aus der akzeptierten Antwort von Sean AO Harney und dem daraus resultierenden Kommentar von Cort3z die beste Lösung zu sein.

Verwendete das folgende Snippet:

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

Hoffe das könnte jemandem helfen.

X-Fate
quelle
4

Ich weiß, dass ich in diesem Thread etwas spät dran bin. Hier ist jedoch meine Antwort, gültig seit Java 7 und höher.

Das folgende Snippet

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

ist vollkommen zufriedenstellend, da die Methode isRegularFilezurückgegeben wird, falsewenn keine Datei vorhanden ist. Daher muss nicht geprüft werden, ob Files.exists(...).

Beachten Sie, dass andere Parameter Optionen sind, die angeben, wie Links behandelt werden sollen. Standardmäßig werden symbolische Links befolgt.

Aus der Java Oracle-Dokumentation

avi.elkharrat
quelle
Aus Sonardokumenten : Die Files.exists-Methode weist in JDK 8 eine merklich schlechte Leistung auf und kann eine Anwendung erheblich verlangsamen, wenn sie zum Überprüfen nicht vorhandener Dateien verwendet wird. Das gleiche gilt für Files.notExists, Files.isDirectoryund Files.isRegularFile. die beste Alternative dazu ist:path.toFile().exists()
Genaut
4

Es lohnt sich auch, sich mit Commons FileUtils vertraut zu machen. Https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html Hier finden Sie zusätzliche Methoden zum Verwalten von Dateien und oft besser als JDK.

peter.murray.rust
quelle
19
Weg, um die Frage nicht zu beantworten. Ich bin damit einverstanden, dass Commons viele nützliche Dinge enthält, aber vielleicht könnten wir noch einen Schritt weiter gehen und eine Antwort auf die Frage geben, die das OP gestellt hat.
Demongolem
4
Er gab mir genug Antwort.
Bulltorious
3

Zum Beispiel, wenn Sie ein Dateiverzeichnis haben und prüfen möchten, ob es existiert

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

boolean exists = tmpDir.exists();

exists gibt false zurück, wenn die Datei nicht vorhanden ist

Quelle: https://alvinalexander.com/java/java-file-exists-directory-exists

ID127898
quelle
2

Einfaches Beispiel mit guten Codierungspraktiken und Abdeckung aller Fälle:

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

Referenz und weitere Beispiele unter

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

Amandeep Singh
quelle
1

Wenn Sie Filein einem Verzeichnis nach einem suchen möchtendir

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

und überprüfen Sie das checkErgebnis

user3618182
quelle
1
new File("/path/to/file").exists(); 

wird den Trick machen

user4833142
quelle
1

Verwenden Sie den Dateikonstruktor nicht mit String.
Dies funktioniert möglicherweise nicht!
Verwenden Sie stattdessen URI:

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}
iviorel
quelle
Kann nicht funktionieren, warum nicht? Und wie behebt die Verwendung eines URI das?
Marquis von Lorne
Wir hatten ein Problem. f.exists () war wahr und wir konnten sogar den Dateiinhalt erhalten. Das Problem war, der Pfad war falsch, aber der Dateiname war in Ordnung, auch dies war eine andere Datei. Durch Ändern des Konstruktoraufrufs mit URI wurde das Problem behoben.
Iviorel
1

File.exists()Um zu überprüfen, ob eine Datei vorhanden ist, wird ein boolescher Wert zurückgegeben, der den Status des Überprüfungsvorgangs angibt. true, wenn die Datei vorhanden ist; false wenn nicht vorhanden.

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

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

Sie können den folgenden Code verwenden, um zu überprüfen:

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
quelle
0

Sie können es so machen

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}
Rodrigo Pavan
quelle
Um zu berücksichtigen, hat Ihre Antwort die beste Leistung im Vergleich zu File.is Exist()oder Files.isRegularFile()in JDK 8
Cristian Chaparro A.
0

Es gibt einen bestimmten Zweck, diese Methoden zu entwerfen. Wir können nicht sagen, dass Sie jemanden verwenden, um zu überprüfen, ob eine Datei vorhanden ist oder nicht.

  1. isFile () : Testet, ob die Datei mit diesem abstrakten Pfadnamen bezeichnet eine normale Datei ist.
  2. exist () : Testet, ob die mit diesem abstrakten Pfadnamen angegebene Datei oder das Verzeichnis vorhanden ist. docs.oracle.com
Atul Jain
quelle
-5

Um zu überprüfen, ob eine Datei vorhanden ist, importieren Sie einfach die Bibliothek 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
}

Quelle: http://newsdivariotipo.altervista.org/java-come-controllare-se-un-file-esiste/

Yassine
quelle
2
Dies fügt nichts hinzu. Was Sie sagen, wurde in mehreren Antworten gesagt. Bitte keinen Lärm erzeugen.
Klutt