Cree un nuevo RandomAccessFile y llame al método setLength, especificando la longitud del archivo deseado. La implementación subyacente de JRE debe usar el método más eficiente disponible en su entorno.
el siguiente programa
import java.io.*;
class Test {
public static void main(String args[]) throws Exception {
RandomAccessFile f = new RandomAccessFile("t", "rw");
f.setLength(1024 * 1024 * 1024);
}
}
en una máquina Linux asignará el espacio utilizando el 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
mientras que en una máquina de Solaris se utilizará el la función F_FREESP64 de la fcntl (2) llamada al sistema
/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
En ambos casos, esto dará como resultado la creación de un archivo disperso.
¿Cómo grabaste estos rastros de llamadas de la biblioteca? ^^ – akuhn
Son rastreos de llamadas del sistema. Utilicé strace (1) en Linux y Truss (1) en Solaris. –
En javadoc, está escrito que "En este caso, los contenidos de la porción extendida del archivo no están definidos". ¿Esto todavía garantiza que se haya puesto a cero en Windows y Linux, o existe alguna forma eficiente de asegurarse de que todos los bytes sean ceros? – Sarmun