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?

JonasCz - Restablece a Monica
fuente
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*/);
Pierre
fuente
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);
kr37
fuente
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 .

Thomas Owens
fuente
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.

Zoltán
fuente
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();
  }
Brandon
fuente
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");
        }
mayor
fuente
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);
Kirill Ch
fuente
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.

anoopknr
fuente
¿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));
           }
        });

    }
}

}

V1ma-8
fuente
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.

Yuval
fuente
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.

Zhurov Konstantin
fuente
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");
Tạ Anh Tú
fuente
-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();
        }
    }
}
Dinesh Kumar
fuente
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