CodeGym /Cours /JAVA 25 SELF /Classes File, Path, Files : obtention d’informations...

Classes File, Path, Files : obtention d’informations sur les fichiers

JAVA 25 SELF
Niveau 39 , Leçon 1
Disponible

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

1
Mission
JAVA 25 SELF, niveau 39, leçon 1
Bloqué
Détective du système de fichiers : quel est ce chemin ?
Détective du système de fichiers : quel est ce chemin ?
1
Mission
JAVA 25 SELF, niveau 39, leçon 1
Bloqué
Enquêteur numérique : dossier du fichier
Enquêteur numérique : dossier du fichier
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION