1. Rappel : File vs Path vs Files
Le bon vieux File
Oui… Il y a encore beaucoup de code legacy dans les projets Java. Alors rappelons encore une fois le vétéran de Java, la classe File. Elle est apparue dans le langage dès la première version et permet de travailler avec les fichiers et les dossiers : savoir si un fichier existe, son nom, sa taille, sa date de modification, créer et supprimer des fichiers et des dossiers. Comme nous le savons déjà, elle a de nombreuses limites : certaines méthodes sont contre-intuitives, toutes les opérations ne sont pas prises en charge de manière multiplateforme, et certaines méthodes renvoient non pas des exceptions, mais simplement false (ce qui n’est pas toujours pratique pour le débogage).
import java.io.File;
File file = new File("example.txt");
System.out.println("Le fichier existe ? " + file.exists());
System.out.println("Est-ce un fichier ? " + file.isFile());
System.out.println("Est-ce un dossier ? " + file.isDirectory());
Path et Files : regard moderne (Java 7+)
Avec Java 7 est apparu le package java.nio.file, qui offre des outils plus puissants et plus flexibles. Deux protagonistes clés :
- Path — une interface qui décrit le chemin vers un fichier ou un dossier. On peut dire que c’est « une chaîne avec de l’intelligence » : elle sait analyser, concaténer, examiner et comparer des chemins.
- Files — une classe utilitaire avec une foule de méthodes statiques pour travailler avec les fichiers et les dossiers : création, suppression, copie, lecture, écriture, récupération d’informations.
import java.nio.file.Path;
import java.nio.file.Paths;
Path path = Paths.get("example.txt");
System.out.println("Chemin : " + path);
Bon à savoir : la classe Path n’est pas qu’une simple chaîne ! Elle connaît les séparateurs de dossiers, sait traiter les chemins relatifs et absolus et fonctionne tout aussi bien sous Windows et Linux.
Tableau comparatif de File et Path/Files
| Critère | File (ancienne API) | Path + Files (API moderne) |
|---|---|---|
| Syntaxe | Style POO | Combinaison Path + méthodes statiques Files |
| Multiplateforme | Partielle | Excellente, tient compte de l’OS |
| Exceptions | Pas toujours | Presque toujours |
| Nouvelles possibilités | Non | Oui (attributs, droits, liens, etc.) |
| Recommandé | Plutôt non | Oui |
2. Récupérer des informations sur un fichier/dossier
Voyons comment connaître l’essentiel à propos d’un fichier ou d’un dossier : s’il existe, son type (fichier ou dossier), sa taille, son nom, son chemin et son dossier parent.
Vérification de l’existence
Via File
File file = new File("example.txt");
if (file.exists()) {
System.out.println("Le fichier existe !");
} else {
System.out.println("Fichier introuvable.");
}
Via Path et Files
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
Path path = Paths.get("example.txt");
if (Files.exists(path)) {
System.out.println("Le fichier existe !");
} else {
System.out.println("Fichier introuvable.");
}
Conseil : pour les nouveaux projets, utilisez toujours Path et Files. C’est plus sûr, plus pratique et multiplateforme.
Vérifier le type : fichier ou dossier
File
if (file.isFile()) {
System.out.println("C'est un fichier.");
} else if (file.isDirectory()) {
System.out.println("C'est un dossier.");
}
Path + Files
if (Files.isRegularFile(path)) {
System.out.println("C'est un fichier.");
} else if (Files.isDirectory(path)) {
System.out.println("C'est un dossier.");
}
Obtenir la taille d’un fichier
File
long size = file.length();
System.out.println("Taille du fichier : " + size + " octets");
Path + Files
try {
long size = Files.size(path);
System.out.println("Taille du fichier : " + size + " octets");
} catch (IOException e) {
System.out.println("Erreur lors de l’obtention de la taille du fichier : " + e.getMessage());
}
Attention : pour un dossier, la méthode length() renverra toujours 0, et Files.size(path) lèvera une IOException. La taille d’un dossier est la somme des tailles de tous les fichiers qu’il contient (plus de détails dans les prochaines leçons).
Obtenir un chemin absolu et relatif
File
System.out.println("Chemin relatif : " + file.getPath());
System.out.println("Chemin absolu : " + file.getAbsolutePath());
Path
System.out.println("Chemin relatif : " + path);
System.out.println("Chemin absolu : " + path.toAbsolutePath());
Obtenir le nom du fichier et le dossier parent
File
System.out.println("Nom du fichier : " + file.getName());
System.out.println("Dossier parent : " + file.getParent());
Path
System.out.println("Nom du fichier : " + path.getFileName());
System.out.println("Dossier parent : " + path.getParent());
Astuce : Path sait travailler non seulement avec les fichiers, mais aussi avec les dossiers, les chemins relatifs et absolus, et il sait facilement décomposer un chemin en segments.
3. Récupération des attributs de fichier
Parfois, on veut savoir non seulement la taille et le nom du fichier, mais aussi des informations plus intéressantes : date de création, date de dernière modification, droits d’accès.
Date de création, dernière modification
File (limité)
long lastModified = file.lastModified();
System.out.println("Date de dernière modification : " + new java.util.Date(lastModified));
Inconvénient : impossible d’obtenir la date de création du fichier via File !
Path + Files
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.attribute.FileTime;
try {
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
FileTime creationTime = attrs.creationTime();
FileTime lastModifiedTime = attrs.lastModifiedTime();
System.out.println("Date de création : " + creationTime);
System.out.println("Date de dernière modification : " + lastModifiedTime);
} catch (IOException e) {
System.out.println("Erreur lors de l’obtention des attributs : " + e.getMessage());
}
Vérification des droits d’accès
File
System.out.println("Peut-on lire ? " + file.canRead());
System.out.println("Peut-on écrire ? " + file.canWrite());
System.out.println("Peut-on exécuter ? " + file.canExecute());
Path + Files
System.out.println("Peut-on lire ? " + Files.isReadable(path));
System.out.println("Peut-on écrire ? " + Files.isWritable(path));
System.out.println("Peut-on exécuter ? " + Files.isExecutable(path));
Bon à savoir : sous Windows, les droits d’accès sont limités, tandis que sur les systèmes Unix, on peut obtenir et modifier beaucoup plus de droits (par exemple via les attributs POSIX).
4. Erreurs courantes lors de la récupération d’informations sur les fichiers
Erreur n° 1 : utiliser File alors qu’il faut Path.
Beaucoup de débutants continuent d’utiliser File, parce que c’est plus simple ou « parce que sur Internet tout le monde fait comme ça ». Mais avec Path et Files, on peut faire la même chose, de manière plus fiable et moderne.
Erreur n° 2 : vérifier le type d’objet uniquement via File.
Si vous n’utilisez que file.isFile() et file.isDirectory(), vous pouvez passer à côté de fichiers « spéciaux » (liens symboliques, périphériques). L’API moderne propose Files.isRegularFile(path), Files.isDirectory(path) et d’autres vérifications.
Erreur n° 3 : ignorer les exceptions.
Les méthodes Files.size(path) et Files.readAttributes(...) lèvent une IOException. Si vous ne traitez pas les exceptions, le programme plantera à la première erreur d’accès ou si le fichier disparaît pendant l’exécution.
Erreur n° 4 : s’attendre à pouvoir connaître directement la taille d’un dossier.
La méthode Files.size(path) lèvera une exception pour un dossier. Pour connaître la taille d’un dossier, il faut additionner récursivement les tailles de tous les fichiers qu’il contient.
Erreur n° 5 : vérification insuffisante des droits d’accès.
Même si le fichier existe, vous pouvez ne pas avoir les droits de lecture ou d’écriture. Vérifiez toujours les droits avant les opérations : Files.isReadable(path), Files.isWritable(path), Files.isExecutable(path).
GO TO FULL VERSION