:: Enseignements :: Master :: M1 :: 2015-2016 :: Programmation d'applications réseaux ::
[LOGO]

Manipulation de base des buffers, jeux de caractères et endianness


Exercice 1 - Lecture et écriture d'un fichier

La classe FileInspector ci-dessous permet d'afficher sur la sortie standard la valeur de chaque octet lu dans un fichier texte, ainsi que la valeur du caractère associé dans le code ASCII.

Testez le fonctionnement de cette classe avec un fichier simple contenant des caractères ASCII, comme par exemple le fichier toto.txt suivant:

En vous inspirant de ce code, écrivez une nouvelle classe DoubleByteFileWriter dont la méthode main aura pour objectif d'écrire dans un fichier de sortie le contenu d'un fichier d'entrée en ayant "doublé" chaque occurrence d'un octet fixé (défini en tant que constante dans la classe). Par exemple, si cet octet est 65, le code ASCII du caractère 'A', alors l'exécution de la commande
% java fr.upem.file.DoubleByteFileWriter toto.txt toto.2A.txt
devrait produire le fichier
AABC
abc
123
AAAAAAAAAAAA

Exercice 2 - Encodage

On souhaite maintenant écrire une classe StoreWithEncoding dont la méthode main accepte deux arguments sur la ligne de commande: le nom d'un jeu de caractère, et le nom d'un fichier. La fonction doit alors lire ligne par ligne le texte saisi sur l'entrée standard et l'écrire dans le fichier dont le nom est fourni en utilisant l'encodage préconnisé.

Par exemple, l'exécution suivante (le ^D à la fin représente la séquence Control-D pour fermer le flot d'entrée)
% java fr.upem.file.StoreWithEncoding ascii ascii.txt
bla bla
Voila un petit texte
^D
doit produire un fichier de nom ascii.txt contenant:
bla bla
Voila un petit texte
Essayez également avec
% java fr.upem.file.StoreWithEncoding UTF-8 utf8.txt
bla bla
Texte accentué éàèî
et même symbole €
et avec le même texte en ISO-8859-15 et en ISO-8859-1.

Exercice 3 - Endianness

Sur le même principe que l'exercice précédent, on souhaite écrire une classe StoreWithByteOrder qui lit des entiers long sur l'entrée standard et qui les écrit octet par octet dans un fichier. L'ordre (little endian ou big endian) d'écriture des octets dans le fichier doit être celui spécifié sur la ligne de commande par LE ou BE juste avant le nom du fichier.

Par exemple, les commandes
% java fr.upem.file.StoreWithByteOrder BE long-be.txt
1
^D
et
% java fr.upem.file.StoreWithByteOrder LE long-le.txt
1
^D
doivent produire deux fichiers différents. Pour savoir ce que contiennent ces fichiers, vous pouvez utiliser la classe FileInspector du premier exercice.

Si vous rentrez la valeur 255, comment est-elle représentée dans le fichier? Que vous affiche la classe FileInspector?