93 votes

Java: diviser le nom du fichier en une base et une extension

Existe-t-il un meilleur moyen d’obtenir le nom de fichier et l’extension du fichier que quelque chose comme:

 File f = ...
String name = f.getName();
int dot = name.lastIndexOf('.');
String base = (dot == -1) ? name : name.substring(0, dot);
String extension = (dot == -1) ? "" : name.substring(dot+1);
 

176voto

Adam Paynter Points 22056

Je sais que d'autres ont mentionné String.split, mais ici, c'est une variante que seuls les rendements des deux jetons (la base et de l'extension):

String[] tokens = fileName.split("\\.(?=[^\\.]+$)");

Par exemple:

"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");

Rendements:

["test.cool.awesome", "txt"]

L'expression régulière raconte Java à split, sur toute la période est suivie par un certain nombre de non-périodes, suivie par la fin de l'entrée. Il n'y a qu'une seule période, qui correspond à cette définition (à savoir, la dernière période).

Techniquement parlant, cette technique est appelée" zéro-largeur d'anticipation positif.

90voto

Oibaf it Points 374

Ancienne question mais j'utilise habituellement cette solution:

 import org.apache.commons.io.FilenameUtils;

String basename = FilenameUtils.getBaseName(fileName);
String extension = FilenameUtils.getExtension(fileName);
 

8voto

Erhan Bagdemir Points 2838

Source: http://www.java2s.com/Code/Java/File-Input-Output/Getextensionpathandfilename.htm

une telle classe d'utilité:

 class Filename {
  private String fullPath;
  private char pathSeparator, extensionSeparator;

  public Filename(String str, char sep, char ext) {
    fullPath = str;
    pathSeparator = sep;
    extensionSeparator = ext;
  }

  public String extension() {
    int dot = fullPath.lastIndexOf(extensionSeparator);
    return fullPath.substring(dot + 1);
  }

  public String filename() { // gets filename without extension
    int dot = fullPath.lastIndexOf(extensionSeparator);
    int sep = fullPath.lastIndexOf(pathSeparator);
    return fullPath.substring(sep + 1, dot);
  }

  public String path() {
    int sep = fullPath.lastIndexOf(pathSeparator);
    return fullPath.substring(0, sep);
  }
}
 

usage:

 public class FilenameDemo {
  public static void main(String[] args) {
    final String FPATH = "/home/mem/index.html";
    Filename myHomePage = new Filename(FPATH, '/', '.');
    System.out.println("Extension = " + myHomePage.extension());
    System.out.println("Filename = " + myHomePage.filename());
    System.out.println("Path = " + myHomePage.path());
  }
}
 

6voto

Igor Points 111

http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName ()

De http://www.xinotes.org/notes/note/774/ :

Java a des fonctions intégrées pour obtenir le nom de base et le nom de répertoire pour un chemin de fichier donné, mais les noms de fonction ne sont pas aussi évidents.

 import java.io.File;

public class JavaFileDirNameBaseName {
    public static void main(String[] args) {
    File theFile = new File("../foo/bar/baz.txt");
    System.out.println("Dirname: " + theFile.getParent());
    System.out.println("Basename: " + theFile.getName());
    }
}
 

2voto

Mot Points 5281

Quel est le problème avec votre code? Enveloppé dans une méthode utilitaire soignée c'est bien.

Ce qui est plus important, c’est ce qu’il faut utiliser comme séparateur - le premier ou le dernier point. Le premier est mauvais pour les noms de fichier comme "setup-2.5.1.exe", le dernier est mauvais pour les noms de fichier avec plusieurs extensions comme "mybundle.tar.gz".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X