La classe File

 

Cette classe permet d'effectuer toutes les opérations élémentaires sur un système de fichiers.

Il faudra importer java.io.File

 

Image non trouvée !L'objet File ne fournit pas d'accès direct pour lire ou écrire des données dans un fichier : ces opérations seront effectuées par des flux d'entrée/dortie héritant de InputStream/OutputStream:

- Pipes

- Filters

- RandomAccessFile

- FileReader et FileWriter

 

Image non trouvée !Cette classe File traite aussi bien les fichiers que les dossiers. En fait, les dossiers étant des fichiers un peu particulier. On aurait pu s'attendre à avoir une classe Directory étendant la classe File, mais non...

Il existe des méthodes qui vous indiquerez le type de fichier (fichier ou dossier, cf. Les attributs d'un fichier/dossier).

 

Image non trouvée !Pour rappel, \ en java sert de caractère d'échappement dans un String. Donc bien indiquer \\ dans votre code si vous entrez des chemins à la sauce Windows !

 

Constructeur de File

Il sera possible de passer un ou deux paramètres à File qui seront:

- File(String pathname) Nom du chemin/fichier
- File(String, String) le premier paramètre est le nom du parent (chemin parent), le second le nom du fichier (l'enfant, qui pourra être composé lui aussi de nom de répertoires)
- File(File, String) le premier paramètre est le répertoire parent qui est sous forme d'instance de File, le second le nom du fichier (l'enfant, qui pourra être composé lui aussi de nom de répertoires)
- File(URI uri) ou uri désigne ce fichier sous forme d'URI (file:/chemin/nom). Il pourra lever une exception de classe IllegalArgumentException si le paramètre n'est pas une URI correcte

 

listRoots

Vous allez pouvoir lister tous les roots directorys du système. Sous unix, c'est facile puisqu'il n'y en a qu'un et qu'il s'agit de /. Mais sous windows, il peut y avoir plusieurs unités de disques, donc autant de roots directorys sur le système qu'il y a de lecteurs présents.

La méthode listRoots retourne un tableau d'instance de la classe File.

 

Lister l'ensemble des fichiers/dossiers

De la même manière, il sera possible de lister l'ensemble des fichiers et des dossiers présents dans un répertoire (qui pourra éventuellement être une root directory):

Cette méthode pourra retourner null comme référence si le chemin passé en paramètre ne correspond à rien.

Vous pourrez utiliser la méthode File() listFiles() qui retourne cette fois-ci un tableau d'objet de type File. Ce qui évite de créer des instances comme vous devriez le faire avec la méthode list...

 

Image non trouvée !Pour ces deux méthodes, il sera possible d'implémenter un filtrage des informations retournées.

Soit:

String [] list(FilenameFilter filter)

File [] listFiles(FileFilter filter) ou
File [] listFiles(FilenameFilter filter)

Les attributs d'un fichier/dossier

Il est possible de lire les attributs d'un fichier:

Vous utiliserez les méthodes suivantes:

 

Mais aussi de les positionner:

Les méthodes étant setReadOnly(readable), setWritable(writable)

mais aussi setLastModified(time) pour indiquer que le fichier a été dernièrement modifié le ... Information que l'on ne récupère étrangement pas avec un getter mais directement avec LastModified (???). La valeur est un long représentant le nombre de millisecondes écoulées depuis la date du 1 janvier 1970 à 0 heure GMT. Vous utiliserez le constructeur Date(long) pour convertir cette valeur en date.

 

Connaître la taille d'un fichier

Facile, il suffit d'utiliser la méthode length().

 

Vérifier l'existence d'un fichier/répertoire

La méthode boolean exists() est là pour ça !

 

Opérations de bases sur les fichiers/dossiers

Evidemment, il sera possible de renommer, supprimer, créer des fichiers/dossiers

Création d'un dossier

Utilisation de la méthode mkdir qui va créer un répertoire si celui-ci n'existe pas.

File repertoire = new File("MonDossier");
repertoire.mkdir();

Il y a aussi la méthode mkdirs(), qui va créer tous les répertoires spécifiés dans l'objet File. Donc le répertoire final indiqué dans le chemin, mais aussi et éventuellement les répertoires parents.

En sortie (???) la méthode retourne vrai si ok, faux sinon...

 

Renommer ou déplacer un fichier/répertoire

Les méthodes renameTo() permet de renommer un fichier ou un répertoire. Comme sous Unix, elle permet dans le même temps de déplacer ce fichier ou répertoire.

Bizarre pour du JAVA, alors que l'on s'attendrait à une exception, en sortie, la méthode retourne un booleen à vrai si l'opération s'est déroulée sans problème. faux sinon et dans ce cas peut-être voir à copier le fichier et le supprimer de sa source.

 

Effacer un fichier/répertoire

La méthode delete() permet de détruire un fichier ou un répertoire.

Vilain, en sortie, la méthode retourne un booleen à vrai si l'opération s'est déroulée sans problème, faux sinon.

La méthode deleteOnExit() supprimera le fichier lorsque la machine virtuelle java se terminera de façon normale.

 

Création d'un fichier

Il sera possible et plutôt préférable de créer un fichier par l'un des constructeurs des classes flux lorsque l'on a un objet File...

La méthode createNewFile permet de créer un fichier vide.

Encore une bizarrerie de cette classe:la méthode ne va pas créer le fichier si celui-ci n'existe pas et va renvoyer un boolean pour indiquer si vrai que le fichier est bien créé, sinon faux ! Là où on ne jure que par les exceptions en java pour indiquer un problème, ici, encore c'est raté !

 

Création d'un fichier dans le répertoire temporaire

La création d'un fichier temporaire se fera par createTempFile(prefix, suffix) ou vous pourrez indiquer le prefix et le suffix de votre nom de fichier. Ou encore createTempFile(prefix, suffix, directory), avec dans ce cas, l'utilisation de la méthode deleteOnExit() pour s'assurer de la suppression des fichiers lorsque la VM s'arrêtera.

tempFile = File.createTempFile("monFichier", ".temp");

Donnera un fichier du genre monFichier12345.temp

 

Copier des fichiers

Il n'existe pas de méthode permettant de copier simplement un fichier.

Il faudra donc créer une méthode qui fera cela. Il y a deux solutions possibles:

La première (valable à partir de JAVA 1.4) consiste à utiliser la classe FileChannel pour copier des fichiers

La seconde méthode (avant JAVA 1.4) sera de passer par les flux de données et donc de recopier le fichier dans un nouveau (vous utiliserez de préférence un flux de type binaire, rendant la méthode compatible tous fichiers).

 

Les chemins relatifs, absolus, canonicales, ...

Pour rappel:

Lorsque vous utilisez un chemin relatif dans votre code, le système va construire un chemin constitué du chemin courant et du chemin relatif passé dans le code.

(Un chemin relatif commence par ./, ../ ou directement un nom de dossier, mais jamais par / sous unix ou un nom d'unité disque sous windows).

Image non trouvée !Pour déterminer le chemin courant utilisé pour un chemin relatif, vous pourrez récupérer la propriété système user.dir de la manière suivante : String s = System.getProperty("user.dir"); // Avec s qui contiendra le chemin courant.

 

Lorsque vous utilisez un chemin absolu, le système se basera uniquement sur le chemin complet passé dans votre code, et n'utilisera aucune autre référence.

Un chemin absolu commence toujours par / sous unix ou une unité de disque sous Windows. Vous pouvez aussi utiliser .. ou . à l'intérieur d'un chemin absolu.

Un chemin canonical est un chemin absolu, mais les références à .., . n'existe pas.

Ce qui donne:

C:\workspace\tst Chemin courant:. , chemin absolu:C:\workspace\tst\. , canonical:C:\workspace\tst

On voit bien que canonical a remplacé le . par le chemin correspondant.

Image non trouvée !getCanonicalPath() va plus loin encore que getAbsoluteFile() dans le cas d'un fonctionnement sous Windows, car les / seront transformés en \ et les noms de fichiers seront éventuellement en majuscule.

 

Autres méthodes:

String getName() qui retourne un string contenant le nom du fichier de l'objet File (sans mention du chemin).
String getParent() qui retourne un string contenant le répertoire parent de cet objet File. Donc le répertoire qui contient le fichier si l'objet est un fichier, soit le répertoire parent ou null (si vous êtes déjà sur la racine) si l'objet est un répertoire.
File getParentFile() qui retourne un objet File pour le parent de ce répertoire.

 

Convertir un chemin en URI

La méthode toURI() convertit un chemin de fichier en un objet URI.

 

Convertir un chemin en URL

La méthode toURL() convertit un chemin de fichier en un objet URL.

Image non trouvée !Cette méthode est obsolète. Il faudra passer par les classes URI et URL pour traduire le nom de votre fichier en nom au format URL (d'abord le traduire en URI, puis en URL).

 

Taille d'un fichier/d'une partition

long length(): Taille d'un fichier

long getTotalSpace(): Taille de la partition
long getFreeSpace(): Espace encore libre
long getUsableSpace(): Espace utilisée

 

Attributs static de la classe File

Attribut Désignation
File.separator String spécifiant le séparateur du système de fichier (/ pour unix et Macintosh, \ pour Microsoft Windows)
File.separatorChar Même chose que précédemment mais sous forme de char
File.pathSeparator Séparateur utiliser suivant le système pour indiquer différents chemins (: sur un Système Unix et ; sur les systèmes Windows et Macintosh)

 

Sélecteur de fichier

Hors sujet, mais il existe une classe JFileChooser qui propose une IHM pour ouvrir et sauvegarder des fichiers à la demande des utilisateurs.