2011-09-06 9 views
17
File oldFile = new File("old"); 
if (oldFile.renameTo(new File("new"))){ 
    System.out.println(oldFile.getName());//this prints "old" 
} 

Ho guardato alla fonte OpenJDK, e c'è la funzione renameTo (dest File) si presenta così:Perché File.renameTo non cambia dove il file punta?

public class File implements Serializable, Comparable<File> { 
    static private FileSystem fs = FileSystem.getFileSystem(); 
    private String path; 
    ... 
    public boolean renameTo(File dest) { 
     SecurityManager security = System.getSecurityManager(); 
     if (security != null) { 
      security.checkWrite(path); 
      security.checkWrite(dest.path); 
     } 
     return fs.rename(this, dest); 
    } 
    ... 
} 

Quindi la variabile del percorso non viene mai cambiato. Perchè è così? Quale sarebbe il modo giusto di utilizzare la variabile File rinominata? Attualmente lo faccio in questo modo:

File oldFile = new File("/home/blin/misk/old"); 
File newFile = new File("/home/blin/misk/new"); 
if (oldFile.renameTo(newFile)){ 
    oldFile=newFile; 
    System.out.println(oldFile.getName());//this prints "new" 
} 
+0

Lo stai facendo correttamente nel tuo ultimo esempio. – Marcelo

+0

Il file è un nome immutabile di un percorso. Non deve esistere e non cambia. –

risposta

12

La spiegazione più semplice possibile è che, to quote the Javadoc:

Le istanze della classe File sono immutabili; ovvero, una volta creato, il percorso astratto rappresentato da un oggetto File non cambierà mai.

Come altri hanno già detto, non c'è giusto o sbagliato qui. Tuttavia, non appena i progettisti della biblioteca hanno fatto la scelta sopra, il comportamento corrente di renameTo è diventato l'unico possibile.

Per quanto riguarda il secondo snippet di codice, non vedo difetti in esso.

4

Un oggetto File è solo un nome, non deve nemmeno esistere. La chiamata renameTo API effettivamente rinomina il file sul file system, ma non altera l'oggetto File perché questo è ciò che l'API è progettato per fare. non c'è giusto o sbagliato qui. i progettisti dell'API di Sun pensavano che avesse più senso in questo modo.

+0

Credo di aver sentito qualcuno al Sun discutere di come avrebbero dovuto chiamare la classe 'Path' invece di' File' per chiarire meglio questo ... –

1

Da una rapida occhiata a File, sembra immutabile. Ha alcuni setter, ma operano su file reali su file system, non sull'istanza File.

Così rinominare non modificando l'istanza corrente mantiene lo stesso stile.

Problemi correlati