Ganti nama file menggunakan Java

174

Bisakah kita mengubah nama file misalnya test.txtuntuk test1.txt?

Jika test1.txtada, apakah akan diganti namanya?

Bagaimana cara saya ganti nama menjadi file test1.txt yang sudah ada sehingga konten baru test.txt ditambahkan ke dalamnya untuk digunakan nanti?

JonasCz - Pasang kembali Monica
sumber
6
Paragraf terakhir Anda sama sekali tidak menjelaskan operasi ganti nama. Ini menjelaskan operasi penambahan.
Marquis of Lorne

Jawaban:

173

Disalin dari 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
}

Untuk menambahkan file baru:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/);
Pierre
sumber
24
Kode ini tidak akan berfungsi dalam semua kasus atau platform. Mengubah nama metode ini tidak dapat diandalkan: stackoverflow.com/questions/1000183/...
Stephane Grenier
Hanya Pathcara yang bekerja untuk saya, renameToselalu mengembalikan false. Periksa baik jawaban kr37 atau jawaban ini
andras
107

Pendeknya:

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

Lebih detail:

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

Berikut ini disalin langsung dari http://docs.oracle.com/javase/7/docs/api/index.html :

Misalkan kita ingin mengganti nama file menjadi "nama baru", menyimpan file di direktori yang sama:

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

Sebagai alternatif, misalkan kita ingin memindahkan file ke direktori baru, menyimpan nama file yang sama, dan mengganti file yang ada dari nama itu di direktori:

Path source = Paths.get("from/path");
Path newdir = Paths.get("to/path");
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING);
Kr37
sumber
1
Path adalah antarmuka yang implementasinya hanya WindowsPath, ZipPath, dan AbstractPath. Apakah ini akan menjadi masalah untuk implementasi multi-platform?
Caelum
1
Hai @ user2104648, di sini ( tutorials.jenkov.com/java-nio/path.html ) adalah contoh tentang bagaimana Anda bisa menangani file di lingkungan Linux. Pada dasarnya, Anda perlu menggunakan java.nio.file.Paths.get (somePath) alih-alih menggunakan salah satu implementasi yang Anda sebutkan
maxivis
2
Apakah sumber Path = ...?
Koray Tugay
@rr37 jawaban sempurna!
gaurav
30

Anda ingin memanfaatkan metode renameTo pada objek File .

Pertama, buat objek File untuk mewakili tujuan. Periksa untuk melihat apakah file itu ada. Jika tidak ada, buat objek File baru untuk file yang akan dipindahkan. panggil metode renameTo pada file yang akan dipindahkan, dan periksa nilai yang dikembalikan dari renameTo untuk melihat apakah panggilan berhasil.

Jika Anda ingin menambahkan konten dari satu file ke file lain, ada sejumlah penulis yang tersedia. Berdasarkan ekstensi, sepertinya itu teks biasa, jadi saya akan melihat FileWriter .

Thomas Owens
sumber
9
Tidak tahu, tapi itu hal yang sama persis bahwa Pierre diposting, tanpa kode sumber ...
Thomas Owens
28

Untuk Java 1.6 dan lebih rendah, saya percaya API teraman dan terbersih untuk ini adalah Filesvaove Guava .

Contoh:

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

Baris pertama memastikan bahwa lokasi file baru adalah direktori yang sama, yaitu direktori induk dari file lama.

EDIT: Saya menulis ini sebelum saya mulai menggunakan Java 7, yang memperkenalkan pendekatan yang sangat mirip. Jadi jika Anda menggunakan Java 7+, Anda akan melihat dan meningkatkan jawaban kr37.

Zoltán
sumber
18

Mengganti nama file dengan memindahkannya ke nama baru. (FileUtils berasal dari 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
sumber
13

Ini adalah cara mudah untuk mengganti nama 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");
        }
senior
sumber
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"));

Untuk mengganti file yang ada dengan nama "text1.txt":

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

Coba ini

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

Catatan: Kita harus selalu memeriksa nilai pengembalian namaUntuk memastikan file rename berhasil karena tergantung platform (sistem operasi berbeda, sistem file berbeda) dan tidak membuang pengecualian IO jika penggantian nama gagal.

anoopknr
sumber
Bagaimana ini berbeda dari jawaban yang diterima yang diberikan oleh Pierre 9 tahun sebelumnya?
Hijauan
4

Ya, Anda dapat menggunakan File.renameTo (). Tapi ingat untuk memiliki jalur yang benar saat mengganti nama ke file baru.

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

Sejauh yang saya tahu, mengubah nama file tidak akan menambahkan kontennya ke file yang ada dengan nama target.

Tentang mengganti nama file di Java, lihat dokumentasi untuk renameTo()metode di kelas File.

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

berfungsi, tetapi hanya ketika Anda menutup (atau autoclose) SEMUA sumber daya yang digunakan ( InputStream, FileOutputStreamdll.) Saya pikir situasi yang sama dengan file.renameToatau FileUtils.moveFile.

Zhurov Konstantin
sumber
1

Ini kode saya untuk mengganti nama beberapa file dalam folder dengan sukses:

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

}

dan jalankan sebagai contoh:

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

Kode yang sedang berjalan ada di sini.

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
sumber
2
Biasanya lebih baik untuk menjelaskan solusi daripada hanya memposting beberapa baris kode anonim. Anda dapat membaca Bagaimana cara menulis jawaban yang baik , dan juga Menjelaskan jawaban sepenuhnya berdasarkan kode
Anh Pham
Salin dan ganti nama biasanya operasi yang berbeda, jadi saya pikir harus ditandai dengan jelas bahwa ini adalah salinan. Yang juga terjadi lambat tidak perlu karena menyalin karakter dan bukan byte.
Joel Klinghed