HOWTO · Java

Comment obtenir l'extension de fichier d'un fichier en Java

Ce billet présente la façon d'obtenir l'extension d'un fichier en Java.

Sur cette page

Une extension de fichier est le suffixe qui suit le dernier point d’un nom, comme pdf dans student-records.pdf. Java ne propose pas d’accesseur d’extension dédié sur File ou String : il faut donc soit appeler un utilitaire comme FilenameUtils d’Apache Commons IO, soit repérer soi-même le dernier point avec les méthodes de String. Les deux approches sont présentées ci-dessous, ainsi que les règles qui garantissent leur exactitude sur les chemins complets.

Obtenir une extension de fichier avec Apache Commons IO

FilenameUtils.getExtension() renvoie le texte situé après le dernier point d’un nom de fichier ou d’un chemin. La méthode connaît déjà les deux séparateurs / et \, si bien qu’un point dans un nom de répertoire n’est jamais pris pour une extension, et elle renvoie "" lorsque le nom ne contient pas d’extension exploitable.

La classe ne fait pas partie du JDK : ajoutez la dépendance commons-io à votre projet via Maven ou Gradle, ou placez le JAR sur le classpath. Après avoir ajouté la dépendance, importez org.apache.commons.io.FilenameUtils et appelez String extension = FilenameUtils.getExtension(fileName);. Avec fileName égal à student-records.pdf, elle renvoie pdf.

Comme la bibliothèque externe est requise à la compilation, cet appel d’API est présenté en ligne ; les exemples exécutables ci-dessous n’utilisent que le JDK.

Extraire une extension avec les méthodes de chaînes de caractères de Java

Aucune bibliothèque n’est nécessaire pour un simple nom de fichier : lastIndexOf('.') repère le dernier point et substring() prend tout ce qui le suit.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

public class SimpleTesting {
  public static void main(String[] args) {
    String fileName = "student-records.pdf";
    int dot = fileName.lastIndexOf('.');
    String extension = dot > 0 ? fileName.substring(dot + 1) : "";
    System.out.println("File extension is : " + extension);
  }
}

Sortie :

File extension is : pdf

Le test dot > 0 couvre deux cas où il n’y a pas d’extension à signaler : readme produit "" parce que lastIndexOf renvoie -1, et un point initial comme dans .env est traité comme un marqueur de nom plutôt que comme un séparateur d’extension. Ce que cette forme courte ne peut pas voir, c’est si le point se trouve dans une partie répertoire du nom ; cela exige la version sensible au chemin présentée ensuite.

Gérer les chemins et les cas limites

Sur un chemin complet, le point de l’extension doit se situer après le dernier séparateur de chemin. L’assistant ci-dessous vérifie à la fois / et \, de sorte qu’un dossier contenant un point comme data.d ne pollue pas le résultat. Il renvoie "" lorsque le point est absent, lorsque le nom commence par un point et lorsqu’il se termine par un point :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

public class SimpleTesting {

  static String fileExtension(String path) {
    if (path == null) {
      return "";
    }
    int dot = path.lastIndexOf('.');
    int sep = Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\'));
    if (dot <= sep + 1 || dot == path.length() - 1) {
      return "";
    }
    return path.substring(dot + 1);
  }

  public static void main(String[] args) {
    String[] names = {
        "folder/s.gr/fg/student-records.pdf",
        "C:\\data.d\\reports\\summary.txt",
        "folder.d/README",
        "folder/.hidden",
        "archive.tar."
    };
    for (String name : names) {
      System.out.println(name + " -> '" + fileExtension(name) + "'");
    }
  }
}

Sortie :

folder/s.gr/fg/student-records.pdf -> 'pdf'
C:\data.d\reports\summary.txt -> 'txt'
folder.d/README -> ''
folder/.hidden -> ''
archive.tar. -> ''

Le point est comparé à sep + 1, et pas seulement à sep, donc un point en première position du dernier segment du nom donne également "" ; cet assistant traite .hidden comme un fichier caché sans extension. FilenameUtils.getExtension() applique le même contrôle de séparateur mais fait un choix différent dans ce cas et renvoie hidden pour .hidden ; les deux s’accordent sur "" pour folder.d/README et archive.tar.. Choisissez la convention que vos appelants attendent.

Choisir la bonne approche

Utilisez FilenameUtils.getExtension() lorsque Apache Commons IO est déjà sur votre classpath ou lorsque vous voulez un résultat éprouvé en un seul appel ; elle gère nativement les deux séparateurs et les répertoires contenant des points. Préférez la version String lorsque vous voulez zéro dépendance, que vous ne pouvez pas ajouter de bibliothèque, ou que vous avez besoin d’une règle personnalisée comme le comportement de point initial montré ci-dessus ; vous devez alors gérer vous-même les contrôles de séparateur et de point final.

Pour la plupart des projets qui font déjà des entrées-sorties de fichiers, FilenameUtils.getExtension() est le choix le plus simple et le plus sûr. Pour un petit utilitaire ou un classpath restreint, l’assistant sensible au chemin couvre le même terrain en quelques lignes.