web-dev-qa-db-fra.com

Division de noms de fichiers à l'aide du symbole séparateur de fichiers système

J'ai un chemin de fichier complet et je veux obtenir le nom du fichier.

J'utilise l'instruction suivante:

String[] splittedFileName = fileName.split(System.getProperty("file.separator"));
String simpleFileName = splittedFileName[splittedFileName.length-1];

Mais sous Windows cela donne:

Java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
 ^

Puis-je éviter cette exception? Y a-t-il une meilleure manière de faire cela?

Le problème est que \ doit être échappé pour pouvoir l’utiliser comme barre oblique inverse dans une expression régulière. Vous devez soit utiliser une API de scission qui n'a pas utiliser des expressions régulières , ou utilisez Pattern.quote first:

// Alternative: use Pattern.quote(File.separator)
String pattern = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(pattern);

Ou mieux encore, utilisez l'API File pour cela:

File file = new File(fileName);
String simpleFileName = file.getName();
37
Jon Skeet

Lorsque vous écrivez un nom de fichier, vous devez utiliser System.getProperty("file.separator").

Lorsque vous lisez un nom de fichier, vous pouvez éventuellement utiliser la barre oblique ou la barre oblique comme séparateur de fichier.

Vous voudrez peut-être essayer ce qui suit:

fileName = fileName.replace("\\", "/");
String[] splittedFileName = fileName.split("/"));
String simpleFileName = splittedFileName[splittedFileName.length-1];
5
Gilbert Le Blanc

Un autre moyen plus simple pourrait être de faire

File f = new File(path);
String fileName = f.getName();

Je pense que cela fonctionnera si les chemins sont compatibles avec la plate-forme, c’est-à-dire pas sûr que le chemin "c:\fichier.txt" fonctionnera sous Linux ou non.

2
Kalpak Gadre

Tout d’abord, pour ce problème spécifique, je vous recommande d’utiliser la classe Java.util.File au lieu d’une expression régulière.

Cela étant dit, la source du problème que vous rencontrez est que le caractère barre oblique inversée '\' signifie une séquence d'échappement dans les expressions régulières Java. Ce qui se passe, c'est que l'analyseur des expressions rationnelles voit la barre oblique inverse et s'attend à ce qu'il y ait un autre caractère après celle-ci, qui compléterait la séquence d'échappement. Le moyen le plus simple de contourner ce problème consiste à utiliser la méthode Java.util.regex.Pattern.quote (), qui échappera à tous les caractères spéciaux de la chaîne que vous lui avez fournie.

Avec ce changement, votre code devient:

String splitRegex = Pattern.quote(System.getProperty("file.separator"));
String[] splittedFileName = fileName.split(splitRegex);
String simpleFileName = splittedFileName[splittedFileName.length-1];
0
Mike Deck