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.
Nguồn
2008-10-28 23:38:16
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
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. –
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