2008-10-28 9 views

Répondre

77

Créez un nouveau RandomAccessFile et appelez la méthode setLength en spécifiant la longueur de fichier souhaitée. L'implémentation JRE sous-jacente doit utiliser la méthode la plus efficace disponible dans votre environnement.

Le programme suivant

import java.io.*; 

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

sur une machine Linux va allouer l'espace en utilisant la 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 

tout sur une machine Solaris, il utilisera la fonction F_FREESP64 de fcntl (2) appel système.

/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 

Dans les deux cas, cela entraînera la création d'un fichier fragmenté.

+0

Comment avez-vous enregistré ces traces d'appel de bibliothèque? ^^ – akuhn

+2

Ce sont des traces d'appel système. J'ai utilisé strace (1) sous Linux et truss (1) sous Solaris. –

+0

En javadoc, il est écrit que "Dans ce cas, le contenu de la partie étendue du fichier n'est pas défini". Est-ce que cela garantit toujours que l'on met à zéro sur Windows et Linux, ou y at-il un moyen efficace de s'assurer que tous les octets sont des zéros? – Sarmun

4

Vous pouvez ouvrir le fichier en écriture, chercher à décaler (n-1) et écrire un seul octet. L'OS étendra automatiquement le fichier au nombre d'octets souhaité.

+0

Le fichier résultant sera-t-il fragmenté? –

+0

sk: En général, oui. En pratique, cela dépend des spécificités du système d'exploitation sous-jacent et peut nécessiter quelques manipulations pour rendre le fichier fragmenté. –

+0

Sous Unix et Linux, ce sera un fichier fragmenté - un bloc de zéro octets en dehors de l'octet écrit (qui peut aussi être zéro, bien sûr). –

Questions connexes