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
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
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).
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...
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).
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.
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.
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.