2009-05-29 11 views
180

Quelqu'un peut-il me dire comment obtenir le nom de fichier sans l'extension? Exemple:Comment obtenir le nom de fichier sans l'extension en Java?

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

double possible de [Comment obtenir le nom de fichier de chemin de fichier dans Android] (http://stackoverflow.com/questions/26570084/how- à-get-file-name-de-file-path-in-android) –

Répondre

329

Si vous, comme moi, préférez utiliser un code bibliothèque où ils ont probablement pensé à tous les cas particuliers, comme ce qui se passe si vous passez null ou des points dans le chemin, mais pas dans le nom du fichier , vous pouvez utiliser les éléments suivants:

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

vous pouvez également utiliser FilenameUtils.getBasename pour aller directement à partir d'une chaîne de chemin vers un filename-without-extension. –

+0

Où obtenez-vous le '.jar' pour cela? –

+2

Le plus simple est bien sûr de lancer maven :-) Sinon, voir: http: //commons.apache.org/io/ –

48

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

Vous avez oublié le test null: System.out.println ("null ->" + stripExtension (null)); –

+0

Comme vous le souhaitez :-) – paxdiablo

+0

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

113

La façon la plus simple est d'utiliser une expression régulière.

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

L'expression ci-dessus effacera 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("[.][^.]+$", "")); 
} 
+8

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

+3

@GustavoLitovsky Android n'est pas livré avec 'org.apache.commons'. Pour autant que je sache, c'est la seule façon de le faire dans Android. –

+1

