2012-07-02 13 views
20

Se faccio questo:Controllare se il file esiste senza creare lo

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

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

Poi il file viene creato e restituisce sempre "Il file esiste". È possibile verificare se un file esiste senza crearlo?

EDIT:

Ho dimenticato di dire che è in un ciclo for. Quindi, ecco la cosa reale:

for (int i = 0; i < 10; i++) { 
    File file = new File("c:\\text" + i + ".txt"); 
    System.out.println("New file created: " + file.getPath()); 
} 
+0

possibile duplicato di [Come verificare se esiste un file? (Java su Windows)] (http: // StackOverflow.it/questions/1816673/how-do-i-check-if-a-file-exists-java-on-windows) – MarcoS

+1

@MarcoS: in realtà non è un duplicato. Il titolo di questa domanda è semplicemente mal formulato. –

+0

@JoachimSauer: forse non è un duplicato esatto, ma la risposta potrebbe essere dedotta leggendo quella domanda e provando un po 'di codice ... quindi per me è un duplicato – MarcoS

risposta

46

Quando si installa uno File, non si crea nulla sul disco ma si crea semplicemente un oggetto sul quale è possibile chiamare alcuni metodi, ad esempio exists().

Questo va bene ed economico, non cercare di evitare questa instanciazione.

L'istanza File ha solo due campi:

private String path; 
private transient int prefixLength; 

E qui è il costruttore:

237  public File(String pathname) { 
238   if (pathname == null) { 
239    throw new NullPointerException(); 
240   } 
241   this.path = fs.normalize(pathname); 
242   this.prefixLength = fs.prefixLength(this.path); 
243  } 

Come si può vedere, l'istanza File è solo un incapsulamento del percorso. La creazione per chiamare exists() è il modo corretto di procedere. Non cercare di ottimizzarlo.

+5

@ThreaT: contrariamente all'opinione comune, il codice in esecuzione all'interno di un ciclo non ** cambia in modo sostanziale ciò che fa il codice. –

+1

@ThreaT se il codice 'new File' è in un ciclo, potresti essere colpevole di codifica inefficiente, ma non creerà comunque un file reale. Se il tuo file esiste, non è assolutamente dovuto alla classe File. – mah

+0

@ThreaT Non c'è nessuna preoccupazione. Seriamente, è davvero economico. Questo non è più che un incapsulamento del tuo percorso. –

10

Creazione di un'istanza File non crea un file nel file system, in modo che il codice inviato farà ciò che si richiede.

+0

@ThreaT, totalmente irrilevante. Per creare un file usando 'File' è necessario richiamare' File.createNewFile() '. – hmjd

+0

@ThreaT, quel ciclo 'for' non creerà i file. Stamperà il messaggio "Nuovo file creato ...." ma questi file non saranno presenti sul tuo file system. Aggiungi 'file.exists()' al tuo messaggio e sarà 'false' (supponendo che al momento non esistano). – hmjd

2

A partire da Java 7 è possibile utilizzare java.nio.file.Files.exists:

Path p = Paths.get("C:\\Users\\first.last"); 
boolean exists = Files.exists(p); 
boolean notExists = Files.notExists(p); 

if (exists) { 
    System.out.println("File exists!"); 
} else if (notExists) { 
    System.out.println("File doesn't exist!"); 
} else { 
    System.out.println("File's status is unknown!"); 
} 

Nel Oracle tutorial potete trovare alcuni dettagli su questo:

I metodi della classe Path sono sintattica, il che significa che operano sull'istanza Path. Ma alla fine è necessario accedere al file system per verificare che un particolare Path esista o non esista. È possibile farlo con i metodi exists(Path, LinkOption...) e notExists(Path, LinkOption...). Si noti che !Files.exists(path) non è equivalente a Files.notExists(path). Quando si verifica l'esistenza di un file, sono possibili tre risultati:

  • Il file è verificato per esistere.
  • Il file è verificato per non esiste.
  • Lo stato del file è sconosciuto. Questo risultato può verificarsi quando il programma non ha accesso al file.

Se entrambi exists e notExists ritorno false, l'esistenza del file non può essere verificata.

+0

Ciao a casa Romania :-) – Flavius

Problemi correlati