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);
Je sais que d'autres ont mentionné String.split
, mais voici une variante qui ne donne que deux jetons (la base et l'extension):
String[] tokens = fileName.split("\\.(?=[^\\.]+$)");
Par exemple:
"test.cool.awesome.txt".split("\\.(?=[^\\.]+$)");
Rendements:
["test.cool.awesome", "txt"]
L’expression régulière indique à Java de se scinder sur toute période suivie d’un nombre quelconque de non-périodes, suivie de la fin de la saisie. Il n’existe qu’une période correspondant à cette définition (à savoir, dernière période).
Techniquement De façon rationnelle, cette technique s'appelle look positive à largeur nulle .
Par BTW, si vous voulez diviser un chemin et obtenir le nom de fichier complet, y compris, sans toutefois s'y limiter, l'extension point, en utilisant un chemin avec des barres obliques,
String[] tokens = dir.split(".+?/(?=[^/]+$)");
Par exemple:
String dir = "/foo/bar/bam/boozled";
String[] tokens = dir.split(".+?/(?=[^/]+$)");
// [ "/foo/bar/bam/" "boozled" ]
Ancienne question mais j'utilise habituellement cette solution:
import org.Apache.commons.io.FilenameUtils;
String fileName = "/abc/defg/file.txt";
String basename = FilenameUtils.getBaseName(fileName);
String extension = FilenameUtils.getExtension(fileName);
System.out.println(basename); // file
System.out.println(extension); // txt (NOT ".txt" !)
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());
}
}
Et là existe aucune fonction fiable pour cela. Considérons par exemple ce nom de fichier:
archive.tar.gz
Qu'est-ce que est l'extension? Les utilisateurs de DOS auraient préféré le nom archive.tgz
. Parfois, vous voyez stupide Les applications Windows qui décompressent d'abord le fichier (donnant un .tar
_), vous devez le rouvrir pour voir le contenu de l'archive.
Dans ce cas, une notion plus raisonnable d’extension de fichier aurait été .tar.gz
. Il y a aussi .tar.bz2
, .tar.xz
, .tar.lz
et .tar.lzma
fichier "extensions" en cours d'utilisation. Mais comment décideriez-vous, de scinder le dernier ou les deux derniers points?
La fonction Java 7 --- Files.probeContentType sera probablement beaucoup plus fiable pour détecter les types de fichiers que de faire confiance à l'extension de fichier. Pratiquement tout le monde Unix/Linux ainsi que votre navigateur Web et votre smartphone le font déjà de cette façon.
http://docs.Oracle.com/javase/6/docs/api/Java/io/File.html#getName ()
De http://www.xinotes.org/notes/note/774/ :
Java possède 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());
}
}
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".