web-dev-qa-db-fra.com

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

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

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

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

import org.Apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
366
Ulf Lindback

Le moyen le plus simple consiste à 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("[.][^.]+$", ""));
}
137
brianegge

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 produit:

test.xml   -> test
test.2.xml -> test.2
test       -> test
test.      -> test
50
paxdiablo

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

(Essentiellement identique à FilenameUtils.removeExtension() dans Apache Commons IO, comme le suggère la réponse la plus votée . Je voulais simplement signaler que Guava fait de même est un peu une relique, juste à cause de cela.)

38
Jonik

Voici la liste de classement par ordre de préférence.

Utiliser Apache commons

import org.Apache.commons.io.FilenameUtils;

String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);

                           OR

String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);

Utilisation de Google Guava (si vous l’utilisez déjà)

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

Ou en utilisant Core Java

1)

String fileName = file.getName();
int pos = fileName.lastIndexOf(".");
if (pos > 0 && pos < (fileName.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("");
}

API Liferay

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

Si vous n'aimez pas importer le fichier Apache.commons complet, j'ai extrait la même fonctionnalité:

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;
        }
    }
}
5
Hamzeh Soboh

Alors que je suis un fervent partisan de la réutilisation des bibliothèques, le fichier JAR - org.Apache.commons.io correspond à 174 Ko, ce qui est considérable pour une application mobile. 

Si vous téléchargez le code source et jetez un coup d'œil à leur classe FilenameUtils, vous constaterez qu'il existe de nombreux utilitaires supplémentaires, et que cela gère les chemins Windows et Unix, ce qui est tout à fait charmant.

Toutefois, si vous souhaitez utiliser deux méthodes d’utilitaire statique à utiliser avec les chemins de style Unix (avec un séparateur "/"), le code ci-dessous peut vous être utile. 

La méthode removeExtension conserve le reste du chemin avec le nom de fichier. Il existe également une variable 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;
}
4
Dan J

Vous trouverez ci-dessous les références 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);
    }
}
4
David Cheung
public static String getFileExtension(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    public static String getBaseFileName(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(0,fileName.lastIndexOf("."));
    }
0
Gil SH