web-dev-qa-db-fra.com

Comment couper une extension de fichier à partir d'une chaîne en Java?

Quel est le moyen le plus efficace de couper le suffixe en Java, comme ceci:

title part1.txt
title part2.html
=>
title part1
title part2
157
omg

C'est le genre de code que nous ne devrions pas faire nous-mêmes. Utilisez des bibliothèques pour les choses banales, sauvegardez votre cerveau pour les choses difficiles.

Dans ce cas, je recommande d'utiliser FilenameUtils.removeExtension () from Apache Commons IO

253
skaffman
str.substring(0, str.lastIndexOf('.'))
213

Comme il est bon d'utiliser String.substring et String.lastIndex dans une ligne, il existe certains problèmes pour ce qui est de pouvoir gérer certains chemins de fichiers.

Prenons par exemple le chemin suivant:

a.b/c

L'utilisation du one-liner entraînera:

a

C'est faux.

Le résultat aurait dû être c, mais comme le fichier n'avait pas d'extension, mais que le chemin contenait un répertoire avec . dans le nom, la méthode one-liner a été amenée à donner une partie du chemin comme nom de fichier, ce qui n'est pas correct.

Besoin de chèques

Inspiré par la réponse de skaffman , j’ai jeté un coup d’œil à la méthode FilenameUtils.removeExtension de la Apache Commons IO .

Afin de recréer son comportement, j'ai écrit quelques tests que la nouvelle méthode doit remplir, qui sont les suivants:

 Chemin Nom du fichier 
-------------- --------
 A/b/c c 
 A/b/c.jpg c 
 a/b/c.jpg.jpg c.jpg 

 ab/c c 
 ab/c.jpg c 
 ab/c.jpg.jpg c.jpg 
 
 c c 
 c.jpg c 
 c.jpg.jpg c.jpg 

(Et c'est tout ce que j'ai vérifié - il y a probablement d'autres vérifications qui devraient être en place et que j'ai oubliées.)

La mise en oeuvre

Voici mon implémentation pour la méthode removeExtension:

public static String removeExtension(String s) {

    String separator = System.getProperty("file.separator");
    String filename;

    // Remove the path upto the filename.
    int lastSeparatorIndex = s.lastIndexOf(separator);
    if (lastSeparatorIndex == -1) {
        filename = s;
    } else {
        filename = s.substring(lastSeparatorIndex + 1);
    }

    // Remove the extension.
    int extensionIndex = filename.lastIndexOf(".");
    if (extensionIndex == -1)
        return filename;

    return filename.substring(0, extensionIndex);
}

L'exécution de cette méthode removeExtension avec les tests ci-dessus donne les résultats énumérés ci-dessus.

La méthode a été testée avec le code suivant. Comme cela a été exécuté sous Windows, le séparateur de chemin est un \ qui doit être échappé avec un \ lorsqu'il est utilisé dans le cadre d'un littéral String.

System.out.println(removeExtension("a\\b\\c"));
System.out.println(removeExtension("a\\b\\c.jpg"));
System.out.println(removeExtension("a\\b\\c.jpg.jpg"));

System.out.println(removeExtension("a.b\\c"));
System.out.println(removeExtension("a.b\\c.jpg"));
System.out.println(removeExtension("a.b\\c.jpg.jpg"));

System.out.println(removeExtension("c"));
System.out.println(removeExtension("c.jpg"));
System.out.println(removeExtension("c.jpg.jpg"));

Les résultats ont été:

c
c
c.jpg
c
c
c.jpg
c
c
c.jpg

Les résultats correspondent aux résultats souhaités décrits dans le test que la méthode doit effectuer.

83
coobird

BTW, dans mon cas, lorsque je voulais une solution rapide pour supprimer une extension spécifique, c’est à peu près ce que j’ai fait:

  if (filename.endsWith(ext))
    return filename.substring(0,filename.length() - ext.length());
  else
    return filename;
16
Edward Falk
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));
16
Jherico
String fileName="foo.bar";
int dotIndex=fileName.lastIndexOf('.');
if(dotIndex>=0) { // to prevent exception if there is no dot
  fileName=fileName.substring(0,dotIndex);
}