/* l'expression rationnelle suivante supprime également chemin */ "/the/path/name.extension".replaceAll(".*[\\\\/]|\\.[^\\.]*$", » "); – daggett

3

Alors que je suis un grand croyant dans les bibliothèques Reusing, le org.apache.commons.io JAR est 174KB, qui est noticably grand pour une application mobile. Si vous téléchargez le code source et jetez un oeil à leur classe FilenameUtils, vous pouvez voir qu'il y a beaucoup d'utilitaires supplémentaires, et il fait face aux chemins Windows et Unix, ce qui est tout à fait adorable.

Cependant, si vous voulez juste quelques méthodes utilitaires statiques à utiliser avec les chemins de style Unix (avec un séparateur "/"), vous pouvez trouver le code ci-dessous utile. La méthode removeExtension préserve le reste du chemin avec le nom de fichier. Il y a également un getExtension similaire.

/** 
* 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; 
} 
-3

Essayez le code ci-dessous. Utilisation des fonctions de base Java de base. Il prend en charge String s avec extension, et sans extension (sans le caractère '.'). Le cas de plusieurs '.' est également couvert.

String str = "filename.xml"; 
if (!str.contains(".")) 
    System.out.println("File Name=" + str); 
else { 
    str = str.substring(0, str.lastIndexOf(".")); 
    // Because extension is always after the last '.' 
    System.out.println("File Name=" + str); 
} 

Vous pouvez l'adapter à travailler avec null cordes.

+1

Il est assez mauvais d'implémenter ce genre de fonctionnalité vous-même. Au premier abord, la tâche semble être ** extrêmement évidente **, mais en pratique, vous devrez faire face à beaucoup de situations * exceptionnelles * (comme il n'y a pas de '. 'Dans le nom de fichier, ou fichier est une sauvegarde et a un nom 'document.docx.backup', etc). C'est beaucoup plus fiable d'utiliser une bibliothèque externe qui s'occupe de toutes ces situations exceptionnelles pour vous. – ivstas

+0

D'autre part, l'ajout de nombreuses bibliothèques à votre projet le rendra plus grand. Des choses si simples comme celle-ci pourraient être faites par vous-même. –

+1

Pas moyen de le faire vous-même. C'est dur: des fichiers sans extension mais. dans le chemin, les chemins ftp, les fenêtres et les barres obliques unix, les liens symboliques etc ... Vous allez certainement échouer et en essayant de gagner un peu de mémoire, vous aurez beaucoup d'instabilité. Copiez au minimum les sources du code établi si les licences le permettent. –

32

Si votre projet utilise Guava (14.0 ou plus récent), vous pouvez choisir Files.getNameWithoutExtension().

(essentiellement les mêmes que FilenameUtils.removeExtension() d'Apache Commons IO, comme le suggère highest-voted answer. Je voulais juste signaler Goyave ce que cela aussi. Personnellement, je ne voulais pas ajouter la dépendance aux communes, que je me sens est un peu relique-juste à cause de cela.)

+1

en fait il ressemble plus à 'FilenameUtils.getBaseName()' –

21

Voici l'ordre consolidé de liste par ma préférence.

Utilisation communes apache

import org.apache.commons.io.FilenameUtils; 

String fileNameWithoutExt = FilenameUtils.getBaseName(fileName); 

          OR 

String fileNameWithOutExt = FilenameUtils.removeExtension(fileName); 

Utilisation de Google Goyave (Si u déjà l'utiliser)

import com.google.common.io.Files; 
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName); 

ou en utilisant Java de base

1)

String fileName = file.getName(); 
int pos = fileName.lastIndexOf("."); 
if (pos > 0 && pos < (name.length() - 1)) { // If '.' is not the first or last character. 
    fileName = fileName.substring(0, pos); 
} 

2)

if (fileName.indexOf(".") > 0) { 
    return fileName.substring(0, fileName.lastIndexOf(".")); 
} else { 
    return fileName; 
} 

3)

private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$"); 

public static String getFileNameWithoutExtension(File file) { 
    return ext.matcher(file.getName()).replaceAll(""); 
} 

Liferay API

import com.liferay.portal.kernel.util.FileUtil; 
String fileName = FileUtil.stripExtension(file.getName()); 
3

référence ci-dessous est de https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.java

/** 
* Gets the base name, without extension, of given file name. 
* <p/> 
* e.g. getBaseName("file.txt") will return "file" 
* 
* @param fileName 
* @return the base name 
*/ 
public static String getBaseName(String fileName) { 
    int index = fileName.lastIndexOf('.'); 
    if (index == -1) { 
     return fileName; 
    } else { 
     return fileName.substring(0, index); 
    } 
} 
+0

Nice info, mais les utilisateurs, soyez conscient des cas comme ".htaccess", où cette méthode retournera "". –

1

Si vous ne souhaitez pas importer les apache.commons plein, je l'ai extrait les mêmes fonctionnalités:

public class StringUtils { 
    public static String getBaseName(String filename) { 
     return removeExtension(getName(filename)); 
    } 

    public static int indexOfLastSeparator(String filename) { 
     if(filename == null) { 
      return -1; 
     } else { 
      int lastUnixPos = filename.lastIndexOf(47); 
      int lastWindowsPos = filename.lastIndexOf(92); 
      return Math.max(lastUnixPos, lastWindowsPos); 
     } 
    } 

    public static String getName(String filename) { 
     if(filename == null) { 
      return null; 
     } else { 
      int index = indexOfLastSeparator(filename); 
      return filename.substring(index + 1); 
     } 
    } 

    public static String removeExtension(String filename) { 
     if(filename == null) { 
      return null; 
     } else { 
      int index = indexOfExtension(filename); 
      return index == -1?filename:filename.substring(0, index); 
     } 
    } 

    public static int indexOfExtension(String filename) { 
     if(filename == null) { 
      return -1; 
     } else { 
      int extensionPos = filename.lastIndexOf(46); 
      int lastSeparator = indexOfLastSeparator(filename); 
      return lastSeparator > extensionPos?-1:extensionPos; 
     } 
    } 
} 
0

Vous pouvez diviser par « » et sur l'index 0 est le nom du fichier et sur 1 est l'extension, mais je inclinerais pour la meilleure solution avec FileNameUtils de apache.commons-io comme il a été mentionné dans le premier article. Il ne doit pas être supprimé, mais sufficent est:

String fileName = FilenameUtils.getBaseName("test.xml");

Questions connexes