it-swarm.com.de

Wie schneide ich eine Dateierweiterung von einem String in Java ab?

Wie lässt sich das Suffix in Java am besten zuschneiden?

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

Dies ist die Art von Code, die wir nicht selbst tun sollten. Verwenden Sie Bibliotheken für die profanen Sachen, speichern Sie Ihr Gehirn für die harten Sachen.

In diesem Fall empfehle ich die Verwendung von FilenameUtils.removeExtension () aus Apache Commons IO

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

Da die Verwendung von String.substring und String.lastIndex in einem Einzeiler gut ist, gibt es einige Probleme hinsichtlich der Fähigkeit, bestimmte Dateipfade verarbeiten zu können.

Nehmen Sie zum Beispiel den folgenden Pfad:

a.b/c

Die Verwendung des Einliners führt zu:

a

Das ist falsch.

Das Ergebnis hätte c sein müssen. Da der Datei jedoch eine Erweiterung fehlt, der Pfad jedoch ein Verzeichnis mit einem . im Namen hatte, wurde die Einzeilenmethode dazu verleitet, einen Teil des Pfads als Dateinamen anzugeben, was nicht korrekt ist.

Kontrollbedarf

Inspiriert durch die Antwort von skaffman habe ich mir die FilenameUtils.removeExtension - Methode des Apache Commons IO angesehen.

Um sein Verhalten neu zu erstellen, habe ich einige Tests geschrieben, die die neue Methode erfüllen sollte. Dies sind die folgenden:

 Pfad Dateiname 
-------------- --------
 A/b/c c 
 A/b/c.jpg c 
 a/b/c.jpg.jpg c.jpg 
__. ab/c 
 ab/c.jpg c 
 ab/c.jpg.jpg c.jpg 
 
 c c 
 c.jpg c 
 c.jpg.jpg c.jpg 

(Und das ist alles, wonach ich gesucht habe - wahrscheinlich gibt es andere Überprüfungen, die ich übersehen habe.)

Die Umsetzung

Folgendes ist meine Implementierung für die removeExtension-Methode:

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

Wenn Sie diese removeExtension-Methode mit den obigen Tests ausführen, erhalten Sie die oben aufgeführten Ergebnisse.

Die Methode wurde mit dem folgenden Code getestet. Da dies unter Windows ausgeführt wurde, ist das Pfadtrennzeichen ein \, dem ein \ zugeordnet werden muss, wenn es als Teil eines String-Literal verwendet wird.

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

Die Ergebnisse waren:

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

Die Ergebnisse sind die gewünschten Ergebnisse im Test, den die Methode erfüllen sollte.

83
coobird

BTW, in meinem Fall, als ich eine schnelle Lösung zum Entfernen einer bestimmten Erweiterung wollte, ist dies ungefähr das, was ich getan habe:

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

Ist das eine Trickfrage? : p

Ich kann mir keinen schnelleren Weg vorstellen.

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

Ich fand coolbirds Antwort besonders nützlich.

Die letzten Ergebnisaussagen habe ich jedoch geändert in:

if (extensionIndex == -1)
  return s;

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

da ich wollte, dass der vollständige Pfadname zurückgegeben wird.

"C:\Benutzer\mroh004.COM\Documents\Test\Test.xml" wird also zu 
 "C:\Users\mroh004.COM\Documents\Test\Test" und nicht 
 "Prüfung"
5
mxro

Verwenden Sie eine Methode in der Klasse com.google.common.io.Files, wenn Ihr Projekt bereits von der Google Core-Bibliothek abhängig ist. Die benötigte Methode ist getNameWithoutExtension

4
Toby

Verwenden Sie einen Regex. Dieser ersetzt den letzten Punkt und alles danach.

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

Sie können auch ein Pattern-Objekt erstellen, wenn Sie die Regex vorkompilieren möchten.

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

erstellen Sie eine neue Datei mit einem String-Image-Pfad

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 gibt die folgende Antwort

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
 private String trimFileExtension(String fileName)
  {
     String[] splits = fileName.split( "\\." );
     return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
  }
1
supernova

sie können diese Funktion sehr einfach ausprobieren 

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

Berücksichtigen Sie die Szenarien, in denen es keine Dateierweiterung oder mehr als eine Dateierweiterung gibt

beispiel Dateiname: Datei | file.txt | file.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();
}

Dies gibt example für img und imgLink aus.

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

Ich würde das gerne machen:

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

Vom Ende bis zum '.' Dann rufen Sie substring an.

Edit: Vielleicht kein Golf, aber effektiv :)

0
fmsf