Est-ce une question piège? : p

Je ne peux pas penser à un moyen plus rapide atm.

6
Huxi
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
5
Alexander

J'ai trouvé la réponse de coolbird particulièrement utile.

Mais j'ai changé les derniers résultats en:

if (extensionIndex == -1)
  return s;

return s.substring(0, lastSeparatorIndex+1) 
         + filename.substring(0, extensionIndex);

car je voulais que le nom du chemin complet soit retourné.

Donc "C:\Utilisateurs\mroh004.COM\Documents\Test\Test.xml" devient 
 "C:\Utilisateurs\mroh004.COM\Documents\Test\Test" et non 
 "Tester"
5
mxro

Utilisez une méthode dans la classe com.google.common.io.Files si votre projet dépend déjà de la bibliothèque principale de Google. La méthode dont vous avez besoin est getNameWithoutExtension

4
Toby

Utilisez une regex. Celui-ci remplace le dernier point et tout ce qui suit.

String baseName = fileName.replaceAll("\\.[^.]*$", "");

Vous pouvez également créer un objet Pattern si vous souhaitez précompiler la regex.

2
Steven Spungin
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
1
Mahdak

créer un nouveau fichier avec un chemin d'image de chaîne

String imagePath;
File test = new File(imagePath);
test.getName();
test.getPath();
getExtension(test.getName());


public static String getExtension(String uri) {
        if (uri == null) {
            return null;
        }

        int dot = uri.lastIndexOf(".");
        if (dot >= 0) {
            return uri.substring(dot);
        } else {
            // No extension.
            return "";
        }
    }
1
Pravin Bhosale

org.Apache.commons.io.FilenameUtils version 2.4 donne la réponse suivante

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);
    }
}

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

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

public static final char EXTENSION_SEPARATOR = '.';
private static final char UNIX_SEPARATOR = '/';
private static final char WINDOWS_SEPARATOR = '\\';
1
Someone Somewhere
 private String trimFileExtension(String fileName)
  {
     String[] splits = fileName.split( "\\." );
     return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
  }
1
supernova

vous pouvez essayer cette fonction, très basique 

public String getWithoutExtension(String fileFullPath){
    return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
1
Shantonu

Garder à l'esprit les scénarios où il n'y a pas d'extension de fichier ou s'il y a plus d'une extension de fichier

exemple Nom de fichier: fichier | fichier.txt | fichier.tar.bz2

/**
 *
 * @param fileName
 * @return file extension
 * example file.fastq.gz => fastq.gz
 */
private String extractFileExtension(String fileName) {
    String type = "undefined";
    if (FilenameUtils.indexOfExtension(fileName) != -1) {
        String fileBaseName = FilenameUtils.getBaseName(fileName);
        int indexOfExtension = -1;
        while (fileBaseName.contains(".")) {
            indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
            fileBaseName = FilenameUtils.getBaseName(fileBaseName);
        }
        type = fileName.substring(indexOfExtension + 1, fileName.length());
    }
    return type;
}
0
Choesang
String img = "example.jpg";
// String imgLink = "http://www.example.com/example.jpg";
URI uri = null;

try {
    uri = new URI(img);
    String[] segments = uri.getPath().split("/");
    System.out.println(segments[segments.length-1].split("\\.")[0]);
} catch (Exception e) {
    e.printStackTrace();
}

Cela affichera exemple pour les deux img et imgLink

0
urs86ro
public static String removeExtension(String file) {
    if(file != null && file.length() > 0) {
        while(file.contains(".")) {
            file = file.substring(0, file.lastIndexOf('.'));
        }
    }
    return file;
}
0
Alexey

Je ferais comme ça:

String title_part = "title part1.txt";
int i;
for(i=title_part.length()-1 ; i>=0 && title_part.charAt(i)!='.' ; i--);
title_part = title_part.substring(0,i);

Commençant à la fin jusqu'au '.' puis appelez la sous-chaîne.

Edit: Peut-être pas un golf mais c'est efficace :)

0
fmsf