2008-10-28 29 views

Trả lời

77

Tạo mới RandomAccessFile và gọi phương thức setLength, chỉ định độ dài tệp mong muốn. Việc triển khai JRE cơ bản nên sử dụng phương pháp hiệu quả nhất có sẵn trong môi trường của bạn.

sau Chương trình

import java.io.*; 

class Test { 
    public static void main(String args[]) throws Exception { 
      RandomAccessFile f = new RandomAccessFile("t", "rw"); 
      f.setLength(1024 * 1024 * 1024); 
    } 
} 

trên một máy Linux sẽ phân bổ không gian bằng cách sử dụng ftruncate (2)

6070 open("t", O_RDWR|O_CREAT, 0666) = 4 
6070 fstat(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
6070 lseek(4, 0, SEEK_CUR)    = 0 
6070 ftruncate(4, 1073741824)   = 0 

trong khi trên một máy Solaris nó sẽ sử dụng các F_FREESP64 chức năng của fcntl (2) gọi hệ thống.

/2:  open64("t", O_RDWR|O_CREAT, 0666)    = 14 
/2:  fstat64(14, 0xFE4FF810)       = 0 
/2:  llseek(14, 0, SEEK_CUR)       = 0 
/2:  fcntl(14, F_FREESP64, 0xFE4FF998)    = 0 

Trong cả hai trường hợp, điều này sẽ dẫn đến việc tạo tệp thưa thớt.

+0

Bạn đã ghi lại các dấu vết cuộc gọi thư viện này bằng cách nào? ^^ – akuhn

+2

Chúng là dấu vết hệ thống. Tôi sử dụng strace (1) dưới Linux và giàn (1) dưới Solaris. –

+0

Trong javadoc, nó được viết rằng "Trong trường hợp này, nội dung của phần mở rộng của tệp không được xác định". Điều này vẫn đảm bảo được zeroed trên windows và linux, hoặc là có bất kỳ cách hiệu quả để chắc chắn rằng tất cả các byte là số không? – Sarmun

4

Bạn có thể mở tệp để viết, tìm cách bù đắp (n-1) và viết một byte đơn. Hệ điều hành sẽ tự động mở rộng tệp đến số byte mong muốn.

+0

Tệp kết quả có bị thưa thớt không? –

+0

sk: Nói chung, có. Trong thực tế, điều này phụ thuộc vào các chi tiết cụ thể của hệ điều hành cơ bản và có thể yêu cầu một số không quan trọng để làm cho tệp thưa thớt. –

+0

Trên Unix và Linux, đó sẽ là một tệp thưa thớt - một khối không có byte ngoài byte đơn được viết (cũng có thể là 0, tất nhiên). –

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