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 :

  1. Être capable de lire les données de l’entrée standard en Java.
  2. Être capable de rediriger un fichier vers l’entrée standard d’un programme.
  3. Être capable d’expliquer ce que contient un fichier de texte.
  4. Ê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" 
Fig. 1 – Afficher des valeurs hexadécimales

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.

00000000 4A 75 6C 69 65 74 74 65 3A 0D 0A 0D 0A 4F 20 52
00000010 6F 6D E9 6F 21 20 52 6F 6D E9 6F 21 20 50 6F 75
00000020 72 71 75 6F 69 20 65 73 2D 74 75 20 52 6F 6D E9
00000030 6F 3F 20 0D 0A 52 65 6E 69 65 20 74 6F 6E 20 70
00000040 E8 72 65 20 65 74 20 61 62 64 69 71 75 65 20 74
00000050 6F 6E 20 6E 6F 6D 20 3B 20 0D 0A 4F 75 2C 20 73
00000060 69 20 74 75 20 6E 65 20 6C 65 20 76 65 75 78 20
00000070 70 61 73 2C 20 6A 75 72 65 20 64 65 20 6D 27 61
00000080 69 6D 65 72 2C 20 0D 0A 45 74 20 6A 65 20 6E 65
00000090 20 73 65 72 61 69 20 70 6C 75 73 20 75 6E 65 20
000000A0 43 61 70 75 6C 65 74 2E
Fig. 2 – Présentation des octets (fichier HexDumpTest1.bin)

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.

Fig. 3 – Structogramme du programme HexDump
Fig. 3 – Structogramme du programme HexDump

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

  1. Combien y a-t-il d’octets dans le fichier ?
  2. Pouvez-vous dire avec certitude ce que représentent ces octets ?
  3. 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 ?
  4. 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 ?
  5. 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 ?
  6. 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.