Renommer un fichier à l'aide de Java

174

Peut - on renommer un exemple de fichier test.txtà test1.txt?

S'il test1.txtexiste, va-t-il renommer?

Comment puis-je le renommer en fichier test1.txt déjà existant afin que le nouveau contenu de test.txt y soit ajouté pour une utilisation ultérieure?

JonasCz - Réintégrer Monica
la source
6
Votre dernier paragraphe ne décrit pas du tout une opération de changement de nom. Il décrit une opération d'ajout.
Marquis of Lorne

Réponses:

173

Copié 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
}

Pour ajouter au nouveau fichier:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/);
Pierre
la source
24
Ce code ne fonctionnera pas dans tous les cas ou plates-formes. Le changement de nom en méthode n'est pas fiable: stackoverflow.com/questions/1000183/…
Stephane Grenier
Seule la Pathmanière fonctionne pour moi, renameToretourne toujours faux. Vérifiez la réponse de kr37 ou cette réponse
andras
107

En bref:

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

Plus de détails:

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

Ce qui suit est copié directement à partir de http://docs.oracle.com/javase/7/docs/api/index.html :

Supposons que nous voulions renommer un fichier en "nouveau nom", en gardant le fichier dans le même répertoire:

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

Sinon, supposons que nous souhaitons déplacer un fichier vers un nouveau répertoire, en conservant le même nom de fichier et en remplaçant tout fichier existant de ce nom dans le répertoire:

Path source = Paths.get("from/path");
Path newdir = Paths.get("to/path");
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING);
kr37
la source
1
Path est une interface dont les seules implémentations sont WindowsPath, ZipPath et AbstractPath. Est-ce que ce sera un problème pour les implémentations multi-plateformes?
Caelum
1
Salut @ user2104648, ici ( tutorials.jenkov.com/java-nio/path.html ) est un exemple sur la façon dont vous pourriez gérer les fichiers dans un environnement Linux. Fondamentalement, vous devez utiliser java.nio.file.Paths.get (somePath) au lieu d'utiliser l'une des implémentations que vous avez mentionnées
maxivis
2
Qu'est-ce que Path source = ...?
Koray Tugay
@ kr37 réponse impeccable!
gaurav le
30

Vous souhaitez utiliser la méthode renameTo sur un objet File .

Tout d'abord, créez un objet File pour représenter la destination. Vérifiez si ce fichier existe. S'il n'existe pas, créez un nouvel objet File pour le fichier à déplacer. appelez la méthode renameTo sur le fichier à déplacer et vérifiez la valeur renvoyée par renameTo pour voir si l'appel a réussi.

Si vous souhaitez ajouter le contenu d'un fichier à un autre, plusieurs graveurs sont disponibles. Basé sur l'extension, cela ressemble à du texte brut, donc je regarderais FileWriter .

Thomas Owens
la source
9
Aucune idée, mais c'est exactement la même chose que Pierre a postée, sans le code source ...
Thomas Owens
28

Pour Java 1.6 et inférieur, je pense que l'API la plus sûre et la plus propre pour cela est Files.move de Guava .

Exemple:

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

La première ligne s'assure que l'emplacement du nouveau fichier est le même répertoire, c'est-à-dire le répertoire parent de l'ancien fichier.

EDIT: J'ai écrit ceci avant de commencer à utiliser Java 7, qui a introduit une approche très similaire. Donc, si vous utilisez Java 7+, vous devriez voir et voter pour la réponse de kr37.

Zoltán
la source
18

Renommer le fichier en le déplaçant vers un nouveau nom. (FileUtils provient de la librairie Apache Commons IO)

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

  try {
    FileUtils.moveFile(oldFile, newFile);
  } catch (IOException e) {
    e.printStackTrace();
  }
Brandon
la source
13

C'est un moyen simple de renommer un fichier:

        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");
        }
Sénior
la source
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"));

Pour remplacer un fichier existant par le nom "text1.txt":

Files.move(yourFile, yourFile.resolveSibling("text1.txt"),REPLACE_EXISTING);
Kirill Ch
la source
5

Essaye ça

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

Remarque: Nous devons toujours vérifier la valeur de retour renameTo pour nous assurer que le changement de nom du fichier réussit car il dépend de la plate-forme (système d'exploitation différent, système de fichiers différent) et ne lève pas d'exception IO si le changement de nom échoue.

anoopknr
la source
En quoi est-ce différent de la réponse acceptée donnée par Pierre 9 ans plus tôt?
Fourrage le
4

Oui, vous pouvez utiliser File.renameTo (). Mais rappelez-vous d'avoir le chemin correct en le renommant en un nouveau fichier.

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
la source
2

Autant que je sache, renommer un fichier n'ajoutera pas son contenu à celui d'un fichier existant avec le nom cible.

À propos du changement de nom d'un fichier en Java, consultez la documentation de la renameTo()méthode dans la classe File.

Yuval
la source
1
Files.move(file.toPath(), fileNew.toPath()); 

fonctionne, mais seulement lorsque vous fermez (ou fermez automatiquement) TOUTES les ressources utilisées ( InputStream, FileOutputStreametc.) Je pense que la même situation avec file.renameToou FileUtils.moveFile.

Zhurov Konstantin
la source
1

Voici mon code pour renommer plusieurs fichiers dans un dossier avec succès:

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

}

et exécutez-le pour un exemple:

renameAllFilesInFolder("E:\\Downloads\\Foldername", "my_avatar", "gif");
Tạ Anh Tú
la source
-2

Le code en cours d'exécution est ici.

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
la source
2
Habituellement, il est préférable d'expliquer une solution au lieu de simplement publier quelques lignes de code anonyme. Vous pouvez lire Comment écrire une bonne réponse , et aussi expliquer les réponses entièrement basées sur le code
Anh Pham
Copier et renommer sont généralement des opérations différentes, donc je pense qu'il devrait être clairement indiqué qu'il s'agit d'une copie. Ce qui est également inutile car il copie des caractères et non des octets.
Joel Klinghed