Renombrar un archivo usando Java


174

¿Podemos cambiar el nombre de un archivo test.txtpara decir test1.txt?

Si test1.txtexiste, ¿cambiará el nombre?

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


66
Su último párrafo no describe una operación de cambio de nombre. Describe una operación de agregar.
Marqués de Lorne

Respuestas:


173

Copiado de 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 agregar al nuevo archivo:

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

24
Este código no funcionará en todos los casos o plataformas. El cambio de nombre al método no es confiable: stackoverflow.com/questions/1000183/…
Stephane Grenier

Solo la Pathforma funciona para mí, renameTosiempre devuelve falso. Verifique la respuesta de kr37 o esta respuesta
andras

107

En breve:

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

Mas detalle:

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

Lo siguiente se copia directamente de http://docs.oracle.com/javase/7/docs/api/index.html :

Supongamos que queremos 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 a un nuevo directorio, manteniendo el mismo nombre de archivo y reemplazando cualquier archivo existente de 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
Path es una interfaz cuyas únicas implementaciones son WindowsPath, ZipPath y AbstractPath. ¿Será esto un problema para implementaciones multiplataforma?
Caelum

1
Hola @ user2104648, aquí ( tutorials.jenkov.com/java-nio/path.html ) es un ejemplo sobre cómo podría manejar los archivos en un entorno Linux. Básicamente, debe usar java.nio.file.Paths.get (somePath) en lugar de usar una de las implementaciones que ha mencionado
maxivis

2
¿Qué es Path source = ...?
Koray Tugay

@ kr37 respuesta perfecta!
gaurav

30

Desea 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 Archivo para que el archivo se mueva. llame al método renameTo en el archivo para moverlo y verifique 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. Según la extensión, parece que es texto sin formato, por lo que miraría FileWriter .


9
Ni idea, pero es exactamente el mismo que Pierre ha publicado, sin el código fuente ...
Thomas Owens

28

Para Java 1.6 y versiones inferiores, creo que la API más segura y limpia para esto es Guava's 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 sea el mismo directorio, es decir, el directorio padre del archivo anterior.

EDITAR: Escribí esto antes de comenzar a usar Java 7, que introdujo un enfoque muy similar. Entonces, si está utilizando Java 7+, debería ver y votar la respuesta de kr37.


18

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

13

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

5
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);

5

Prueba esto

File file=new File("Your File");
boolean renameResult = file.renameTo(new File("New Name"));
// todo: check renameResult

Nota: Siempre debemos verificar el valor de renameTo return para asegurarnos de que el archivo de cambio de nombre sea exitoso porque depende de la plataforma (sistema operativo diferente, sistema de archivos diferente) y no arroja una excepción IO si falla el cambio de nombre.


¿Cómo es esto diferente de la respuesta aceptada dada por Pierre 9 años antes?
Forraje

4

Sí, puedes usar File.renameTo (). Pero recuerde tener la ruta correcta al cambiar el nombre a un nuevo archivo.

import java.util.Arrays;
import java.util.List;

public class FileRenameUtility {
public static void main(String[] a) {
    System.out.println("FileRenameUtility");
    FileRenameUtility renameUtility = new FileRenameUtility();
    renameUtility.fileRename("c:/Temp");
}

private void fileRename(String folder){
    File file = new File(folder);
    System.out.println("Reading this "+file.toString());
    if(file.isDirectory()){
        File[] files = file.listFiles();
        List<File> filelist = Arrays.asList(files);
        filelist.forEach(f->{
           if(!f.isDirectory() && f.getName().startsWith("Old")){
               System.out.println(f.getAbsolutePath());
               String newName = f.getAbsolutePath().replace("Old","New");
               boolean isRenamed = f.renameTo(new File(newName));
               if(isRenamed)
                   System.out.println(String.format("Renamed this file %s to  %s",f.getName(),newName));
               else
                   System.out.println(String.format("%s file is not renamed to %s",f.getName(),newName));
           }
        });

    }
}

}



2

Hasta donde sé, cambiar el nombre de un archivo no agregará su contenido al de un archivo existente con el nombre de destino.

Para cambiar el nombre de un archivo en Java, consulte la documentación del renameTo()método en clase File.


1
Files.move(file.toPath(), fileNew.toPath()); 

funciona, pero solo cuando cierra (o cierra automáticamente) TODOS los recursos utilizados ( InputStream, FileOutputStreametc.) Creo que la misma situación con file.renameToo FileUtils.moveFile.


1

Aquí está mi código para cambiar el nombre de varios archivos en una carpeta con éxito:

public static void renameAllFilesInFolder(String folderPath, String newName, String extension) {
    if(newName == null || newName.equals("")) {
        System.out.println("New name cannot be null or empty");
        return;
    }
    if(extension == null || extension.equals("")) {
        System.out.println("Extension cannot be null or empty");
        return;
    }

    File dir = new File(folderPath);

    int i = 1;
    if (dir.isDirectory()) { // make sure it's a directory
        for (final File f : dir.listFiles()) {
            try {
                File newfile = new File(folderPath + "\\" + newName + "_" + i + "." + extension);

                if(f.renameTo(newfile)){
                    System.out.println("Rename succesful: " + newName + "_" + i + "." + extension);
                } else {
                    System.out.println("Rename failed");
                }
                i++;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

y ejecútalo por un ejemplo:

renameAllFilesInFolder("E:\\Downloads\\Foldername", "my_avatar", "gif");

-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 solo publicar algunas filas de código anónimo. Puedes leer ¿Cómo escribo una buena respuesta , y también Explicar respuestas completamente basadas en código
Anh Pham

Copiar y renombrar suelen ser operaciones diferentes, por lo que creo que debería estar claramente marcado que se trata de una copia. Lo que también es innecesariamente lento ya que copia caracteres y no bytes.
Joel Klinghed
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.