2009-07-21 80 views
127

Chúng tôi có thể đổi tên tệp cho biết test.txt thành test1.txt không?Đổi tên một tệp bằng cách sử dụng Java

Nếu có test1.txt thì tên đó có đổi tên không?

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

+4

Đoạn cuối cùng của bạn không mô tả hoạt động đổi tên. Nó mô tả một hoạt động nối thêm. – EJP

Trả lời

2

Theo tôi biết, việc đổi tên tệp sẽ không thêm nội dung của tệp vào nội dung của tệp hiện có với tên mục tiêu.

Giới thiệu về cách đổi tên tệp trong Java, xem documentation cho phương thức renameTo() trong lớp File.

26

Bạn muốn sử dụng phương pháp renameTo trên đối tượng File.

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

Nếu bạn muốn chắp thêm nội dung của tệp này sang tệp khác, có một số nhà văn có sẵn. Dựa trên phần mở rộng, nó có vẻ như đó là văn bản thuần túy, vì vậy tôi sẽ xem xét FileWriter.

+2

Và có gì sai với điều này? –

+2

Điều này được giảm giá? Tại sao? – Mnementh

+6

Không có ý tưởng, nhưng đó là chính xác điều mà Pierre đăng, mà không có mã nguồn ... –

141

sao chép từ 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 
} 

Để thêm vào file mới:

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

Mã này sẽ không hoạt động trong mọi trường hợp hoặc nền tảng. Đổi tên thành phương thức không đáng tin cậy: http://stackoverflow.com/questions/1000183/reliable-file-renameto-alternative-on-windows –

+0

Chỉ cần thử. Không thể làm việc. –

15

Đổi tên tệp bằng cách di chuyển tệp sang 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(); 
    } 
22

Đối với Java 1.6 và thấp hơn, tôi tin rằng các API an toàn nhất và sạch nhất cho điều này là ổi của Files.move.

Ví 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 tin mới là cùng một thư mục, ví dụ: thư mục mẹ của tập tin cũ.

EDIT: Tôi đã viết điều này trước khi tôi bắt đầu sử dụng Java 7, 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à upvote câu trả lời của kr37.

64

Nói tóm lại:

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

Xem chi tiết:

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

Sau đây là 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 tin vào "newname", giữ 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 ta muốn di chuyển một tập tin vào thư mục mới, giữ tên tập tin giống nhau, và thay thế bất kỳ tập tin 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à giao diện chỉ triển khai WindowsPath, ZipPath và AbstractPath. Đây có phải là một vấn đề đối với việc triển khai đa nền tảng không? – Caelum

+1

Hi @ user2104648, tại đây (http://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 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 các triển khai mà bạn đã đề cập đến – maxivis

+1

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

8

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

 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"); 
     } 
3
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 tin hiện có với cái tên "text1.txt":

Files.move(yourFile, yourFile.resolveSibling("text1.txt"),REPLACE_EXISTING); 
0
Files.move(file.toPath(), fileNew.toPath()); 

công trình, nhưng chỉ khi bạn đóng (hoặc Tự động đóng) TẤT CẢ sử dụng các nguồn lực (InputStream, FileOutputStream vv) Tôi nghĩ tình huống tương tự với file.renameTo hoặc FileUtils.moveFile.

-2

Mã đang chạy ở đâ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ố dòng mã ẩn danh. Bạn có thể đọc [Làm cách nào để viết câu trả lời hay] (https://stackoverflow.com/help/how-to-answer) và [Giải thích toàn bộ câu trả lời dựa trên mã] (https://meta.stackexchange.com)/câu hỏi/114762/giải thích-hoàn toàn-% E2% 80% 8C% E2% 80% 8Bcode-based-answers) –

+0

Sao chép và đổi tên thường là các hoạt động khác nhau vì vậy tôi nghĩ rằng nó nên được đánh dấu rõ ràng rằng đây là một bản sao. Mà cũng xảy ra là không cần thiết chậm vì nó sao chép ký tự và không phải byte. –

Các vấn đề liên quan