Buffer, Charset & Channel
Exercice 1 - Compteur de lignes
On checher à écrire une application permettant de compter le
nombre de lignes d'un fichier (en fait le nombre de '\n')
contenus dans un fichier.
Le fichier sera pris en tant que premier argument de la ligne
de commande.
-
Écrire la classe IOLineCounter
utilisant les classes du paquetage java.io.
pour compter les lignes.
Penser que par défault, l'accès au fichier n'est pas bufferisé.
-
Quelle est la différence entre un buffer (java.nio.ByteBuffer)
allouer en utilisant allocate et un buffer alloué en
utilisant allocateDirect().
Quel est le buffer le plus efficace si l'on veut utiliser celui-ci pour
coder un compteur de lignes ?
-
Lorsque l'on effectue un parcours d'un buffer doit-on faire une boucle
en utilisant get() ou get(int) pour que celle-ci
soit la plus efficace ?
-
Écrire la classe NIOLineCounter effectuant la même
tâche mais en utilisant les classes java.nio.channels.FileChannel
et java.nio.ByteBuffer.
Exercice 2 - Compteur de lignes suite
-
On souhaite maintenant écrire une version du compteur de mot
utilisant un buffer mappé en mémoire MappedByteBuffer.
-
Indiquer dans quels cas il est plus intéressant d'utiliser read
que d'utiliser un fichier mappé en mémoire ?
-
Quelle est le mode (FileChannel.MapMode) que l'on doit
choisir pour monter le fichier en mémoire ?
-
Implanter la classe MappedLineCounter.
Exercice 3 - Transcoder
On souhaite écrire la classe Transcoder qui effectue la convertion
d'un format de charset à un autre :
java Transcoder srcFile.txt UTF-8 dstFile.txt ISO-8859-1
Dans cet exemple, le transcoder lit le fichier srcFile.txt écrit en UTF-8 et
transforme celui-ci en ISO-8859-1.
Dans le cas où le codage spécifié est "default" alors
le programme utilisera le codage par défaut de la plateforme.
-
Rappeler ce qu'est un charset et pourquoi un tel concept existe.
-
Utiliser la classe java.nio.charset.Charset
pour obtenir un charset puis créer l'encodeur et le décodeur
correspondant.
-
Compléter la classe Transcoder en utilisant
les méthodes decode(ByteBuffer) et
encode(CharBuffer).
-
Quel est le problème d'une tel implantation ?
Changer votre code pour utiliser les méthodes
decode(ByteBuffer,CharBuffer,boolean) et
encode(CharBuffer,ByteBuffer,boolean).
Comment dimensionner les différents buffers pour être sur que,
dans le pire cas, ce que encode ou decode
génère tienne dans le buffer de sortie ?
Rémi Forax - Université de Marne La Vallée