File
. Cet objet peut représenter indifféremment un fichier ou un répertoire, avec ou sans chemin d'accès, relatif ou absolu. Il est important de noter que cette instance est une notion abstraite, qui ne représente pas nécessairement un fichier réel existant. Comme nous allons le voir, les méthodes exposées par cette classe permettent d'interroger le système de fichier, afin de savoir entre autres si ce fichier existe, s'il s'agit d'un répertoire, si l'on peut le lire, etc...
File
ne permet pas d'écrire ou de lire le contenu d'un fichier, mais bien de manipuler ce fichier en tant que tel.
La classe
File
définit la notion de chemin dans un système de fichiers. Ce chemin se compose de deux éléments.
/
), une lettre de lecteur sous Windows (
D:
) ou un double anti-slash pour les éléments de réseau Windows (
\\
, qui s'écrit en fait
\\\\
du fait qu'il faut échapper l'anti-slash dans le code Java). Ce préfixe est optionnel.
File
, sous deux formes :
separator
: sous forme de chaîne de caractère ;
separatorChar
: sous forme de caractère.
Exemple 111. Utilisation de
File.separator
// utilisation de StringBuffer pour éviter les concaténation // de chaînes de caractères StringBuffer accessFileName = new StringBuffer() ; accessFileName.append("tmp").append(File.separator).append("access.log") ; System.out.println(accessFileName) ;
tmp/access.logEt le résultat suivant sous Windows :
tmp\access.log
File
peut représenter un chemin vers un répertoire ou un fichier. Dans les deux cas, ce chemin peut être absolu ou relatif. Un chemin relatif est toujours mesuré par rapport au répertoire courant dans lequel s'exécute l'application. On y a accès par une propriété système de la machine Java :
user.dir
.
D:\projets\TD\workspace\exo-03Notons, rappelons que les instances de
File
représentent des fichiers ou des répertoires abstraits, qui n'existent pas nécessairement dans le système de fichiers courant.
Enfin, on peut noter aussi que la classe
File
est
immutable
. Une fois fixé le chemin d'une instance, on ne peut plus le modifier.
File
admet quatre constructeurs. Ces constructeurs peuvent prendre des noms de fichiers écrits dans des chaînes de caractères. Dans ce cas, le caractère de séparation éventuellement présent dans cette chaîne est automatiquemet reconnu. Sous Unix, ce caractère doit être le slash (
/
). Sous Windows, à la fois le slash (
/
) et l'anti-slash échappé (
\\
) sont reconnus.
File(String pathname)
: prend en paramètre une chaîne de caractères qui indique un chemin, relatif ou absolu, vers un fichier ou un répertoire.
File(String parent, String child)
: prend deux chaînes de caractères en paramètre. La première indique le chemin vers le fichier ou le répertoire. La seconde le nom de ce ficher ou répertoire.
File(File parent, String child)
: ce constructeur est analogue au précédent, sauf que le chemin est exprimé sous la forme d'une instance de
File
.
File(URI uri)
: ce dernier constructeur prend en paramètre une URI.
File
surcharge
equals()
et
hashCode()
, de même que
toString()
. Cette dernière méthode affiche juste le fichier ou le répertoire représenté par cette instance de
File
.
De plus, la classe
File
implémente
Comparable
. L'ordre choisi est simplement l'ordre lexicographique du nom du fichier ou du répertoire représenté. On prendra garde que sous Unix les différences entre majuscules et minuscules sont supportées, ce qui n'est pas le cas sous Windows.
isFile()
,
isDirectory()
: permettent de tester si cette instance de
File
représente un fichier ou un répertoire.
exists()
,
canRead()
,
canWrite()
,
canExecute()
: permettent de tester différents éléments sur le fichier ou le répertoire représenté par cette instance de
File
.
setReadable(boolean b)
,
setWritable(boolean b)
,
setExecutable(boolean b)
: permettent de modifier la propriété correspondante du fichier ou du répertoire. Ces méthodes peuvent prendre un booléen supplémentaire, qui indique si la propriété correspondante doit être modifiée pour tous les utilisateurs, ou uniquement pour le propriétaire du fichier ou du répertoire.
lastModified()
et
setLastModified()
: permettent de manipuler la date de dernière modification de ce fichier ou de ce répertoire.
length()
: retourne la taille du fichier sous forme d'un
long
quand cette instance de
File
représente un fichier. Le résultat n'est pas prévisible si cette instance représente un répertoire.
isHidden()
: permet de savoir si ce fichier ou répertoire est caché ou non. Notons que la notion de fichier caché est différente sous Unix et Windows. Sous Unix, un fichier est caché s'il commence par un point (
.
). Sous Windows, chaque fichier possède un attribut particulier qui indique s'il est caché ou non.
getName()
: retourne le nom de ce fichier ou répertoire, sans son chemin d'accès s'il est précisé. Ce nom correspond au dernier élément de la séquence de nom de cette instance de
File
.
getParent()
: retourne le nom du parent de ce fichier ou répertoire. Le parent est défini par la séquence complète des noms, stockée dans cette instance de
File
, de laquelle on a retiré le dernier élément, qui correspond par convention au nom de ce fichier ou répertoire.
getPath()
: retourne le chemin complet de ce fichier. Le retour de cette méthode est le même que celui de la méthode
toString()
.
getAbsolutePath()
: le retour de cette méthode diffère si l'instance de
File
représente un chemin absolu ou pas. Si ce chemin est absolu, le retour de cette méthode est le même que
getPath()
. S'il ne l'est pas, un chemin absolu est calculé, relativement au répertoire courant de l'application.
getCanonicalPath()
: le calcul de ce chemin est plus complexe que dans les cas précédents. Le chemin retourné est le chemin direct vers le fichier ou le répertoire représenté. La machine Java supprime de ce chemin les mouvements via le répertoire
..
notamment, et identifie les éventuels raccourcis ou liens symboliques, qu'elle remplace par les vrais chemins dans le système de fichier. La détermination du chemin final peut donc générer des requêtes sur le système de fichier, qui peuvent échouer. Aussi cette méthode peut-elle jeter l'exception
IOException
.
File
.
createNewFile()
: demande la création de ce fichier au système de fichier. Cette création ne peut se faire que si le fichier à créer n'existe pas déjà. Si la création n'a pu avoir lieu alors cette méthode retourne
false
. Si une erreur a été rencontrée, alors la méthode jette une
IOException
.
delete()
: demande l'effacement de ce fichier ou répertoire. Retourne
false
si cet effacement n'a pu avoir lieu.
mkdir()
et
mkdirs()
: ces deux méthodes créent le répertoire représenté par cette instance de
File
.
mkdirs()
peut créer une série de répertoires imbriqués, ce qui n'est pas le cas de
mkdir()
. Retourne
false
si la création n'a pas pu se faire.
deleteOnExit()
: demande à la machine Java d'effacer automatiquement ce fichier ou ce répertoire quand l'application se termine. Si plusieurs fichiers ou répertoires sont enregistrés de la sorte, alors ils sont effacés en commençant par le dernier qui a été enregistré. L'effacement ne peut se faire que si la JVM s'éteint normalement, sans plantage.
File
, qui permettent de créer des fichiers temporaires :
createTempFile(String prefix, String suffix, File directory)
et
createTempFile(String prefix, String suffix)
.
La machine Java garantit deux choses sur ces fichiers :
prefix
, puis est complété par un code unique, qui garantit l'unicité du fichier créé. L'extension de ce fichier est
prefix
, ou
.tmp
si
prefix
est nul.
Ces méthodes créent et retournent un fichier temporaire vide dans le répertoire passé en paramètre. Si ce paramètre est nul, alors un répertoire temporaire est utilisé par défaut, fixé par la propriété système
java.io.tmpdir
.
Si le paramètre
suffix
est nul, alors le fichier aura pour extension
.tmp
.
Si l'on souhaite que les fichiers temporaires soient effacés à la fermeture de l'application, alors il faut les enregistrer par appel à la méthode
deleteOnExit()
.
getFreeSpace()
: retourne un
long
qui porte le nombre d'octets utilisables sur la partition sur laquelle se trouve le fichier interrogé. On prendra garde qu'aucun test n'est fait pour savoir si cette l'application a le droit d'écrire sur cette partition. Il est par conséquent possible qu'aucun de ces octets ne soit disponible.
getUsableSpace()
: retourne un
long
qui porte le nombre d'octets utilisables sur la partition sur laquelle se trouve le fichier interrogé. Cette estimation est plus précise que
getFreeSpace()
. Effectivement, la machine Java vérifie un certain nombre de choses pour déterminer cet espace, comme les droits en écriture.
getTotalSpace()
: retourne un
long
qui porte le nombre d'octets de cette partition.
File
expose quelques méthodes utiles pour lire le contenu d'un répertoire. Bien sûr, l'utilisation de ces méthodes n'a de sens que si l'instance de
File
représente un répertoire et non pas un fichier. Ces méthodes existent toutes en deux versions : la première retourne des tableaux de
String
, représentant les noms des fichiers se trouvant dans le répertoire, la seconde retournant des tableaux de
File
. Dans tous les cas, on ne peut pas prévoir l'ordre dans lequel ces fichiers apparaissent dans le tableau.
Certaines de ces méthodes prennent en paramètre des objets de type
FileFilter
ou
FilenameFilter
. Ces deux interfaces modélisent des filtres sur les fichiers. La première interface définit une méthode
accept(File file)
, la seconde
accept(File dir, String name)
. Les paramètres de ces deux méthodes définissent en fait un unique fichier, de deux façons différentes. Si cette méthode retourne
true
, alors le fichier est accepté, et sera présent dans le tableau retourné, sinon ça ne sera pas le cas.
list()
: retournent tous les fichiers et répertoires de ce répertoire.
listeFiles()
: retournent tous les fichiers (sans les répertoires) de ce répertoire.
listFiles(FileFilter)
et
listFiles(FilenameFilter)
: retournent tous les fichiers (sans les répertoires) de ce répertoire, qui satisfont le filtre passé en paramètre.
.java
contenus dans un répertoire.
Exemple 113. Utilisation de
listFiles(FileFilter)
// répertoire de recherche String rep = "D:/workspace/td-04/src/org/paumard/file" ; // construction d'un fichier sur ce répertoire File repFile = new File(rep) ; // filtrage du contenu de ce répertoire // on passe en paramètre une instance de classe anonyme File [] fichiersJava = repFile.listFiles(new FileFilter() { // cette interface n'a qu'une unique méthode public boolean accept(File pathname) { // on récupère le nom de ce fichier... String fileName = pathname.getName() ; // ... et on teste s'il se termine par .java return fileName.endsWith(".java") ; } }) ; // il ne reste plus qu'à afficher les noms des fichiers // récupérés for (File fichierJava : fichiersJava) { System.out.println(fichierJava.getName()) ; }
Main.java Marin.javaNotons également la méthode statique
listRoots()
, qui retourne la liste des éléments racine du système de fichier sur lequel on se trouve. Sous Unix, il n'y en a qu'un seul :
/
, mais sous Windows, on peut en avoir plusieurs.
Exemple 114. Utilisation de
File.listRoots()
// liste des éléments racine du système de fichier courant File [] roots = File.listRoots() ; // affichage du tableau résultat System.out.println(Arrays.toString(roots)) ;
[C:\, D:\, E:\, F:\, G:\]
toURI()
, comme son nom le laisse supposer, permet de construire une URI à partir de ce fichier. L'URI d'un fichier se compose du préfixe
file:/
suivi du nom complet de ce fichier.
La méthode
toURL()
est dépréciée, et ne doit être utilisée en aucun cas. La classe
URL
, malgré son nom sympathique, est une classe qui comporte de nombreux problèmes, et qui ne doit être utilisée sous aucun prétexte. On utilise à la place la classe
URI
, depuis Java 4.
String
StringBuffer
et
StringBuilder