TPs sur les entrées-sorties

Page Home (contact) Retour TPs

Support de cours Support de cours


Ce TP reprend le TP sur les interfaces graphiques où un utilisateur modifie son mot de passe. Les mots de passe sont conservés dans un fichier texte.


Vérification d'un mot de passe

Les noms des utilisateurs et leurs mots de passe sont enregistrés dans un fichier des mots de passe. Ce fichier des mots de passe sera considéré par l'application comme une ressource (voir cours sur les entrées-sorties ou, avec plus de détails, cours sur l'interface de java avec le système, section "ressources") et son emplacement sera désigné par un nom relatif au classpath ou au répertoire où est placée la classe Utilisateur.

Le format du fichier des mots de passe : chaque ligne du fichier contient un nom et un mot de passe, séparés par un ou plusieurs espaces. Certaines lignes n'ont qu'un seul nom ; en ce cas, elles contiennent un nom d'utilisateur qui n'a pas de mot de passe. Dans l'exemple suivant, le mot de passe de toto est bibi, guest n'a pas de mot de passe :

guest
toto bibi
bibi truc
riri machin

Pour cet exercice vous modifierez la méthode nomEtMdpCorrect de la classe Utilisateur pour qu'elle utilise le fichier des mots de passe.

Correction :

Voir correction exercice suivant


Changer un mot de passe

Modifiez la méthode setMdp de la classe Utilisateur pour utiliser le fichier des mots de passe. Pour cela vous lirez tout le fichier ligne par ligne, ajouterez les lignes dans une variable de type StringBuilder (en modifiant au passage la ligne qui contient le mot de passe à modifier) et récrirez la valeur de la variable en entier sur le disque. Cette méthode lancera une AccesException si une IOException a été levée (gardez bien la cause première de l'exception) ou si le mot de passe de l'utilisateur courant ne correspond pas à son mot de passe dans le fichier des mots de passe (il a été modifié directement dans le fichier des mots de passe).

Correction :

Utilisateur.java (version JDK 7)
Utilisateur.java (version JDK 6)


Page Web et expressions régulières

Le but de cet exercice est de faire afficher tous les titres d'une page Web (les contenus des balises <h1>, <h2>,...).

Pour cela vous allez utiliser les expressions régulières.

  1. Ecrivez une classe PageWeb qui représente une page HTML identifiée par un URL. Cette classe contiendra
  2. Ajoutez à la classe PageWeb une méthode List<String> titres() qui renvoie une liste de tous les titres de la page (contenus des balises <h1>, <h2>,...). Pour tester, écrivez une classe TestPageWeb dont la méthode main affiche ces titres dans une boucle for-each. L'expression régulière devra permettre de repérer les balises qui contiennent des espaces non significatifs telles que <h1 > ou les balises en majuscules telles que <H2>.
    Pour la page HTML locale (et pour la page Web distante donnée ci-dessus) il devra s'afficher
    Titre 1.1
    Titre 1.2
    Titre 2.1
    Titre 2.2
    Titre 2.3

Correction :

PageWeb.java
TestPageWeb.java


Implémentation simplifiée d'écouteurs

But de cet exercice : concevoir une solution à un problème en utilisant plusieurs notions déjà étudiées dans le cours.

Remarque : ce TP est la première partie d'un ancien sujet d'examen, légèrement remaniée.

Vous récupérez le code source d'une classe java Copieur dont la méthode
copier(Reader source, Writer destination)
copie un flot de caractères :

import java.io.*;
public class Copieur {
  public void copier(Reader source, Writer destination) throws IOException {
    // Code unicode
    int c;
    while ((c = source.read()) != -1) {
      destination.write(c);
    }
  }
}  

Vous souhaitez permettre à un objet (dont vous ne connaissez pas la classe à l'avance) d'être informé à chaque fois qu'un certain nombre de caractères ont été copiés de la source vers la destination, par exemple à chaque fois qu'un bloc de 200 caractères a été copié. 200 est un paramètre qui peut être modifié à tout moment par l'objet. Ainsi, par exemple, une interface graphique qui utilise ce copieur pourrait afficher une barre de progression pour représenter visuellement à l'utilisateur l'avancement de la copie. Il ne doit pas être possible de donner une taille de bloc non positive (toute taille négative ou nulle sera tout simplement ignorée).

Pour qu'un objet soit informé, il faut qu'il s'inscrive auprès du copieur. Les objets informés seront appelés des écouteurs du copieur, par analogie avec les écouteurs (listeners) étudiés dans le cours sur les interfaces graphiques, qui s'inscrivent auprès des composants graphiques. Un copieur peut avertir plusieurs objets s'ils se sont inscrits auprès de lui.

  1. Modifiez le code de la classe Copieur et ajoutez éventuellement des classes et des interfaces pour avoir les fonctionnalités décrites ci-dessus et dans les questions suivantes (lire l'énoncé de cet exercice jusqu'au bout avant de commencer à coder).
  2. Vous allez écrire une classe dont les instances seront des écouteurs qui seront informés par le copieur écrit à la question précédente. Une instance de cette classe affichera un caractère, par exemple le caractère "+", sur la sortie standard à chaque fois qu'elle sera informée par le copieur qu'un bloc de caractères aura été copié. Le caractère affiché dépend de l'instance de la classe ; ça peut être "+" ou tout autre caractère.
  3. Écrivez une méthode main qui crée un copieur et 2 écouteurs du copieur (de la classe écrite dans la question précédente) et démarre la copie. Un des écouteurs souhaite être prévenu tous les 50 caractères et affiche le caractère "+" (à chaque copie de 50 caractères) et l'autre affiche le caractère "*" et souhaite être prévenu tous les 70 caractères. Arrangez vous pour que la copie se fasse en utilisant un buffer afin de réduire les lectures-écritures réelles.
  4. Si le copieur lève des exceptions, vers quelle méthode vont-elles remonter ?

Consignes à respecter :

Correction :

Les classes


Gestion de la fin de fichier et des exceptions

On reprend l'exercice précédent. Cette fois-ci, on souhaite que les écouteurs soient prévenus aussi dans les 2 cas suivants :

On souhaite aussi que les écouteurs de l'exercice précédent affichent leur caractère entre "!" pour indiquer la fin de la copie (par exemple "!+!").

Modifiez les classes de l'exercice précédent pour pouvoir obtenir le comportement décrit.

Correction :

Les classes

Pour ceux qui ont déjà fini :

Allez étudier la sérialisation dans le support de cours indiqué en haut de cette page, dans le tutoriel d'Oracle ou sur un des nombreux sites qui la décrive (par exemple http://www.jmdoudoux.fr/java/dej/chap020.htm). La sérialisation permet de sauvegarder un objet entier très simplement pour pouvoir le récupérer ensuite. Elle est très utile et elle est utilisée en particulier par Java pour les appels de méthode à distance (vers un objet qui se trouve sur un autre ordinateur) pour passer les valeurs des paramètres et la valeur de retour des méthodes. Vous pouvez aussi faire l'exercice sur la sérialisation du TP des années précédentes.

Vous pouvez aussi refaire le TP en utilisant un fichier des mots de passe écrit en format "binaire" (pas texte).


Retour TPs