Benennen Sie eine Datei mit Java um

173

Können wir eine Datei umbenennen sagen test.txtzu test1.txt?

Wenn test1.txtvorhanden, wird es umbenannt?

Wie benenne ich es in die bereits vorhandene Datei test1.txt um, damit der neue Inhalt von test.txt zur späteren Verwendung hinzugefügt wird?

JonasCz - Monica wieder einsetzen
quelle
6
Ihr letzter Absatz beschreibt überhaupt keine Umbenennungsoperation. Es beschreibt eine Append-Operation.
Marquis von Lorne

Antworten:

172

Kopiert von 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
}

So hängen Sie an die neue Datei an:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/);
Pierre
quelle
24
Dieser Code funktioniert nicht in allen Fällen oder auf allen Plattformen. Die Umbenennung in Methode ist nicht zuverlässig: stackoverflow.com/questions/1000183/…
Stephane Grenier
Nur der PathWeg funktioniert bei mir, gibt renameToimmer falsch zurück. Überprüfen Sie entweder die Antwort von kr37 oder diese Antwort
andras
107

Zusamenfassend:

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

Mehr Details:

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

Folgendes wird direkt von http://docs.oracle.com/javase/7/docs/api/index.html kopiert :

Angenommen, wir möchten eine Datei in "neuer Name" umbenennen und die Datei im selben Verzeichnis belassen:

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

Angenommen, wir möchten eine Datei in ein neues Verzeichnis verschieben, denselben Dateinamen beibehalten und alle vorhandenen Dateien mit diesem Namen im Verzeichnis ersetzen:

Path source = Paths.get("from/path");
Path newdir = Paths.get("to/path");
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING);
kr37
quelle
1
Path ist eine Schnittstelle, deren einzige Implementierungen WindowsPath, ZipPath und AbstractPath sind. Wird dies ein Problem für plattformübergreifende Implementierungen sein?
Caelum
1
Hallo @ user2104648, hier ( tutorials.jenkov.com/java-nio/path.html ) ist ein Beispiel, wie Sie mit den Dateien in einer Linux-Umgebung umgehen können. Grundsätzlich müssen Sie java.nio.file.Paths.get (somePath) verwenden, anstatt eine der von Ihnen erwähnten Implementierungen zu verwenden
maxivis
2
Was ist Pfadquelle = ...?
Koray Tugay
@ kr37 makellose Antwort!
Gaurav
30

Sie möchten die Methode renameTo für ein Dateiobjekt verwenden .

Erstellen Sie zunächst ein Dateiobjekt, um das Ziel darzustellen. Überprüfen Sie, ob diese Datei vorhanden ist. Wenn es nicht vorhanden ist, erstellen Sie ein neues Dateiobjekt für die zu verschiebende Datei. Rufen Sie die renameTo-Methode für die zu verschiebende Datei auf und überprüfen Sie den von renameTo zurückgegebenen Wert, um festzustellen, ob der Aufruf erfolgreich war.

Wenn Sie den Inhalt einer Datei an eine andere anhängen möchten, stehen eine Reihe von Autoren zur Verfügung. Basierend auf der Erweiterung klingt es so, als wäre es einfacher Text, also würde ich mir den FileWriter ansehen .

Thomas Owens
quelle
9
Keine Ahnung, aber es ist genau das gleiche, was Pierre gepostet hat, ohne den Quellcode ...
Thomas Owens
28

Für Java 1.6 und niedriger glaube ich, dass Guavas Files.move die sicherste und sauberste API dafür ist .

Beispiel:

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

In der ersten Zeile wird sichergestellt, dass der Speicherort der neuen Datei dasselbe Verzeichnis ist, dh das übergeordnete Verzeichnis der alten Datei.

EDIT: Ich habe dies geschrieben, bevor ich anfing, Java 7 zu verwenden, was einen sehr ähnlichen Ansatz einführte. Wenn Sie also Java 7+ verwenden, sollten Sie die Antwort von kr37 sehen und bewerten.

Zoltán
quelle
18

Umbenennen der Datei durch Verschieben in einen neuen Namen. (FileUtils stammt von 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
quelle
13

Dies ist eine einfache Möglichkeit, eine Datei umzubenennen:

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

So ersetzen Sie eine vorhandene Datei durch den Namen "text1.txt":

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

Versuche dies

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

Hinweis: Wir sollten immer den Rückgabewert renameTo überprüfen, um sicherzustellen, dass die Umbenennungsdatei erfolgreich ist, da sie plattformabhängig ist (anderes Betriebssystem, anderes Dateisystem) und keine E / A-Ausnahme auslöst, wenn das Umbenennen fehlschlägt.

anoopknr
quelle
Wie unterscheidet sich das von der akzeptierten Antwort, die Pierre vor 9 Jahren gegeben hat?
Futter
4

Ja, Sie können File.renameTo () verwenden. Denken Sie jedoch daran, beim Umbenennen in eine neue Datei den richtigen Pfad anzugeben.

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
quelle
2

Soweit ich weiß, wird beim Umbenennen einer Datei der Inhalt nicht an den einer vorhandenen Datei mit dem Zielnamen angehängt.

Informationen zum Umbenennen einer Datei in Java finden Sie in der Dokumentation zur renameTo()Methode in der Klasse File.

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

funktioniert, aber nur , wenn Sie in der Nähe (oder Autoclose) Alle verwendeten Ressourcen ( InputStream, FileOutputStreametc.) Ich denke , die gleiche Situation mit file.renameTooder FileUtils.moveFile.

Zhurov Konstantin
quelle
1

Hier ist mein Code zum erfolgreichen Umbenennen mehrerer Dateien in einem Ordner:

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

}

und führen Sie es für ein Beispiel aus:

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

Laufender Code ist hier.

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
quelle
2
Normalerweise ist es besser, eine Lösung zu erklären, als nur einige Zeilen anonymen Codes zu veröffentlichen. Sie können lesen, wie ich eine gute Antwort schreibe und auch vollständig codebasierte Antworten
erkläre
Kopieren und Umbenennen sind normalerweise unterschiedliche Vorgänge, daher sollte deutlich gemacht werden, dass es sich um eine Kopie handelt. Das ist auch unnötig langsam, da es Zeichen und keine Bytes kopiert.
Joel Klinghed