Đổi tên một tệp bằng Java


173

Chúng ta có thể đổi tên một tập tin nói test.txtvới test1.txt?

Nếu test1.txttồn tại nó sẽ đổi tên?

Làm cách nào để đổi tên nó thành tệp test1.txt đã có để nội dung mới của test.txt được thêm vào để sử dụng sau này?


6
Đoạn cuối của bạn không mô tả một hoạt động đổi tên nào cả. Nó mô tả một hoạt động chắp thêm.
Hầu tước Lorne

Câu trả lời:


172

Sao chép từ http://examplingepot.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
}

Để thêm vào tập tin mới:

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

24
Mã này sẽ không hoạt động trong mọi trường hợp hoặc nền tảng. Việc đổi tên thành phương thức không đáng tin cậy: stackoverflow.com/questions/1000183/
Stephane Grenier

Chỉ có Pathcách làm việc cho tôi, renameToluôn trả về sai. Hãy đánh dấu câu trả lời của kr37 hoặc câu trả lời này
Andras

107

Nói ngắn gọn:

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

Chi tiết hơn:

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

Sau đây được sao chép trực tiếp từ http://docs.oracle.com/javase/7/docs/api/index.html :

Giả sử chúng ta muốn đổi tên một tệp thành "newname", giữ tệp trong cùng một thư mục:

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

Ngoài ra, giả sử chúng tôi muốn di chuyển một tệp sang thư mục mới, giữ cùng tên tệp và thay thế bất kỳ tệp hiện có của tên đó trong thư mục:

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

1
Đường dẫn là một giao diện mà việc triển khai duy nhất là WindowsPath, ZipPath và AbstractPath. Đây sẽ là một vấn đề cho việc triển khai đa nền tảng?
Caelum

1
Hi @ user2104648, đây ( tutorials.jenkov.com/java-nio/path.html ) là một ví dụ về cách bạn có thể xử lý các tập tin trong môi trường Linux. Về cơ bản, bạn cần sử dụng java.nio.file.Paths.get (somePath) thay vì sử dụng một trong những triển khai bạn đã đề cập
maxivis

2
Nguồn đường dẫn = ... là gì?
Koray Tugay

@ kr37 câu trả lời hoàn hảo!
gaurav

30

Bạn muốn sử dụng phương thức renameTo trên một đối tượng Tệp .

Đầu tiên, tạo một đối tượng File để thể hiện đích. Kiểm tra xem nếu tập tin đó tồn tại. Nếu nó không tồn tại, tạo một đối tượng Tệp mới cho tệp sẽ được di chuyển. gọi phương thức renameTo trên tệp sẽ được di chuyển và kiểm tra giá trị được trả về từ renameTo để xem cuộc gọi có thành công hay không.

Nếu bạn muốn nối các nội dung của tập tin này với tập tin khác, có một số nhà văn có sẵn. Dựa trên phần mở rộng, có vẻ như đó là văn bản đơn giản, vì vậy tôi sẽ xem FileWriter .


9
Không biết, nhưng đó chính xác là điều mà Pierre đã đăng, không có mã nguồn ...
Thomas Owens

28

Đối với Java 1.6 trở xuống, tôi tin rằng API an toàn và sạch nhất cho việc này là Files.move của Guava .

Thí dụ:

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

Dòng đầu tiên đảm bảo rằng vị trí của tệp mới là cùng một thư mục, tức là thư mục mẹ của tệp cũ.

EDIT: Tôi đã viết điều này trước khi tôi bắt đầu sử dụng Java 7, nó đã giới thiệu một cách tiếp cận rất giống nhau. Vì vậy, nếu bạn đang sử dụng Java 7+, bạn sẽ thấy và nâng cấp câu trả lời của kr37.


18

Đổi tên tập tin bằng cách di chuyển nó sang một tên mới. (FileUtils là từ 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

Đây là một cách dễ dàng để đổi tên một tệp:

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

Để thay thế một tệp hiện có bằng tên "text1.txt":

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

5

Thử cái này

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

Lưu ý: Chúng ta phải luôn kiểm tra giá trị đổi tên Để trả về để đảm bảo đổi tên tệp thành công vì nó phụ thuộc vào nền tảng (hệ điều hành khác, hệ thống tệp khác) và nó không ném ngoại lệ IO nếu đổi tên không thành công.


Làm thế nào khác với câu trả lời được chấp nhận được đưa ra bởi Pierre 9 năm trước?
Thức ăn gia súc

4

Có, bạn có thể sử dụng File.renameTo (). Nhưng hãy nhớ có đường dẫn chính xác trong khi đổi tên nó thành một tệp mới.

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

Theo như tôi biết, việc đổi tên một tệp sẽ không nối thêm nội dung của nó với tệp hiện có với tên đích.

Về việc đổi tên một tệp trong Java, hãy xem tài liệu về renameTo()phương thức trong lớp File.


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

hoạt động, nhưng chỉ khi bạn đóng (hoặc tự động đóng) TẤT CẢ các tài nguyên đã sử dụng ( InputStream, FileOutputStreamv.v.) tôi nghĩ tình huống tương tự với file.renameTohoặc FileUtils.moveFile.


1

Đây là mã của tôi để đổi tên nhiều tệp trong một thư mục thành công:

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

}

và chạy nó cho một ví dụ:

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

-2

Chạy mã ở đây.

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
Thông thường tốt hơn là giải thích một giải pháp thay vì chỉ đăng một số hàng mã ẩn danh. Bạn có thể đọc Làm thế nào để tôi viết một câu trả lời hay và cũng Giải thích các câu trả lời hoàn toàn dựa trên mã
Anh Phạm

Sao chép và đổi tên thường là các hoạt động khác nhau vì vậy tôi nghĩ cần đánh dấu rõ ràng rằng đây là bản sao. Điều này cũng xảy ra là chậm không cần thiết vì nó sao chép các ký tự và không phải byte.
Joel Klinghed
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.