2009-07-21 33 views
127

¿Podemos cambiar el nombre de un archivo, por ejemplo, test.txt a test1.txt?Cambiar el nombre de un archivo con Java

Si test1.txt existe, ¿cambiará de nombre?

¿Cómo cambio el nombre al archivo test1.txt existente para que se añadan los nuevos contenidos de test.txt para su uso posterior?

+4

Su último párrafo no describe una operación de cambio de nombre en absoluto. Describe una operación de adición. – EJP

Respuesta

2

Por lo que sé, el cambio de nombre de un archivo no agregará su contenido a la de un archivo existente con el nombre de destino.

Para cambiar el nombre de un archivo en Java, consulte el documentation para el método renameTo() en la clase File.

26

Quiere utilizar el método renameTo en un objeto File.

Primero, cree un objeto File para representar el destino. Verifique si ese archivo existe. Si no existe, cree un nuevo objeto File para que se mueva el archivo. llama al método renameTo en el archivo que se va a mover, y verifica el valor devuelto desde renameTo para ver si la llamada fue exitosa.

Si desea agregar el contenido de un archivo a otro, hay varios escritores disponibles. En función de la extensión, parece que es texto sin formato, así que me gustaría ver el FileWriter.

+2

¿Y qué pasa con esto? –

+2

Esto se degrada? ¿Por qué? – Mnementh

+6

No tengo idea, pero es exactamente lo mismo que publicó Pierre, sin el código fuente ... –

141

Copiado del http://exampledepot.8waytrips.com/egs/java.io/RenameFile.html

// File (or directory) with old name 
File file = new File("oldname"); 

// File (or directory) with new name 
File file2 = new File("newname"); 

if (file2.exists()) 
    throw new java.io.IOException("file exists"); 

// Rename file (or directory) 
boolean success = file.renameTo(file2); 

if (!success) { 
    // File was not successfully renamed 
} 

Para anexar al nuevo archivo:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/); 
+15

Este código no funcionará en todos los casos o plataformas. El método rename to no es confiable: http://stackoverflow.com/questions/1000183/reliable-file-renameto-alternative-on- windows –

+0

Solo inténtalo. No puede funcionar –

15

Cambiar el nombre del archivo moviéndolo a un nuevo nombre. (FileUtils es de Apache Commons IO lib)

String newFilePath = oldFile.getAbsolutePath().replace(oldFile.getName(), "") + newName; 
    File newFile = new File(newFilePath); 

    try { 
    FileUtils.moveFile(oldFile, newFile); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
22

Para Java 1,6 e inferior, creo que el API más segura y limpia para esto es la guayaba de Files.move.

Ejemplo:

File newFile = new File(oldFile.getParent(), "new-file-name.txt"); 
Files.move(oldFile.toPath(), newFile.toPath()); 

La primera línea se asegura de que la ubicación del nuevo archivo es el mismo directorio, es decir, el directorio padre del archivo antiguo.

EDIT: Escribí esto antes de empezar a usar Java 7, que presentó un enfoque muy similar. Entonces, si usa Java 7+, debería ver y votar la respuesta de kr37.

64

En resumen:

Files.move(source, source.resolveSibling("newname")); 

más detalle:

import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

La siguiente es copiada directamente de http://docs.oracle.com/javase/7/docs/api/index.html:

Supóngase que se desea cambiar el nombre de un archivo a "newname", manteniendo el archivo en el mismo directorio:

Path source = Paths.get("path/here"); 
Files.move(source, source.resolveSibling("newname")); 

Alternativamente, supongamos que queremos mover un archivo de directorio nuevo, manteniendo el mismo nombre de archivo y reemplazar cualquier archivo existente con ese nombre en el directorio:

Path source = Paths.get("from/path"); 
Path newdir = Paths.get("to/path"); 
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING); 
+1

La ruta es una interfaz cuyas únicas implementaciones son WindowsPath, ZipPath y AbstractPath. ¿Será esto un problema para las implementaciones multiplataforma? – Caelum

+1

Hola @ user2104648, aquí (http://tutorials.jenkov.com/java-nio/path.html) es un ejemplo de cómo podrías manejar los archivos en el entorno Linux. Básicamente, debe usar java.nio.file.Paths.get (somePath) en lugar de utilizar una de las implementaciones que mencionó – maxivis

+1

¿Qué es Path source = ...? –

8

Esta es una manera fácil de cambiar el nombre de un archivo :

 File oldfile =new File("test.txt"); 
     File newfile =new File("test1.txt"); 

     if(oldfile.renameTo(newfile)){ 
      System.out.println("File renamed"); 
     }else{ 
      System.out.println("Sorry! the file can't be renamed"); 
     } 
3
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import static java.nio.file.StandardCopyOption.*; 

Path yourFile = Paths.get("path_to_your_file\text.txt"); 

Files.move(yourFile, yourFile.resolveSibling("text1.txt")); 

Para reemplazar un archivo existente con el nombre "Text1.txt":

Files.move(yourFile, yourFile.resolveSibling("text1.txt"),REPLACE_EXISTING); 
0
Files.move(file.toPath(), fileNew.toPath()); 

obras, pero sólo cuando se cierra (o autoclose) todos los recursos utilizados (InputStream, FileOutputStream etc.) creo que la misma situación con file.renameTo o FileUtils.moveFile.

-2

El código de ejecución está aquí.

private static void renameFile(File fileName) { 

    FileOutputStream fileOutputStream =null; 

    BufferedReader br = null; 
    FileReader fr = null; 

    String newFileName = "yourNewFileName" 

    try { 
     fileOutputStream = new FileOutputStream(newFileName); 

     fr = new FileReader(fileName); 
     br = new BufferedReader(fr); 

     String sCurrentLine; 

     while ((sCurrentLine = br.readLine()) != null) { 
      fileOutputStream.write(("\n"+sCurrentLine).getBytes()); 
     } 

     fileOutputStream.flush(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      fileOutputStream.close(); 
      if (br != null) 
       br.close(); 

      if (fr != null) 
       fr.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 
+2

Por lo general, es mejor explicar una solución en lugar de simplemente publicar algunas filas de código anónimo. Puede leer [Cómo escribo una buena respuesta] (https://stackoverflow.com/help/how-to-answer), y también [Explicar respuestas totalmente basadas en código] (https://meta.stackexchange.com/questions/114762/explaining-entirely-% E2% 80% 8C% E2% 80% 8B answers-based-answers) –

+0

La copia y el cambio de nombre suelen ser operaciones diferentes, por lo que creo que debe marcarse claramente que se trata de una copia. Lo cual también es innecesario, ya que copia caracteres y no bytes. –

Cuestiones relacionadas