¿Cómo puedo cambiar el nombre (no mover) un archivo en JDK7?
Pregunta
Estoy un poco confundido con todas estas nuevas clases de archivos de E / S en JDK7.
Digamos, tengo una Path
y quiero cambiar el nombre del archivo que representa. ¿Cómo se especifica el nuevo nombre, cuando nuevamente se espera una Path
?
Path p = /* path to /home/me/file123 */;
Path name = p.getName(); /* gives me file123 */
name.moveTo(/* what now? */); /* how to rename file123 to file456? */
Nota: ¿Por qué necesito JDK7 ? La manipulación de enlaces simbólicos
El problema es: Tengo que hacerlo con archivos cuyos nombres y ubicaciones son conocidos en tiempo de ejecución. Por lo tanto, lo que necesito, es un método seguro (sin excepcionales efectos secundarios) para crear un nuevo nombre-Camino de algún antiguo nombre-Path.
Path newName(Path oldName, String newNameString){
/* magic */
}
Solución
Usted tiene una cadena de ruta y es necesario crear una instancia de Path. Usted puede hacer esto con el método getPath o resolver. Aquí está una manera:
Path dir = oldFile.getParent();
Path fn = oldFile.getFileSystem().getPath(newNameString);
Path target = (dir == null) ? fn : dir.resolve(fn);
oldFile.moveTo(target);
Tenga en cuenta que se comprueba si el padre es nulo (se parece a su solución no hacerlo).
Otros consejos
En JDK7, Files.move () proporciona una sintaxis corta y concisa para cambiar el nombre de archivos:
Path newName(Path oldName, String newNameString) {
return Files.move(oldName, oldName.resolveSibling(newNameString));
}
En primer lugar estamos recibiendo el Camino hacia el nuevo nombre de archivo usando Path.resolveSibling () y la usamos Files.move () para hacer el cambio de nombre real.
OK, después de probar todo lo que fuera, parece que encontré el método correcto:
// my helper method
Path newName(Path oldFile, String newNameString){
// the magic is done by Path.resolve(...)
return oldFile.getParent().resolve(newNameString);
}
// so, renaming is done by:
oldPath.moveTo(newName(oldFile, "newName"));
Si se echa un vistazo a Apache Commons IO hay una clase llamada FileNameUtils . Esto lo hace un montón de cosas WRT. presentar los nombres de ruta y que (entre otras cosas) de forma fiable dividir los nombres de ruta, etc. Creo que debería conseguir que en gran medida a lo que desea.
Si la ruta de destino es idéntica a la ruta de origen a excepción del nombre del archivo , que pasará a llamarse en lugar de moverse.
Así que para su ejemplo, la ruta debe ser moveto
/home/me/file456
Si usted no puede conseguir Java para hacer lo que quiera con Unix recomiendo scripts de Python (dirigido por el programa Java). Python tiene obtener apoyo para Unix scripting y no es Perl :) Esto puede parecer poco elegante para usted, pero realmente en un programa más amplio que va a beneficiarse del uso de la herramienta adecuada para el trabajo.