====== TP CCI Java: Réseau, Collections et analyses multiples ====== Pour faire cette partie, il est nécessaire d'avoir terminé la [[cci-java-tp1|partie 1]] ===== Lire des documents sur le réseau ===== Java permet très facilement de récupérer des documents accessibles par le réseau, en particulier à travers le protocole ''http''. L'objectif de cette amélioration est d'ajouter à l'analyseur la possibilité de lire de tels documents. ==== Un lecteur pour le réseau ==== L'objectif ici est de coder une nouvelle implémentation de l'interface ''Lecteur'' qui, au lieu de lire les caractères dans un fichier sur la machine ou au clavier, va lire les caractères dans un fichier sur le réseau. Pour cela nous allons utiliser la classe ''java.net.URL''. La première étape consiste à lire la documentation de la classe ''java.net.URL''. En particulier, on s'attachera à lire la documentation du constructeur qui prend une ''String'' en argument, ainsi que la documentation de la méthode ''openStream()''. La classe ''java.net.URL'' nous permet ainsi de récupérer un ''InputStream'' pour lire dans le fichier désigné par cette URL. Créer une classe ''LecteurReseau'' qui implémente l'interface ''Lecteur''. On pourra prendre comme modèle les classes ''LecteurDeFichier'' et ''LecteurClavier'' de la [[cci-java-tp1|première partie]]. Le constructeur de la classe prendra en argument une ''String'' correspondant à l'URL du fichier à lire. ==== Utilisation dans la méthode ''main'' de l'analyseur ==== Nous avons à présent le choix entre trois lecteurs possibles: * ''LecteurClavier'': s'il n'y a pas de fichier spécifié * ''LecteurDeFichier'': si un fichier est spécifié en plus du mot à reconnaître * ''LecteurReseau'': si une URL est spécifiée en plus du mot à reconnaître Pour faire la différence entre une URL et un nom de fichier, on supposera qu'une URL contient toujours la chaîne de caractères ''"://"'' contrairement à un nom de fichier. Modifier la méthode ''main'' de la classe ''Analyseur'' de façon à utiliser un ''LecteurReseau'' lorsqu'une URL est donnée comme nom de fichier. ===== Une analyse avec expressions régulières ===== Le but ici est de permettre de pouvoir utiliser des expressions régulière (comme le programme Unix ''grep'') et pas seulement des mots. Pour cela créer un champ "''pattern''" de la classe ''java.util.regex.Pattern''. Pour initialiser ce champ, on utilisera la méthode statique ''Pattern.compile(String regex)''. Modifier ensuite la classe ''Analyseur'' de façon à reconnaître une expression régulière et pas un mot. Pour tester une ligne, on pourra utiliser ''pattern.matcher(laLigneATester).find()''. ===== Collections ===== ==== Classe Ligne ==== Créer une classe ''Ligne'' qui contient deux champs: un champ ''numero'' qui est un ''int'' et un champ ''texte'' qui est un ''String''. Modifier ou créer un constructeur pour qu'il prenne des arguments permettant d'initialiser ces deux champs. Ajouter les deux méthodes suivantes: public int getNumero() { ... } public int getTexte() { ... } permettant de récupérer les valeurs de ces champs. ==== Modification de la méthode analyse ==== On veut modifier la méthode analyse afin qu'elle renvoie une collection de lignes (type ''Collection''). Cela nous permettra d'afficher des informations supplémentaires sur le résultat comme par exemple le nombre de lignes trouvées. Commencer par changer la signature de la méthode. L'interface ''Collection'' se trouve dans le package ''java.util''. Déclarer une variable de type ''Collection''. Comme ''Collection'' est une interface, il faut une classe qui l'implémente. On trouvera un ensemble de telles classes dans la documentation de l'interface ''Collection''. Choisir une implémentation et l'utiliser pour initialiser la variable au début de la méthode ''analyse()''. Changer les instructions qui faisaient l'affichage pour, à la place, créer une nouvelle ligne et l'ajouter à la collection. Enfin, renvoyer la collection. ==== Utilisation de la collection dans la méthode main ==== Dans la méthode ''main'', créer une variable de type ''Collection'' qui est initialisée par l'appel à la méthode ''analyse()''. Créer ensuite une variable de type ''Iterator'' que l'on initialisera grâce à la méthode ''iterator()'' de l'interface ''Collection''. Utiliser les méthodes ''next()'' et ''hasNext()'' de l' ''Iterator'' pour parcourir la collection et afficher chaque ligne précédée de son numéro. Si le résultat de l'analyse est vide, on affichera un message, sinon on affichera le nombre de lignes trouvées (chercher les bonnes méthodes dans l'interface ''Collection'').