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

He mirado en la fuente OpenJDK, y hay función renameTo (dest Archivo) se ve así:¿Por qué File.renameTo no cambia a dónde apunta File?

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

Así que la variable de ruta no se cambia. ¿Por qué es así? ¿Cuál sería la forma correcta de usar la variable de archivo renombrada? Actualmente lo hago así:

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 está haciendo correctamente en su último ejemplo. – Marcelo

+0

El archivo es un nombre inmutable de una ruta. No tiene que existir y no cambia. –

Respuesta

12

La explicación más simple posible es que, to quote the Javadoc:

instancias de la clase File son inmutables; es decir, una vez creado, la ruta de acceso abstracta representada por un objeto File nunca cambiará.

Como han dicho otros, no existe el bien o el mal aquí. Sin embargo, tan pronto como los diseñadores de la biblioteca tomaron la decisión anterior, el comportamiento actual de renameTo se convirtió en el único posible.

En cuanto a su segundo fragmento de código, no veo defectos en él.

4

Un objeto de archivo es solo un nombre, ni siquiera tiene que existir. La llamada a la API renameTo cambia el nombre del archivo en el sistema de archivos, pero no altera el objeto File porque esto es lo que la API está diseñada para hacer. no hay correcto o incorrecto aquí. los diseñadores de API en Sun pensaron que tiene más sentido de esta manera.

+0

Creo que una vez escuché a alguien en Sun discutiendo cómo deberían haber llamado a la clase 'Path' en lugar de' File' para aclarar mejor esto ... –

1

Desde un vistazo rápido a File, parece que es inmutable. Tiene algunos setters, pero operan en un archivo real en un sistema de archivos, no en la instancia de File.

Así que el cambio de nombre no modifica la instancia actual mantiene el mismo estilo.

Cuestiones relacionadas