Activité Afficher le contenu d’un fichier
Mise en situation
Vous avez appris qu’un fichier informatique, quel qu’il soit, est une longue suite de bits regroupés en octets. Vous souhaitez afficher les octets d’un fichier pour en analyser le contenu. Comme Windows ne dispose d’une commande qui vous permet de réaliser cette opération, vous décidez d’écrire un petit programme en Java.
Consigne
On vous demande de réaliser le programme décrit ci-après et de répondre aux questions qui vous sont posées.
Résultat attendu
Un compte rendu de l’activité et les réponses aux questions posées dans une section de votre rapport du module.
Objectifs
À la fin de cette activité, vous devez :
- Être capable de lire les données de l’entrée standard en Java.
- Être capable de rediriger un fichier vers l’entrée standard d’un programme.
- Être capable d’expliquer ce que contient un fichier de texte.
- Être capable d’utiliser les fonctionnalités liées à l’encodage des caractères (encoding) d’un éditeur de texte.
Ressources
Document :
Logiciel :
- Oracle NetBeans
- Visual Studio Code
- Notepad++
Mise en route
En Java, System.in
est un objet de type InputStream
qui représente le flux d’octets de l’entrée standard (stdin) du programme. Lorsqu’on lance un programme normalement, l’entrée standard du programme reçoit les données du terminal. Toutefois, il est possible de « connecter » l’entrée standard d’un programme à n’importe quel fichier à l’aide d’une redirection de l’entrée standard.
Dans l’interpréteur de commande de Windows, comme dans le shell de Linux, on peut faire une redirection de l’entrée standard se fait en ajoutant à la fin de la ligne de commande, le signe « plus petit que » (<
) suivit du chemin du fichier.
Cette technique permet de traiter les données d’un fichier de la même manière que des données saisies au clavier. Cela nous évite d’avoir à programmer une interface utilisateur pour obtenir le chemin du fichier et d’avoir à traiter les erreurs qui peuvent survenir lors de l’ouverture du fichier (fichier non existant, problème de droit d’accès, etc.).
Astuces et rappels
Pour afficher une valeur numérique en hexadécimal, on peut utiliser la méthode printf
sur l’objet System.out
comme le montre le code de la figure 1. Dans la chaîne " % 02X "
, % 02X
indique que l’on veut afficher la valeur de la variable passée en argument, en hexadécimal (X
), avec au plus quatre chiffres (4
)et si le nombre a moins de quatre chiffres, il doit être complété par des 0 à gauche (0
).
1
2
3
4
5
6
7
8
int value = 10;
System.out.printf(" %04X", value) // affiche la chaîne " 000A"
value = 17;
System.out.printf(" %04X", value) // affiche la chaîne " 0011"
value = 2047;
System.out.printf(" %04X", value) // affiche la chaîne " 07FF"
Le programme
On vous demande de réaliser un programme qui lit un à un les octets de l’entrée standard et qui écrit la valeur hexadécimale de chacun d’eux dans la sortie standard. On doit présenter seize octets par ligne avec, au début de chaque ligne, le numéro du premier octet comme le montre la figure 2. On écrit les numéros avec huit chiffres hexadécimaux et les valeurs des octets avec deux chiffres hexadécimaux. Les octets sont numérotés à partir de 0.
Comme on ne connaît pas le nombre d’octets du fichier, on doit utiliser une boucle indéfinie (while
) et compter les valeurs à l’aide d’une variable. Chaque fois que l’on a écrit 16 valeurs, on fait un retour à la ligne et on écrit la valeur du compteur au début de la ligue suivante. On peut savoir si l’on a écrit 16 valeurs en testant si le reste de la division entière de la valeur du compteur par 16 vaut 0. Comme on ne veut pas faire un retour à la ligne avant la première ligne, on peut écrire la valeur de compteur pour la première ligne avant d’entrer dans la boucle.
Pour réaliser le programme, vous pouvez vous aider du structogramme de la figure 3.
Compiler votre programme et créez le fichier .jar avec le menu Run -> Clean and Build Project (voir figure 4). Pour tester le programme, téléchargez le fichier HexDumpTest1.txt dans votre répertoire de téléchargement, ouvrez une fenêtre de terminal (cmd.exe) et exécutez les commandes suivantes :
1
2
3
4
5
6
D :
CD %USERPROFILE%
CD Documents
CD NetBeanProjects
CD HexDump
java -jar dist\HexDump.jar < %USERPROFILE%\Downloads\HexDumpTest1.txt
Si le résultat correspond à celui de la figure 2, votre programme fonctionne correctement.
Questions
- Combien y a-t-il d’octets dans le fichier ?
- Pouvez-vous dire avec certitude ce que représentent ces octets ?
- Ouvrez le fichier avec Notepad++. Notez toutes les indications que vous donne le programme dans la barre d’état (status bar). Combien y a-t-il de caractères ? Quelle norme d’encodage Notepad++ a-t-il utilisée pour décoder les caractères ? Cela vous semble-t-il correct ?
- Comparez le nombre de caractères et le nombre d’octets. Quelle hypothèse pouvez-vous faire à propos du contenu d’un fichier de texte ?
- Refaites la même expérience avec le fichier HexDumpTest2.txt. Pourquoi y a-t-il cette fois plus d’octets que de caractère ?
- Utilisez successivement Notepad++ et Visual Studio Code pour convertir la norme d’encodage de HexDumpTest1.txt en UTF-8 et enregistrez le résultat dans le fichier HexDumpTest1_UTF8.txt. Décrivez la procédure. Montrez que le nouveau fichier contient bien de l’UTF-8 en utilisant votre programme HexDump.