Mission
- Concevoir et programmer un lecteur de système de fichiers.
- Vocabulaire à connaître à l'issue du TD : méthode abstraite, classe abstraite, méthode statique, ArrayList
Cahier des charges
On veut écrire un programme qui permet de lister (récursivement) les fichiers et dossiers d'un répertoire donné. Ainsi, la commande java ReadFS /etc/sysconfig/
permet de lister le contenu du répertoire /etc/sysconfig de la manière suivante : Affichage_Voulu.txt
Étapes
- Pour commencer, chargez FileInfo.java, générez son javadoc avec la commande
javadoc -d TrouverUnNomPasTropBete FileInfo.java
et examinez la documentation produite avec firefox.
Vous constaterez que toutes les méthodes sont statiques. On les invoque donc sur la classe, pas sur un objet. - Vous aurez souvent besoin de cette classe FileInfo, examinez-bien toutes ses méthodes.
- Créez une classe Node (qui représente un node sur le système de fichier, c'est-à-dire un fichier ou un répertoire). Un Node contient :
- Le chemin absolu vers le fichier ou répertoire qu'il représente, par exemple "/home/dupont/fichier.txt"
- Le nom du fichier ou répertoire, par exemple "fichier.txt"
- La taille du fichier ou du répertoire (utiliser le type long).
- Un constructeur qui reçoit en argument le chemin et la taille.
- Une méthode abstraite afficher(). Une méthode abstraite n'a pas de corps, elle se déclare comme ceci :
public
Lorsqu'une classe contient une méthode abstraite (sans corps), elle doit aussi être déclarée abstraite (au début du fichier Node.java) :abstract
void afficher() ;public
abstract
class Node {
- Créez deux sous-classes de Node : Fichier et Dossier
- Le constructeur de Fichier ne reçoit en argument que le chemin absolu. Il trouve la taille du fichier tout seul.
- Comme la méthode afficher est abstraite dans la classe Node, il faut obligatoirement la redéfinir dans les sous-classes de Node. L'affichage d'un fichier consiste à afficher son nom et sa taille.
- La classe Dossier est plus compliquée car un dossier contient des Nodes (fichier ou répertoires contenus dans le dossier) :
- Les éléments (nodes) appartenant au dossier sont mis dans un attribut de type ArrayList<Node> (à vous de trouver la doc des ArrayList) :
ArrayList<Node> elements ;
- Le constructeur de Dossier ne reçoit en argument que le chemin absolu. Il détermine tout seul quels sont les éléments (Nodes) contenus dans le dossier.
- La taille d'un dossier est la somme des tailles de ses éléments.
- Afficher un dossier revient à afficher récursivement ses éléments (voir l'exemple ci-dessus).
- Les éléments (nodes) appartenant au dossier sont mis dans un attribut de type ArrayList<Node> (à vous de trouver la doc des ArrayList) :
- Dans la méthode main (que vous placez où bon vous semble, par exemple dans une classe à part), le premier argument de la ligne de commande
args[0]
est utilisé comme chemin vers un dossier à afficher.
Pour améliorer
- Pour faire un affichage décalé selon la profondeur des dossiers (comme dans l'exemple), passez un argument à la méthode afficher :
String marge
qui représente la marge à ajouter à gauche lors de l'affichage (c'est une chaîne comprenant un certain nombre d'espaces qui augmente à chaque appel récursif.) - Fixez une profondeur maximale à ne pas dépasser (par exemple 2), et faites-en sorte que l'exploration récursive des dossiers s'arrête lorsque l'on atteint la profondeur indiquée.
- Fixez un nombre maximal de Nodes à créer (par exemple 100), et faites-en sorte que l'exploration s'arrête dès que le nombre max de Nodes est atteint.
- Triez alphabétiquement les nodes d'un dossier.