345 votes

Comment obtenir le nom de fichier sans l'extension en Java ?

Quelqu'un peut-il me dire comment obtenir le nom du fichier sans l'extension ? Par exemple :

fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";

0 votes

524voto

Ulf Lindback Points 5235

Si, comme moi, vous préférez utiliser le code d'une bibliothèque où l'on a probablement pensé à tous les cas particuliers, comme ce qui se passe si l'on passe en mode null ou des points dans le chemin mais pas dans le nom du fichier, vous pouvez utiliser ce qui suit :

import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);

88 votes

Vous pouvez également utiliser FilenameUtils.getBasename pour passer directement d'une chaîne de chemin à un nom de fichier sans extension.

0 votes

Où trouvez-vous le .jar pour ça ?

2 votes

Le plus simple est bien sûr d'exécuter maven :-) Sinon, voir : commons.apache.org/io

191voto

brianegge Points 12857

Le moyen le plus simple est d'utiliser une expression régulière.

fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");

L'expression ci-dessus supprimera le dernier point suivi d'un ou plusieurs caractères. Voici un test unitaire de base.

public void testRegex() {
    assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
    assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}

12 votes

Regex n'est pas aussi facile à utiliser que la solution de bibliothèque ci-dessus. Elle fonctionne, mais en regardant le code (sans avoir à interpréter la REGEX), ce qu'elle fait n'est pas évident.

5 votes

GustavoLitovsky Android n'est pas livré avec org.apache.commons . Pour autant que je sache, c'est le seul moyen de le faire dans Android.

1 votes

/* la regex suivante supprime également le chemin */ "/the/path/name.extension".replaceAll(".*[ \\\\ /]| \\. [^ \\. ]*$","") ;

57voto

paxdiablo Points 341644

Voir le programme de test suivant :

public class javatemp {
    static String stripExtension (String str) {
        // Handle null case specially.

        if (str == null) return null;

        // Get position of last '.'.

        int pos = str.lastIndexOf(".");

        // If there wasn't any '.' just return the string as is.

        if (pos == -1) return str;

        // Otherwise return the string, up to the dot.

        return str.substring(0, pos);
    }

    public static void main(String[] args) {
        System.out.println ("test.xml   -> " + stripExtension ("test.xml"));
        System.out.println ("test.2.xml -> " + stripExtension ("test.2.xml"));
        System.out.println ("test       -> " + stripExtension ("test"));
        System.out.println ("test.      -> " + stripExtension ("test."));
    }
}

qui sort :

test.xml   -> test
test.2.xml -> test.2
test       -> test
test.      -> test

0 votes

Quelle est l'extension de foo.tar.gz ? Je peux comprendre pourquoi .tar.gz serait ce que vous voudriez.

5 votes

@tchrist, foo.tar.gz est une version gzippée de foo.tar donc vous pourriez aussi argumenter que gz était l'extension. Tout se résume à comment vous définissez l'extension.

2 votes

Que faire avec des fichiers comme .gitignore ?

46voto

Jonik Points 18905

Si votre projet utilise Goyave (14.0 ou plus récent), vous pouvez opter pour la solution suivante Files.getNameWithoutExtension() .

(Essentiellement la même chose que FilenameUtils.removeExtension() d'Apache Commons IO, comme l'a fait la réponse la plus votée suggère. Je voulais juste signaler que Guava fait ça aussi. Personnellement, je n'ai pas voulu ajouter de dépendance à Commons - qui me semble être un peu une relique - juste à cause de cela).

2 votes

En fait, c'est plutôt FilenameUtils.getBaseName()

0 votes

En fait, guava est une librairie tellement instable que j'évite de l'utiliser dès que je le peux. je préfère une relique stable que des expériences par googel

5voto

Dan J Points 7314

Bien que je sois un grand partisan de la réutilisation des bibliothèques, la org.apache.commons.io JAR est de 174KB, ce qui est remarquablement grand pour une application mobile.

Si vous téléchargez le code source et que vous jetez un coup d'œil à la classe FilenameUtils, vous verrez qu'il y a beaucoup d'utilitaires supplémentaires, et qu'elle gère les chemins Windows et Unix, ce qui est très bien.

Toutefois, si vous souhaitez simplement disposer de quelques méthodes utilitaires statiques à utiliser avec des chemins de style Unix (avec un séparateur "/"), le code ci-dessous peut vous être utile.

Le site removeExtension conserve le reste du chemin d'accès ainsi que le nom du fichier. Il existe également une méthode similaire getExtension .

/**
 * Remove the file extension from a filename, that may include a path.
 * 
 * e.g. /path/to/myfile.jpg -> /path/to/myfile 
 */
public static String removeExtension(String filename) {
    if (filename == null) {
        return null;
    }

    int index = indexOfExtension(filename);

    if (index == -1) {
        return filename;
    } else {
        return filename.substring(0, index);
    }
}

/**
 * Return the file extension from a filename, including the "."
 * 
 * e.g. /path/to/myfile.jpg -> .jpg
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }

    int index = indexOfExtension(filename);

    if (index == -1) {
        return filename;
    } else {
        return filename.substring(index);
    }
}

private static final char EXTENSION_SEPARATOR = '.';
private static final char DIRECTORY_SEPARATOR = '/';

public static int indexOfExtension(String filename) {

    if (filename == null) {
        return -1;
    }

    // Check that no directory separator appears after the 
    // EXTENSION_SEPARATOR
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);

    int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR);

    if (lastDirSeparator > extensionPos) {
        LogIt.w(FileSystemUtil.class, "A directory separator appears after the file extension, assuming there is no file extension");
        return -1;
    }

    return extensionPos;
}

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