Rinomina un file usando Java


174

Possiamo rinominare un file dire test.txta test1.txt?

Se test1.txtesiste rinominerà?

Come posso rinominarlo nel file test1.txt già esistente in modo che i nuovi contenuti di test.txt vengano aggiunti ad esso per un uso successivo?


6
L'ultimo paragrafo non descrive affatto un'operazione di ridenominazione. Descrive un'operazione di aggiunta.
Marchese di Lorne,

Risposte:


173

Copiato da 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
}

Per aggiungere al nuovo file:

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

24
Questo codice non funzionerà in tutti i casi o piattaforme. La ridenominazione in metodo non è affidabile: stackoverflow.com/questions/1000183/…
Stephane Grenier,

Solo il Pathmodo in cui funziona per me, renameTorestituisce sempre false. Controlla la risposta di kr37 o questa risposta
andras

107

In breve:

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

Più dettaglio:

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

Quanto segue viene copiato direttamente da http://docs.oracle.com/javase/7/docs/api/index.html :

Supponiamo di voler rinominare un file in "newname", mantenendo il file nella stessa directory:

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

In alternativa, supponiamo di voler spostare un file in una nuova directory, mantenendo lo stesso nome file e sostituendo qualsiasi file esistente con quel nome nella directory:

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

1
Path è un'interfaccia le cui uniche implementazioni sono WindowsPath, ZipPath e AbstractPath. Sarà un problema per le implementazioni multipiattaforma?
Caelum,

1
Ciao @ user2104648, qui ( tutorials.jenkov.com/java-nio/path.html ) è un esempio di come è possibile gestire i file in ambiente Linux. Fondamentalmente, devi usare java.nio.file.Paths.get (somePath) invece di usare una delle implementazioni che hai citato
maxivis,

2
Che cos'è Path source = ...?
Koray Tugay,

@ kr37 risposta impeccabile!
gaurav,

30

Si desidera utilizzare il metodo renameTo su un oggetto File .

Innanzitutto, crea un oggetto File per rappresentare la destinazione. Controlla se quel file esiste. Se non esiste, creare un nuovo oggetto File per il file da spostare. chiama il metodo renameTo sul file da spostare e controlla il valore restituito da renameTo per vedere se la chiamata è andata a buon fine.

Se si desidera aggiungere il contenuto di un file a un altro, sono disponibili numerosi scrittori. Basato sull'estensione, sembra che sia un testo semplice, quindi vorrei guardare FileWriter .


9
Nessuna idea, ma è esattamente la stessa cosa che Pierre ha pubblicato, senza il codice sorgente ...
Thomas Owens,

28

Per Java 1.6 e versioni precedenti , credo che l'API più sicura e pulita per questo sia Files.move di Guava .

Esempio:

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

La prima riga si assicura che la posizione del nuovo file sia la stessa directory, ovvero la directory principale del vecchio file.

EDIT: ho scritto questo prima di iniziare a utilizzare Java 7, che ha introdotto un approccio molto simile. Quindi se stai usando Java 7+, dovresti vedere e migliorare la risposta di kr37.


18

Rinominare il file spostandolo su un nuovo nome. (FileUtils proviene da 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

Questo è un modo semplice per rinominare un file:

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

Per sostituire un file esistente con il nome "text1.txt":

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

5

Prova questo

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

Nota: dovremmo sempre controllare il valore renamePer restituire il file per assicurarci che il file rinominato abbia successo perché dipende dalla piattaforma (sistema operativo diverso, file system diverso) e non genera eccezioni IO se la ridenominazione fallisce.


In che modo differisce dalla risposta accettata data da Pierre 9 anni prima?
Foraggio

4

Sì, è possibile utilizzare File.renameTo (). Ma ricorda di avere il percorso corretto durante la ridenominazione in un nuovo file.

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

Per quanto ne so, rinominare un file non aggiungerà il suo contenuto a quello di un file esistente con il nome di destinazione.

Informazioni sulla ridenominazione di un file in Java, consultare la documentazione per il renameTo()metodo in classe File.


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

funziona, ma solo quando chiudi (o chiudi automaticamente) TUTTE le risorse utilizzate ( InputStream, FileOutputStreamecc.) Penso che la stessa situazione con file.renameToo FileUtils.moveFile.


1

Ecco il mio codice per rinominare più file in una cartella correttamente:

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

}

ed eseguilo per un esempio:

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

-2

Il codice di esecuzione è qui.

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
Di solito è meglio spiegare una soluzione invece di pubblicare solo alcune righe di codice anonimo. Puoi leggere Come posso scrivere una buona risposta , e anche Spiegare risposte interamente basate sul codice
Anh Pham,

La copia e la ridenominazione di solito sono operazioni diverse, quindi penso che dovrebbe essere chiaramente indicato che si tratta di una copia. Anche questo risulta essere inutile e lento in quanto copia caratteri e non byte.
Joel Klinghed,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.