Utilisation avancée des ByteBuffer avec Java NIO (optionnel)
- Utilisation des buffers pour l'accès optimisé à la mémoire et aux fichiers: direct buffer et mapping de fichiers en mémoire.
Dans ce TP (optionnel), vous réalisez deux exercices dans le but d'optimiser l'exercice 3 (copie de fichiers) du TP sur les manipulations de fichiers. Les classes utilisées pour se TP se trouve dans le projet csc4509-1-file-javanio déjà importé sur votre IDE.
Lisez les pages 13 à 16 de la documentation sur JAVA NIO (≈ 15 mn).
Utilisation d'un Bytebuffer
de type direct
Copiez le code de la classe CopyFile dans la classe CopyDirectFile et modifiez-le pour qu'il utilise un Bytebuffer de type direct.
Réalisez des mesures de performances avec la commande time du programme original et de ce programme.
Les résultats sont-ils significatifs ?
Mapping de fichier en mémoire
Copiez le code de la classe CopyDirectFile dans la classe CopyMappedFile et modifiez-le pour réaliser un mapping des deux fichiers en mémoire et une recopie de l'un vers l'autre une fois ce mapping réalisé.
L'accès à la mémoire ne se fait pas sous la forme d'un flot de données. On doit pouvoir lire ou modifier n'importe quelle adresse à tout moment. Les fichiers que l'on mappe sur cette mémoire doivent donc offrir cette possibilité d'accès à une position aléatoire. Les classes FileInputStream ou FileOutputStream ne sont pas adaptées. Les fichiers mappés sur une mémoire doivent donc utiliser une classe comme RandomAccessFile.
Le fichier source sera ouvert en lecture seule:
RandomAccessFile rin = new RandomAccessFile("fichierSource", "r");
Le fichier destination sera ouvert en lecture plus écriture (il n'existe pas de mode écriture seule):RandomAccessFile rout = new RandomAccessFile("fichierCopie", "rw");
Tout comme les classes FileInputStream ou FileOutputStream, la classe RandomAccessFile propose une méthode d'instance getChannel() pour obtenir le canal qui permet de mapper le MappedByteBuffer avec le fichier:
FileChannel fin = rin.getChannel();
long len = rin.length();
MappedByteBuffer bufin = fin.map(MapMode.READ_ONLY, 0L, len);
$Date: 2021-04-26 16:11:48 +0200 (lun. 26 avril 2021) $