web-dev-qa-db-fra.com

Comment obtenir le nom d'un objet File sans son extension en Java?

J'essaie d'obtenir le nom d'un objet File sans son extension, par exemple obtenir "végétation" lorsque le nom de fichier est "végétation.txt". J'ai essayé d'implémenter ce code:

openFile = fileChooser.getSelectedFile();
String[] tokens = openFile.getName().split(".");
String name = tokens[0];

Malheureusement, il renvoie un objet null. Il y a un problème juste dans la définition de l'objet String, je suppose, parce que la méthode getName() fonctionne correctement; il me donne le nom du fichier avec son extension.

Avez-vous une idée?

21
MichalB

Si vous souhaitez l'implémenter vous-même, essayez ceci:

String name = file.getName();
int pos = name.lastIndexOf(".");
if (pos > 0) {
    name = name.substring(0, pos);
}

(Cette variante ne vous laisse pas avec une chaîne vide pour un nom de fichier d'entrée comme ".txt". Si vous voulez que la chaîne soit vide dans ce cas, changez > 0 à >= 0.)


Vous pouvez remplacer l'instruction if par une affectation à l'aide d'une expression conditionnelle, si vous pensez que cela rend votre code plus lisible; voir la réponse de @ Steven par exemple. (Je ne pense pas que ce soit le cas ... mais c'est une question d'opinion.)


Il est sans doute préférable d'utiliser une implémentation que quelqu'un d'autre a écrite et testée. Apache FilenameUtils est un bon choix; voir la réponse de @ slachnick, ainsi que les questions et réponses liées.

40
Stephen C

Si vous ne voulez pas écrire ce code vous-même, vous pouvez utiliser FilenameUtils d'Apache.

FilenameUtils.getBaseName(openFile.getName());

Cela renverra le nom de fichier moins le chemin et l'extension.

20
slashnick

Je préfère couper avant le dernier index de "." être le nom de fichier. De cette façon, un nom de fichier: hello.test.txt est juste hello.test

c'est à dire.

int pos = filename.lastIndexOf(".");
String justName = pos > 0 ? filename.substring(0, pos) : filename;

Vous devez également gérer l'absence d'extension.

5
Steven

Il y a deux problèmes avec votre code ...

1) Il suffit d'utiliser "." comme argument pour diviser est interprété comme un Rejex dont vous ne voulez pas. Vous voulez un point littéral. Il faut donc y échapper ...

openFile.getName().split("\\.");

2) Vous analyserez incorrectement tout fichier avec plus d'un point. La meilleure façon de le faire est de rechercher le dernier point et d'obtenir la sous-chaîne ...

int pos = openFile.getName().lastIndexOf(".");
if(pos != -1) {
   String name = openFile.getName().substring(0, pos);
}
3
Todd

Vous pouvez essayer split("\\.");. Autrement dit, échapper essentiellement à la . car il est traité comme tous les caractères dans l'expression régulière.

2
srkavin

Le partage de chaîne # prend une expression régulière. "." correspond à n'importe quel caractère, vous obtenez donc un tableau de chaînes vides - une pour chaque place entre chaque paire de caractères.

http://docs.Oracle.com/javase/6/docs/api/Java/lang/String.html#split (Java.lang.String )

2
dokkaebi