2013-01-11 45 views
10

Cách thực hành tốt nhất để cắt bớt tệp trong Java là gì? Ví dụ: chức năng giả này, như một ví dụ để làm rõ mục đích:Thao tác cắt tệp trong Java

void readAndTruncate(File f, List<String> lines) 
     throws FileNotFoundException { 
    for (Scanner s = new Scanner(f); s.hasNextLine(); lines.add(s.nextLine())) {} 

    // truncate f here! how? 

} 

Không thể xóa tệp vì tệp đóng vai trò là người giữ chỗ.

Trả lời

26

Sử dụng FileChannel#truncate().

try (FileChannel outChan = new FileOutputStream(f, true).getChannel()) { 
     outChan.truncate(newSize); 
    } 
+2

Tôi đã làm việc đơn giản 'try {new FileOutputStream (f) .getChannel(). Truncate (0) .close(); } catch (IOException e) {/ * log và bỏ qua * /} '. Hỏi: có vấn đề gì nếu tập tin được mở với append == true, hay không? – hyde

+0

Sau đó chỉ cần 'FileWriter mới (f) .đóng()'. –

+1

Nếu bạn mở mà không nối thêm == 'true' th tập tin được ngay lập tức cắt ngắn (bạn muốn). –

0

Sử dụng RandomAccessFile#read và đẩy byte được ghi theo cách này vào đối tượng File mới.

RandomAccessFile raf = new RandomAccessFile(myFile,myMode); 
byte[] numberOfBytesToRead = new byte[truncatedFileSizeInBytes]; 
raf.read(numberOfBytesToRead);  
FileOutputStream fos = new FileOutputStream(newFile); 
fos.write(numberOfBytesToRead); 
+0

Tôi nghĩ rằng việc sử dụng RandomAccessFile sẽ cho phép đọc và sau đó cắt bớt với một lần mở tệp, vì vậy +1 cho điều đó. – hyde

2

Nó phụ thuộc vào cách bạn đang đi để ghi vào tập tin, nhưng cách đơn giản nhất là để mở một mới FileOutputStream mà không chỉ định rằng bạn có kế hoạch để phụ thêm vào tập tin (lưu ý: các nhà xây dựng cơ sở FileOuptutStream sẽ truncate tệp, nhưng nếu bạn muốn làm rõ rằng tệp bị cắt bớt, tôi khuyên bạn nên sử dụng biến thể hai tham số).

+0

Sẽ không ghi vào tập tin, chỉ muốn cắt bớt nó thành số không ... Nó được đọc và xử lý, nội dung cần được xóa để tránh ăn không gian đĩa, nhưng mục nhập tệp sẽ vẫn còn. – hyde

+0

Yeah, 'FileOutputStream' cắt xén có ý nghĩa, nhưng tôi tự hỏi tại sao các tài liệu không đề cập đến nó (họ chỉ nói tập tin sẽ được viết từ đầu, mà không xác định những gì xảy ra với nội dung tập tin trước đó). – hyde

8

new FileWriter(f) sẽ cắt tập tin của bạn khi mở (để zero byte), sau khi bạn có thể viết dòng để nó

2

Một lót bằng Files.write() ...

Files.write(outFile, new byte[0], StandardOpenOption.TRUNCATE_EXISTING); 

có thể sử dụng để File.toPath() cũng chuyển đổi từ File thành Path.

Đồng thời cho phép khác StandardOpenOptions.