:: Enseignements :: ESIPE :: E4INFO :: 2007-2008 :: Java Réseau I - Concurrence et E/S ::
[LOGO]

Buffer, Charset & Channel


Exercice 1 - Pêche à la ligne

On cherche à écrire une application permettant de compter le nombre de lignes d'un fichier (en fait le nombre de '\n'). Le fichier sera pris en tant que premier argument de la ligne de commande.

  1. Écrire la classe IOLineCounter utilisant les classes du paquetage java.io (à savoir, InputStream, Reader et LineNumberReader) pour compter les lignes.
    Quel est l'intérêt d'utiliser des InputStream et Reader plutôt que des FileInputStream et FileReader ?
    Penser que, par défaut, l'accès au fichier n'est pas bufferisé.
  2. Quelle est la différence entre un buffer (java.nio.ByteBuffer) alloué en utilisant allocate et un buffer alloué en utilisant allocateDirect() ?
    Quel est le buffer le plus efficace dans le cas d'un compteur de lignes ?
  3. 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 ?
  4. É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 - Encore des lignes, en plus puissant

  1. On souhaite maintenant écrire une version du compteur de mots utilisant un buffer mappé en mémoire MappedByteBuffer.
  2. Indiquer dans quels cas il est plus intéressant d'utiliser read que d'utiliser un fichier mappé en mémoire ?
  3. Quelle est le mode (FileChannel.MapMode) que l'on doit choisir pour monter le fichier en mémoire ?
  4. Implanter la classe MappedLineCounter.

Exercice 3 - Amis fichiers, convertissez-vous...

On souhaite écrire la classe Transcoder qui effectue la conversion 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.

  1. Utiliser la classe java.nio.charset.Charset pour obtenir un charset puis créer l'encodeur et le décodeur correspondant.
  2. Compléter la classe Transcoder en utilisant les méthodes decode(ByteBuffer) et encode(CharBuffer).