cách xóa nội dung của tệp văn bản mà không xóa chính nó


89

Tôi muốn sao chép nội dung của tệp 'A' sang tệp 'B'. Sau khi sao chép xong, tôi muốn xóa nội dung của tập tin 'A' và muốn ghi vào nó từ đầu. Tôi không thể xóa tệp 'A' vì nó liên quan đến một số tác vụ khác.

Tôi đã có thể sao chép nội dung bằng cách sử dụng API tệp của java (readLine ()), nhưng không biết cách xóa nội dung của tệp và đặt con trỏ tệp ở đầu tệp.

Câu trả lời:


134

Chỉ cần in một chuỗi trống vào tệp:

PrintWriter writer = new PrintWriter(file);
writer.print("");
writer.close();

14
Việc ghi là không cần thiết và nếu một tác vụ khác có tệp đang mở thì việc mở đó thậm chí có thể không thực hiện được.
Marquis of Lorne

riter.close ??, chúng tôi đang ở trong năm 2017 !!!. Ngoài ra, không cần in (""), vì văn bản sẽ bị ghi đè
FSm 16/02/17

1
@Andro, để ý dấu thời gian và các thẻ? Hồi đó, tôi nhớ đó là cách đáng tin cậy nhất để làm trống một tệp trên các thiết bị Android.
Vlad

@Vlad Nếu bây giờ không cần đóng nhà văn, có lẽ đây là một ý kiến ​​hay để cập nhật câu trả lời?
Dòng

70

Tôi không tin rằng bạn thậm chí phải ghi một chuỗi rỗng vào tệp.

PrintWriter pw = new PrintWriter("filepath.txt");
pw.close();

9
Bạn đã đúng về điều đó. Tất cả các câu trả lời hiển thị là viết sai hoặc tốt nhất là thừa.
Marquis of Lorne

33
Làm thế nào về chỉ new PrintWriter("filepath.txt").close();?
Supuhstar

1
trích dẫn từ tài liệu java "Nếu tập tin tồn tại sau đó nó sẽ được rút ngắn kích thước zero"
Pinkerton

1
nhưng phải làm gì nếu tệp ở chế độ nối thêm.
GURMEET SINGH

Ôi trời, tôi không thể tin rằng tôi đã bỏ lỡ câu trả lời đơn giản. Mở tệp ở chế độ cắt ngắn. Tôi ghét chế độ cắt ngắn đến nỗi nó làm tôi trượt.

30

Bạn muốn phương thức setLength () trong lớp RandomAccessFile.


5
Trên thực tế, đây là câu trả lời đúng duy nhất, vì nó không xóa tệp. Tất cả các câu trả lời khác đều có.
Marquis of Lorne

Tôi cần cái này vì tôi muốn xóa tệp nhật ký được tạo bởi thư viện logback-android . Nếu tôi xóa tệp nhật ký theo cách thủ công, thư viện không đủ khéo léo để tạo lại nó nếu có nhật ký để ghi cho đến khi tôi khởi chạy lại ứng dụng của mình. Do đó, tôi đã sử dụng phương pháp này và làm việc. Tôi chưa học nhiều. Đó không phải là cách tiếp cận tốt nhất? Vui lòng cho lời khuyên.
Yeung

thú vị là, tôi gặp sự cố sản xuất do thẻ Intenso lớp 10 bị đóng băng (và buộc đặt lại pin) khi tôi gọi fileOnSdCard.setLength (0) cho một ứng dụng được cài đặt từ tệp .apk. Thẻ lớp 4 của họ không bao giờ cho thấy vấn đề.
Poutrathor


10

Một lớp lót để thực hiện thao tác cắt ngắn:

FileChannel.open(Paths.get("/home/user/file/to/truncate"), StandardOpenOption.WRITE).truncate(0).close();

Thông tin thêm có tại Tài liệu Java: https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html


