Master 2 CCI 2012-2013
POO, langage Java
Henri Garreta 

6. Entrées-sorties et fichiers

        1. Lire le contenu d’un fichier de nombres
        2. Obtenir et traiter les mots d’un texte
        3. Lister une arborescence de fichiers
        4. Sauvegarder et restaurer un objet complexe
        5. Extraire les liens contenus dans une page html
Le signe © renvoie à la correction

6.1. Lire le contenu d’un fichier de nombres ©

A. Téléchargez ici un fichier de texte contenant une suite de nombres flottants (représentables dans le type float) appartenant à l’intervalle [0 ; 1[. Écrivez une méthode qui lit ces nombres, détermine et affiche leur répartition en 10 classes de même largeur ([0 ; 0.1[, [0.1 ; 0.2[, [0.2 ; 0.3[, etc.).

Pour la lecture des nombres intéressez-vous à la classe java.util.Scanner.

Exemple d’affichage du résultat :

dans [0.0 ; 0.1[ -->    7 valeurs
dans [0.1 ; 0.2[ -->   30 valeurs
dans [0.2 ; 0.3[ -->  104 valeurs
etc.

B. Même question que ci-dessus, mais le fichier est maintenant binaire (on peut le télécharger ici). Pour la lecture vous emploierez la classe java.io.DataInputStream.

6.2. Obtenir et traiter les mots d’un texte ©

A. Ecrivez une méthode qui détermine l’ensemble des mots distincts d’un fichier de texte.

Pour extraire les mots du texte utilisez un objet java.io.StreamTokenizer (étudiez cette classe)  ; pour représenter l’ensemble des mots distincts utilisez un des objets implémentant l’interface java.util.Set.

B. Ecrivez une méthode qui détermine le nombre d’occurrences de chaque mot d’un fichier de texte. Outre un StreamTokenizer comme ci-dessus, utilisez une des implémentations de l’interface java.util.Map.

6.3. Lister une arborescence de fichiers ©

Écrivez une méthode lister qui prend pour argument le nom d’un répertoire de votre système et qui affiche la liste des fichiers et dossiers qu’il contient. Dans le cas d’un fichier, affichez à côté du nom la date de dernière modification du fichier et sa taille en octets. Dans le cas d’un dossier, affichez (récursivement) les fichiers et dossiers contenus, en laissant à gauche une marge plus importante pour refléter l’inclusion.

Par exemple, voici l’affichage produit sur un système Windows par l’appel de lister avec pour argument un dossier nommé AtelierC :

AtelierC
    Atelier
        enumere_sequences.c (10/11/09 14:41) 10582 octets
        fusion_suite.c (30/10/09 17:42) 534 octets
        ...
        StrDos.c (16/01/10 09:10) 1206 octets
        tp4-1-C++
            Bibliotheque.cpp (19/01/10 00:31) 575 octets
            Bibliotheque.h (19/01/10 00:14) 377 octets
            ...
            Revue.h (18/01/10 23:17) 276 octets
        Untitled1.c (29/01/10 09:39) 2 octets
    ComparaisonTotale
        ComparaisonTotale.c (24/09/09 12:28) 6590 octets
        _Menage.bat (02/11/08 09:21) 319 octets
    Projet CodeBlocs  cloner.zip (09/11/08 10:24) 1070 octets
    Projet Visual C++  cloner.zip (09/11/08 10:23) 2547 octets

Indication. Les principales informations dont vous avez besoin peuvent être obtenues par les méthodes des objets java.io.File.

6.4. Sauvegarder et restaurer un objet complexe ©

Le but de cet exercice est d’essayer la classe ObjectOutputStream qui permet d’enregistrer dans un fichier un objet aussi complexe soit-il et ObjectInputStream qui permet ensuite de recréer l’objet à partir du fichier dans lequel il a été précédemment enregistré.

Récupérez les classes de l’exercice 4.5 (Abstraction, classes abstraites, interfaces : codage d’une expression arithmétique) et remplacez le programme de test que nous y avions écrit (TestExpression) par deux programmes distincts :

N.B. Pour qu’un objet ait le droit être sauvé dans un fichier ou restauré depuis un fichier (on dit « soit sérialisé ») il faut déclarer qu’il implémente l’interface java.io.Serializable, mais cela est une simple marque car cette interface est vide et n’impose l’écriture d’aucune méthode. Dans notre cas, cela implique qu’il faudra modifier ainsi la déclaration de Expression :

public interface Expression extends Serializable {
    double valeur(double x);
}

6.5. Extraire les liens contenus dans une page html ©

Dans une page html – comme celle que vous êtes en train de lire – les hyperliens sont indiqués par des balises <a>. Par exemple, le lien site du journal Le Monde, sur lequel il suffit de cliquer pour atteindre la page d’accueil de ce journal, est codé par le texte <a href="http://www.lemonde.fr/">site du journal Le Monde</a>. On dit que « http://www.lemonde.fr/ » est l’URL du site en question.

A. L’exercice consiste à écrire un programme pour extraire toutes les URL contenues dans une page html donnée.

1. Commencez par obtenir, sous forme de String, la totalité du fichier html. Pour cela, créez un objet FileReader et utilisez sa méthode read(char[] buf) pour lire tous les caractères du fichier (la classe File vous permet de savoir combien il y en a).

2. Il faut ensuite écrire l’expression régulière décrivant un texte de la forme

<a href="http://www.lemonde.fr/"

(ne cherchez pas à décrire un texte plus grand, il peut y avoir d’autres paramètres entre la fin de l’URL et le caractère > qui termine la balise). La suite de votre programme ressemblera à ceci :

String expReg = "l'expression régulière en question";
Pattern motif = Pattern.compile(expReg);

Matcher reconnaisseur = motif.matcher(texte);
int position = 0;
while (reconnaisseur.find(position)) {
    String s = texte.substring(reconnaisseur.start(), reconnaisseur.end());
    System.out.println(s);
    position = reconnaisseur.end();
}

L’affichage produit peut ressembler à ceci (c’est un cas réel)  :

<a href="http://www.sciences.univmed.fr/"
<a     href="http://localhost:803/"
<a href="http://kiosque.luminy.univ-mrs.fr/"
<a 
href="http://localhost:801/~garreta/"
<a    href="https://auth.univmed.fr/index.jsp"
<a href="../Site Dil/index.html"
<a href="http://www.dil.univ-mrs.fr/~garreta/"
...

B. En créant un « groupe » dans l’expression régulière, améliorez le programme précédent pour que l’affichage soit plutôt celui-ci :

http://www.sciences.univmed.fr
http://localhost:803
http://kiosque.luminy.univ-mrs.fr
http://localhost:801/~garreta
https://auth.univmed.fr/index.jsp
../Site Dil/index.html
http://www.dil.univ-mrs.fr/~garreta
...