Zmień nazwę pliku, używając języka Java

174

Możemy zmienić nazwę pliku powiedzenia test.txtdo test1.txt?

Jeśli test1.txt istnieje, czy zmieni nazwę?

Jak zmienić nazwę na już istniejący plik test1.txt, aby nowa zawartość pliku test.txt została dodana do niego w celu późniejszego wykorzystania?

JonasCz - Przywróć Monikę
źródło
6
Twój ostatni akapit w ogóle nie opisuje operacji zmiany nazwy. Opisuje operację dołączania.
Markiz Lorne

Odpowiedzi:

173

Skopiowano z 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
}

Aby dołączyć do nowego pliku:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/);
Pierre
źródło
24
Ten kod nie będzie działał we wszystkich przypadkach lub na wszystkich platformach. Zmiana nazwy na metodę nie jest wiarygodna: stackoverflow.com/questions/1000183/…
Stephane Grenier
Tylko Pathsposób działa dla mnie, renameTozawsze zwraca fałsz. Zaznacz odpowiedź kr37 lub tę odpowiedź
andras
107

W skrócie:

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

Więcej szczegółów:

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

Poniższe dane są kopiowane bezpośrednio z http://docs.oracle.com/javase/7/docs/api/index.html :

Załóżmy, że chcemy zmienić nazwę pliku na „nowa nazwa”, pozostawiając plik w tym samym katalogu:

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

Alternatywnie, załóżmy, że chcemy przenieść plik do nowego katalogu, zachowując tę ​​samą nazwę pliku i zastępując istniejący plik o tej nazwie w katalogu:

Path source = Paths.get("from/path");
Path newdir = Paths.get("to/path");
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING);
37 kr
źródło
1
Path to interfejs, którego jedynymi implementacjami są WindowsPath, ZipPath i AbstractPath. Czy będzie to problem w przypadku wdrożeń wieloplatformowych?
Caelum
1
Cześć @ user2104648, tutaj ( tutorials.jenkov.com/java-nio/path.html ) jest przykładem tego, jak możesz obsłużyć pliki w środowisku Linux. Zasadniczo musisz użyć java.nio.file.Paths.get (somePath) zamiast jednej z wymienionych implementacji
maxivis
2
Co to jest Path source = ...?
Koray Tugay,
@ kr37 bezbłędna odpowiedź!
gaurav
30

Chcesz użyć metody renameTo na obiekcie File .

Najpierw utwórz obiekt File, który będzie reprezentował miejsce docelowe. Sprawdź, czy ten plik istnieje. Jeśli nie istnieje, utwórz nowy obiekt File dla pliku do przeniesienia. wywołaj metodę renameTo na przenoszonym pliku i sprawdź zwróconą wartość z renameTo, aby sprawdzić, czy wywołanie zakończyło się pomyślnie.

Jeśli chcesz dołączyć zawartość jednego pliku do drugiego, dostępnych jest kilka programów do zapisu. Na podstawie rozszerzenia brzmi to jak zwykły tekst, więc spojrzałbym na FileWriter .

Thomas Owens
źródło
9
Nie mam pojęcia, ale to jest dokładnie to samo, że Pierre pisał, bez kodu źródłowego ...
Thomas Owens
28

Uważam, że dla Java 1.6 i starszych najbezpieczniejszym i najczystszym interfejsem API jest Guava's Files.move .

Przykład:

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

Pierwsza linia zapewnia, że ​​lokalizacja nowego pliku jest tym samym katalogiem, tj. Katalogiem nadrzędnym starego pliku.

EDYCJA: Napisałem to zanim zacząłem używać Javy 7, która wprowadziła bardzo podobne podejście. Więc jeśli używasz Java 7+, powinieneś zobaczyć i zagłosować odpowiedź kr37.

Zoltán
źródło
18

Zmiana nazwy pliku poprzez przeniesienie go do nowej nazwy. (FileUtils pochodzi z 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
źródło
13

To prosty sposób na zmianę nazwy pliku:

        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
źródło
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"));

Aby zastąpić istniejący plik nazwą „tekst1.txt”:

Files.move(yourFile, yourFile.resolveSibling("text1.txt"),REPLACE_EXISTING);
Kirill Ch
źródło
5

Spróbuj tego

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

Uwaga: Zawsze powinniśmy sprawdzać zwracaną wartość renameTo, aby upewnić się, że zmiana nazwy pliku zakończyła się pomyślnie, ponieważ jest zależna od platformy (inny system operacyjny, inny system plików) i nie zgłasza wyjątku we / wy, jeśli zmiana nazwy nie powiedzie się.

anoopknr
źródło
Czym różni się to od przyjętej odpowiedzi udzielonej przez Pierre'a 9 lat wcześniej?
Pasza
4

Tak, możesz użyć File.renameTo (). Pamiętaj jednak, aby mieć poprawną ścieżkę podczas zmiany nazwy pliku na nowy.

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
źródło
2

O ile wiem, zmiana nazwy pliku nie spowoduje dodania jego zawartości do istniejącego pliku o nazwie docelowej.

O zmianie nazwy pliku w Javie, zobacz dokumentację dla renameTo()metody w klasie File.

Yuval
źródło
1
Files.move(file.toPath(), fileNew.toPath()); 

prace, ale tylko wtedy, gdy jesteś blisko (lub AutoClose) Wszystkie wykorzystane zasoby ( InputStream, FileOutputStreametc.) Myślę, że tę samą sytuację z file.renameTolub FileUtils.moveFile.

Zhurov Konstantin
źródło
1

Oto mój kod, aby pomyślnie zmienić nazwę wielu plików w folderze:

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

}

i uruchom go na przykład:

renameAllFilesInFolder("E:\\Downloads\\Foldername", "my_avatar", "gif");
Tạ Anh Tú
źródło
-2

Uruchomiony kod jest tutaj.

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
źródło
2
Zwykle lepiej jest wyjaśnić rozwiązanie, zamiast po prostu publikować kilka wierszy anonimowego kodu. Możesz przeczytać Jak napisać dobrą odpowiedź , a także wyjaśnić odpowiedzi całkowicie oparte na kodzie
Anh Pham
Kopiowanie i zmiana nazwy są zwykle różnymi operacjami, więc myślę, że należy wyraźnie zaznaczyć, że jest to kopia. Co również jest niepotrzebnie powolne, ponieważ kopiuje znaki, a nie bajty.
Joel Klinghed