+1 Vì không khởi tạo toàn bộ lớp viết tệp, (và thậm chí còn tệ hơn khi ghi vào nó). Đây thực sự phải là câu trả lời được chấp nhận.
Kröw

6

Làm thế nào về bên dưới:

File temp = new File("<your file name>");
if (temp.exists()) {
    RandomAccessFile raf = new RandomAccessFile(temp, "rw");
    raf.setLength(0);
}

5

Sau khi sao chép từ A sang B, hãy mở lại tệp A ở chế độ ghi và sau đó ghi chuỗi trống vào đó


5

Một trong những người bạn đồng hành tốt nhất cho java là Apache Projects và hãy tham khảo nó. Đối với hoạt động liên quan đến tệp, bạn có thể tham khảo dự án Commons IO .

Đoạn mã Dưới đây một dòng sẽ giúp chúng tôi làm cho tệp trống.

FileUtils.write(new File("/your/file/path"), "")

4

Chỉ viết:

FileOutputStream writer = new FileOutputStream("file.txt");

2

Ghi một chuỗi trống vào tệp, xả và đóng. Đảm bảo rằng trình ghi tệp không ở chế độ nối thêm. Tôi nghĩ rằng điều đó nên làm thủ thuật.


2

Nếu bạn không cần sử dụng trình viết sau đó, cách ngắn nhất và rõ ràng nhất để làm điều đó sẽ như thế:

new FileWriter("/path/to/your/file.txt").close();

1

sử dụng: Thư viện Java 7 NIO mới, hãy thử

        if(!Files.exists(filePath.getParent())) {
            Files.createDirectory(filePath.getParent());
        }
        if(!Files.exists(filePath)) {
            Files.createFile(filePath);
        }
        // Empty the file content
        writer = Files.newBufferedWriter(filePath);
        writer.write("");
        writer.flush();

Đoạn mã trên kiểm tra xem Directoty có tồn tại hay không nếu không tạo thư mục, kiểm tra xem tệp có tồn tại hay không, nó ghi chuỗi trống và xóa bộ đệm, cuối cùng, bạn sẽ khiến người viết trỏ đến tệp trống


0

Bạn có thể dùng

FileWriter fw = new FileWriter(/*your file path*/);
PrintWriter pw = new PrintWriter(fw);
pw.write("");
pw.flush(); 
pw.close();

Nhớ đừng dùng

FileWriter fw = new FileWriter(/*your file path*/,true);

True trong hàm tạo filewriter sẽ cho phép append.


0
FileOutputStream fos = openFileOutput("/*file name like --> one.txt*/", MODE_PRIVATE);
FileWriter fw = new FileWriter(fos.getFD());
fw.write("");

Chào mừng đến với SO! Vui lòng sử dụng các công cụ định dạng tích hợp để làm cho mã của bạn dễ đọc hơn.
Michael L.

0

Với trình viết thử với tài nguyên sẽ tự động bị đóng:

import org.apache.commons.lang3.StringUtils;
final File file = new File("SomeFile");
try (PrintWriter writer = new PrintWriter(file))  {
    writer.print(StringUtils.EMPTY);                
}
// here we can be sure that writer will be closed automatically

0

Tất cả những gì bạn phải làm là mở tệp ở chế độ cắt ngắn. Bất kỳ lớp nào ngoài tệp Java sẽ tự động làm điều đó cho bạn.


-2

bạn có thể viết một phương thức chung là (quá muộn nhưng mã dưới đây sẽ giúp bạn / những người khác)

public static FileInputStream getFile(File fileImport) throws IOException {
      FileInputStream fileStream = null;
    try {
        PrintWriter writer = new PrintWriter(fileImport);
        writer.print(StringUtils.EMPTY);
        fileStream = new FileInputStream(fileImport);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            writer.close();
        }
         return fileStream;
}

5
Điều này không tạo ra một tệp trống, nó tạo một tệp có một byte rỗng trong đó.
Marquis of Lorne,
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.