Come posso verificare se esiste un file in Java?


842

Come posso verificare se esiste un file prima di aprirlo per la lettura in Java (l'equivalente di Perl -e $filename )?

L'unica domanda simile su SO riguarda la scrittura del file e quindi è stata data una risposta usando FileWriterche ovviamente non è applicabile qui.

Se possibile, preferirei una vera chiamata API che restituisca vero / falso rispetto ad alcune "Chiama API per aprire un file e catturare quando genera un'eccezione che controlli" nessun file "nel testo", ma posso convivere con l'ultimo.


3
Anche aggiungere che si vorrebbe verificare la presenza di opportuni permessi dei file: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File ha metodi canRead, canWritee canExecuteper verificare che .
Kirkland,

6
Va notato che questo è pericoloso. Il filesystem può cambiare in qualsiasi momento, anche subito dopo la restituzione del metodo "esiste questo file". Dato che devi comunque gestire quel caso, un tale metodo è di utilità discutibile. Se si intende aprire il file, il modo corretto per farlo è aprire il file e gestire l'eccezione pertinente.
Kevin,

1
@kevin buon punto, ma è di indiscutibile utilità in un ambiente non concorrenziale, che è successo nel caso in cui ne avessi bisogno;)
DVK

@DVK: stai eseguendo un sistema operativo multitasking preventivo? O quello, o è un chip Java appositamente progettato . Se il primo, ti trovi in ​​un ambiente concorrente. Altri processi potrebbero cambiare il filesystem da sotto di te.
Kevin,

2
@kevin non è importante, ma è un'app a thread singolo progettata per uso personale. Le possibilità che il suo file dedicato venga in qualche modo creato / modificato da sotto di esso sono incredibilmente basse.
DVK,

Risposte:


1342

Utilizzando java.io.File:

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

15
Ci sono alcuni casi in cui esiste () restituirà un risultato errato. Ad esempio, quando si utilizza un file system NFS c'è un problema con handle di file non aggiornati: bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 È un po 'oscuro, ma è stato la causa di alcuni bug frustranti nel codice di produzione prima.
CAW

22
Usa if(f.isFile())invece.
Leon,

1
ricordati di usare filePathString.trim () per evitare spazi bianchi
Asim

427

Consiglierei di utilizzare isFile()invece di exists(). La maggior parte delle volte stai cercando di verificare se il percorso punta a un file non solo che esiste. Ricorda che exists()tornerà vero se il tuo percorso punta a una directory.

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

new File("C:/").exists() restituirà true ma non ti consentirà di aprirlo e leggerlo come file.


1
@ ylun.ca L'esempio include le sottodirectory? Se si intende chiedere se, data una directory corrente di /path, new File("file.txt").exists()verrà restituito truese il percorso completo è corretto /path/to/file.txt, la risposta è un grande no (a meno che non /path/file.txtesista un altro file ).
Matteo Leggi il

149

Usando 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
}

Se entrambi existse notExistsrestituiscono false, non è possibile verificare l'esistenza del file. (forse nessun accesso proprio a questo percorso)

Puoi controllare se pathè una directory o un file normale.

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

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

Controlla questo tutorial su Java SE 7 .


2
Quali sono i vantaggi rispetto al nuovo File (percorso) .exists ()? Per un palino esiste, controlla
Raghu K Nair,

2
@RaghuKNair java.nio.file.Files.exists()è molto più veloce di java.io.File.exists()(dal mio piccolo benchmark sull'unico computer che ho testato: Windows Server 2012 con Java 1.7.0_45 x64).
Matthieu,

1
L'ho provato da solo ed è java.nio.file.Files.exists()stato 5 volte più LENTO di java.io.File.exists. (Win7 Java 1.7.0_79 - x86)
ParkerHalo,

Questo ha anche lo svantaggio che Paths.get genera un'eccezione se la stringa non è valida
Richard

46

Utilizzando Java 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}

2
Files.exists()accetta due argomenti. In genere, vorrai qualcosa di simile Files.exists(path, LinkOption.NOFOLLOW_LINKS ).
Mike C,

1
@MikeC Mi chiedo quale metodo viene chiamato senza il secondo argomento. Il Docu non mostra nemmeno alcuna informazione al riguardo.
PowerFlower,

1
@PowerFlower: esiste solo un metodo Files.exists (). Senza passare il secondo argomento, chiama ancora lo stesso metodo. Il secondo argomento è la variabile varargs e può passare 0 o più LinkOptions.
TK8,

27
File f = new File(filePathString); 

Questo non creerà un file fisico. Creerà semplicemente un oggetto della classe File. Per creare fisicamente un file devi crearlo esplicitamente:

f.createNewFile();

Quindi f.exists()può essere usato per verificare se esiste un file del genere.



16

Esistono diversi modi per raggiungere questo obiettivo.

  1. In caso di esistenza. Potrebbe essere un file o una directory.

    new File("/path/to/file").exists();
  2. Controlla il file

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
  3. Controlla la directory.

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

    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

primo colpo per "esiste un file java" su 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
Non è necessario verificare se f! = Null prima di controllare f.exist, se la nuova parola chiave fallisce genererà un'eccezione.
Sean AO Harney,

non c'è controllo se f! = null. f + (...) usa java.io.File.toString
solo qualcuno

