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é.
Comment avez-vous enregistré ces traces d'appel de bibliothèque? ^^ – akuhn
Ce sont des traces d'appel système. J'ai utilisé strace (1) sous Linux et truss (1) sous Solaris. –
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