2008-10-28 21 views

Respuesta

77

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.

+0

¿Cómo grabaste estos rastros de llamadas de la biblioteca? ^^ – akuhn

+2

Son rastreos de llamadas del sistema. Utilicé strace (1) en Linux y Truss (1) en Solaris. –

+0

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

4

Puede abrir el archivo para escritura, buscar el desplazamiento (n-1) y escribir un solo byte. El sistema operativo extenderá automáticamente el archivo al número deseado de bytes.

+0

¿El archivo resultante será escaso? –

+0

sk: en general, sí. En la práctica, esto depende de los detalles del sistema operativo subyacente y puede requerir algunos ajustes para que el archivo sea escaso. –

+0

En Unix y Linux, será un archivo disperso: un bloque de cero bytes aparte del byte único escrito (que también podría ser cero, por supuesto). –

Cuestiones relacionadas