@solo in realtà, utilizza String.valueOf(), che gestisce i null
GreenGiant

12

Non farlo. Basta catturare FileNotFoundException.Il file system deve verificare se il file esiste comunque. Non ha senso fare tutto ciò due volte, e diversi motivi per non farlo, come:

  • raddoppia il codice
  • il problema della finestra di temporizzazione in base al quale il file potrebbe esistere durante il test ma non all'apertura, o viceversa, e
  • il fatto che, come dimostra l'esistenza di questa domanda, potresti fare il test sbagliato e ottenere la risposta sbagliata.

Non provare a indovinare il sistema. Lo sa. E non provare a prevedere il futuro. In generale, il modo migliore per verificare se una risorsa è disponibile è solo provare a usarla.


Cosa succede se desidero controllare ogni ora per vedere se un file è stato depositato in una posizione diretta. Ho un progetto webMethods che deve controllare per vedere se un file specifico è stato caricato su un'unità specifica. Come sarebbe fatto. Diciamo che voglio controllare ogni ora per vedere se il file è lì. Posso usare Java per scrivere una classe che lo fa probabilmente con un timer di qualche tipo.
Doug Hauf,

2
Prendere un'eccezione è molto più costoso. Nel mio test, il controllo del nuovo File (). Esiste () è stato 10 volte più veloce rispetto alla cattura di FileNotFoundException. Pertanto, se si dispone di uno scenario in cui normalmente si prevede che manchino file (come la cache del disco), l'eccezione è errata. Inoltre, indovinare il sistema è interessante.
Nick Frolov,

1
@Gnawer Non hai affrontato nessuno dei problemi che ho sollevato; l'eccezione viene generata solo quando non è possibile aprire il file; e le operazioni che si verificano una volta all'ora non richiedono micro-ottimizzazione. La tua frase finale è senza senso.
Marchese di Lorne,

1
@DougHauf nel tuo caso non c'è problema poiché non provi a fare nulla dopo aver verificato l'esistenza. Ma l'OP ha chiesto specificamente di verificare prima dell'apertura. In questo caso è meglio provare / catturare il file aperto.
Dan Passaro,

8

Per me una combinazione della risposta accettata da Sean AO Harney e il conseguente commento di Cort3z sembra essere la soluzione migliore.

Usato il seguente frammento:

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

Spero che questo possa aiutare qualcuno.


4

So di essere un po 'in ritardo in questa discussione. Tuttavia, ecco la mia risposta, valida da Java 7 in poi.

Il frammento seguente

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

è perfettamente saziante, perché il metodo isRegularFilerestituisce falsese il file non esiste. Pertanto, non è necessario verificare se Files.exists(...).

Si noti che altri parametri sono opzioni che indicano come devono essere gestiti i collegamenti. Per impostazione predefinita, vengono seguiti i collegamenti simbolici.

Dalla documentazione Java Oracle


Dai documenti del sonar: il metodo Files.exists ha prestazioni notevolmente scarse in JDK 8 e può rallentare un'applicazione in modo significativo quando viene utilizzata per controllare i file che in realtà non esistono. Lo stesso vale per Files.notExists, Files.isDirectorye Files.isRegularFile. la migliore alternativa a questo è:path.toFile().exists()
Genaut,

4

Vale anche la pena familiarizzare con Commons FileUtils https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html Questo ha metodi aggiuntivi per la gestione di file e spesso meglio di JDK.


19
Modo di non rispondere alla domanda. Sono d'accordo che i beni comuni abbiano molte cose utili, ma forse potremmo fare un ulteriore passo avanti e fornire una risposta alla domanda posta dal PO.
demongolem,

4
Ha dato abbastanza di una risposta per me.
Bulltorious


2

Esempio semplice con buone pratiche di codifica e che copre tutti i casi:

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

Riferimenti e altri esempi su

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


1

Se si desidera verificare la presenza di a Filein una directorydir

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

e controlla il checkrisultato



1

Non usare il costruttore di file con String.
Questo potrebbe non funzionare!
Invece di utilizzare questo URI:

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

Potrebbe non funzionare perché no? E in che modo l'utilizzo di un URI lo risolve?
Marchese di Lorne

Abbiamo avuto un problema. f.exists () era vero e abbiamo persino potuto ottenere il contenuto del file. Il problema era che il percorso era sbagliato ma il nome del file era OK, anche questo era un altro file. La modifica della chiamata del costruttore con URI ha risolto il problema.
Iviorel

1

File.exists()per verificare se esiste un file, verrà restituito un valore booleano per indicare lo stato dell'operazione di controllo; vero se il file esiste; falso se non esiste.

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

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

0

È possibile utilizzare il seguente codice per verificare:

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

Puoi farlo in questo modo

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}

Per prendere in considerazione la tua risposta ha le migliori prestazioni rispetto a File.is Exist()o Files.isRegularFile()in JDK 8
Cristian Chaparro A.

0

C'è uno scopo specifico per progettare questi metodi. Non possiamo dire di usare nessuno per controllare l'esistenza o meno del file.

  1. isFile () : verifica se il file indicato da questo percorso astratto è un file normale.
  2. esiste () : verifica se esiste il file o la directory indicati da questo percorso astratto. docs.oracle.com

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.