Wie erhalte ich die Dateierweiterung einer Datei in Java?

484

Um ganz klar zu sein, ich suche nicht nach dem MIME-Typ.

Angenommen, ich habe folgende Eingabe: /path/to/file/foo.txt

Ich möchte eine Möglichkeit, diese Eingabe speziell .txtfür die Erweiterung aufzuteilen. Gibt es eine eingebaute Möglichkeit, dies in Java zu tun? Ich möchte vermeiden, meinen eigenen Parser zu schreiben.

longda
quelle
12
Sie wissen nie, wann eine neue Plattform auf den Markt kommt, die Erweiterungen als durch Komma getrennt definiert. Jetzt müssen Sie plattformabhängigen Code schreiben. Die Java-Frameworks sollten vorausschauender sein und über APIs zum Abrufen von Erweiterungen verfügen, in denen sie den plattformabhängigen Code schreiben, und Sie als Benutzer der API sagen einfach, dass Sie die Erweiterung erhalten.
ArtOfWarfare
@ArtOfWarfare: OMG. Lassen Sie uns eine 100-MB-JRE mit vielen tausend Klassen erstellen, aber stellen Sie sicher, dass Sie keine Methode implementieren, "txt"von der zurückgegeben wird, "filename.txt"da eine Plattform möglicherweise irgendwo verwendet werden möchte "filename,txt".
Eric Duminil
@EricDuminil "Achten Sie darauf, keine Methode zu implementieren, die" txt "von" filename.txt "" zurückgibt ??? Versuchen Sie path.substring(path.lastIndexOf("."));..... Und ja .. Sie werden sicher nicht umsonst etwas duplizieren ...
VelocityPulse
@ VelocityPulse Genau das stört mich. Da es keinen Standardweg gibt, um die Dateierweiterung zu erhalten, erhalten Sie Dutzende von halb falschen Antworten und leicht unterschiedlichen Implementierungen. Ihr Code verwendet zwei Methoden (ich hätte gerne eine einzige explizite Methode), ".txt"von der zurückgegeben wird "filename.txt", was möglicherweise nicht das gewünschte Ergebnis ist, und am schlimmsten ist, dass er fehlschlägt, StringIndexOutOfBoundsExceptionanstatt eine leere Zeichenfolge zurückzugeben, wenn keine Erweiterung vorhanden ist.
Eric Duminil

Antworten:

649

Verwenden Sie in diesem Fall FilenameUtils.getExtension von Apache Commons IO

Hier ist ein Beispiel für die Verwendung (Sie können entweder den vollständigen Pfad oder nur den Dateinamen angeben):

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"

Maven-Abhängigkeit:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

Gradle Groovy DSL

implementation 'commons-io:commons-io:2.6'

Gradle Kotlin DSL

implementation("commons-io:commons-io:2.6")

Andere https://search.maven.org/artifact/commons-io/commons-io/2.6/jar

Juan Rojas
quelle
70
Es sollte beachtet werden, dass nur "gz" für eine Datei mit dem Namen archive.tar.gz zurückgegeben wird.
Zitrax
106
@Zitrax, weil "gz" die Dateierweiterung ist.
BrainSlugs83
6
@ BrainSlugs83 Was bedeutet also "Teer"?
TuGordoBello
31
@zhelon gz steht für Gnu Zip - Datei, und TAR steht für (t) Affe (ar) Schnittlauch. .Tar.gz ist also eine TAR-Datei in einer Gnu-ZIP-Datei mit der Erweiterung .gz.
Cirovladimir
5
Es gibt keinen Grund, für diese einfache Aufgabe eine andere Bibliothek einzurichten.
Masterwok
311

Benötigen Sie dafür wirklich einen "Parser"?

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}

Angenommen, Sie haben es mit einfachen Windows-ähnlichen Dateinamen zu tun, nicht mit so etwas archive.tar.gz.

Übrigens, für den Fall, dass ein Verzeichnis ein '.' Hat, der Dateiname selbst jedoch nicht (wie /path/to.a/file), können Sie dies tun

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i+1);
}
EboMike
quelle
4
Vielen Dank! Sicher, Sie benötigen möglicherweise einen Parser / ein Objekt dafür, wenn Sie mehr Manipulationen als nur die Erweiterung durchführen möchten. Sagen Sie, wenn Sie nur den Pfad, das übergeordnete Verzeichnis, den Dateinamen (abzüglich der Erweiterung) usw. möchten. I ' Ich
Longda
10
Wie Sie sagen, gibt es eine Reihe von Dingen, über die Sie nachdenken müssen, abgesehen von der Verwendung des naiven lastIndexOf ("."). Ich würde vermuten, dass Apache Commons eine Methode dafür hat, die all die kleinen kniffligen potenziellen Probleme berücksichtigt.
MatrixFrog
12
Ich denke i > 0sollte geändert werden zu i >= 0oder i != -1. Dies kümmert sich um Dateinamen wie .htaccess.
Pijusn
8
Unabhängig davon, wie einfach ein Code-Snippet ist ... Sie müssen es noch aktualisieren / warten / testen / als bequeme Abhängigkeit verfügbar machen ... viel einfacher, wenn es bereits eine Bibliothek gab, die all das
erledigt
2
Auf mehr gotcha ist, wenn Datei mit einem Punkt endet. Besser in einer Bibliothek. if (i> p && i <(fileName.length () - 1)) {extension = fileName.substring (i + 1);
Tgkprog
97
private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}
luke1985
quelle
13
Es sollte beachtet werden, dass dies das '.' Zurückgibt. Außerdem lautet Ihre Dateierweiterung in einigen anderen Antworten ".txt" und nicht "txt"
NickEntin,
2
Bessere Antwort und @NickEntin Besserer Kommentar. So entfernen Sie den Punkt "." kann von der Erweiterung der Datei als int lastIndexOf = name.lastIndexOf (".") + 1 codiert werden;
Hanzallah Afgan
11
Dieser Ansatz funktioniert in einigen Fällen möglicherweise nicht, z. B. /usr/bin/foo.bar/httpconf
Iman Akbari
8
@ lukasz1985 1. Hunderte von Linux-Paketen erstellen Verzeichnisse mit Namen wie "init.d". Außerdem ist es nicht sicher, sich auf den Pfad zu verlassen, der keine Verzeichnisse mit Punkten enthält, da dies nicht illegal ist. 2. Ich habe für Android codiert und daher ein SDK verwendet Methode, an die ich mich nicht erinnere, aber ich denke, stackoverflow.com/a/3571239/2546146 hat diesen Fehler nicht
Iman Akbari
6
@Iman Akbari: getName () gibt nur den Dateinamen selbst zurück, der in Ihrem Beispiel "httpconf" wäre.
Dreamspace Präsident
85

Wenn Sie die Guava- Bibliothek verwenden, können Sie auf die FilesUtility-Klasse zurückgreifen . Es hat eine bestimmte Methode getFileExtension(). Zum Beispiel:

String path = "c:/path/to/file/foo.txt";
String ext = Files.getFileExtension(path);
System.out.println(ext); //prints txt

Darüber hinaus erhalten Sie möglicherweise auch den Dateinamen mit einer ähnlichen Funktion, getNameWithoutExtension () :

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo
Jean Valjean
quelle
4
"Ja wirklich?" Es ist eine großartige Bibliothek voller Dienstprogramme. Die meisten von ihnen werden Teil von Java8 sein, wie die großartige Guava- Funktion .
JeanValjean
Leider können nicht alle Menschen entscheiden, welche Bibliotheken sie verwenden möchten. Zumindest haben wir Apache Commons, wenn auch eine alte.
Lluis Martinez
1
Wenn Sie den Quellcode von getFileExtensiontatsächlich sehen, ist es einfach int dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)keine große Sache. Beachten Sie auch, dass Filesaus irgendeinem Grund als "instabil" markiert.
Al-Mothafar
@ Al-Mothafar Viele Klassen sind als instabil markiert (siehe Multimap-Builder), ich verstehe auch nicht warum: Es wurden mehrere Veröffentlichungen gemacht, aber dort wurde nichts geändert.
JeanValjean
27

Unter Android können Sie Folgendes verwenden:

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());
unerschrocken
quelle
Beachten Sie, dass dies nicht funktioniert, wenn die Zeichenfolge nicht codiert ist (z. B. ein Leerzeichen oder ein chinesisches Zeichen enthält), siehe: stackoverflow.com/a/14321470/1074998
Fruit
14

Um Dateinamen ohne Zeichen vor dem Punkt zu berücksichtigen , müssen Sie diese geringfügige Abweichung der akzeptierten Antwort verwenden:

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i+1);
}

"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"
Sylvain Leroux
quelle
sollte sich wahrscheinlich gegen "foo" verteidigen. Eingang.
Chrisinmtown
14

Dies ist eine getestete Methode

public static String getExtension(String fileName) {
    char ch;
    int len;
    if(fileName==null || 
            (len = fileName.length())==0 || 
            (ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directory
             ch=='.' ) //in the case of . or ..
        return "";
    int dotInd = fileName.lastIndexOf('.'),
        sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
    if( dotInd<=sepInd )
        return "";
    else
        return fileName.substring(dotInd+1).toLowerCase();
}

Und Testfall:

@Test
public void testGetExtension() {
    assertEquals("", getExtension("C"));
    assertEquals("ext", getExtension("C.ext"));
    assertEquals("ext", getExtension("A/B/C.ext"));
    assertEquals("", getExtension("A/B/C.ext/"));
    assertEquals("", getExtension("A/B/C.ext/.."));
    assertEquals("bin", getExtension("A/B/C.bin"));
    assertEquals("hidden", getExtension(".hidden"));
    assertEquals("dsstore", getExtension("/user/home/.dsstore"));
    assertEquals("", getExtension(".strange."));
    assertEquals("3", getExtension("1.2.3"));
    assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}
Yavuzkavus
quelle
10

Mein schmutziger und vielleicht kleinster mit String.replaceAll :

.replaceAll("^.*\\.(.*)$", "$1")

Beachten Sie, dass zuerst *gierig ist, so dass die meisten möglichen Zeichen so weit wie möglich erfasst werden und dann nur noch der letzte Punkt und die Dateierweiterung übrig bleiben.

Ebrahim Byagowi
quelle
Dies schlägt fehl, wenn die Datei keine Erweiterung hat.
Zack
Ja, leider kann es jedoch immer noch für einfache Szenarien wie die schnelle Erkennung von Dateitypen verwendet werden, und zum Beispiel, dass eine falsche Erweiterung nicht sehr anders ist als keine, oder man kann eine if-Bedingung setzen, wenn das Ergebnis des Ersetzens gleich der Eingabe ist.
Ebrahim Byagowi
1
Oder noch kürzer.replaceAll(".*\\.", "")
Ebrahim Byagowi
10
String path = "/Users/test/test.txt";
String extension = "";

if (path.contains("."))
     extension = path.substring(path.lastIndexOf("."));

return ".txt"

Wenn Sie nur "txt" wollen, machen Sie path.lastIndexOf(".") + 1

VelocityPulse
quelle
9

Wie aus allen anderen Antworten hervorgeht, gibt es keine adäquate "eingebaute" Funktion. Dies ist eine sichere und einfache Methode.

String getFileExtension(File file) {
    if (file == null) {
        return "";
    }
    String name = file.getName();
    int i = name.lastIndexOf('.');
    String ext = i > 0 ? name.substring(i + 1) : "";
    return ext;
}
unerschrocken
quelle
7

Wie wäre es (mit Java 1.5 RegEx):

    String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];
Ninju Bohra
quelle
6

Wenn Sie planen , Apache commons-io zu verwenden, und wollen nur die Dateierweiterung überprüfen und dann eine Operation zu tun, die Sie verwenden können dies hier ist ein Ausschnitt:

if(FilenameUtils.isExtension(file.getName(),"java")) {
    someoperation();
}
Geng Jiawen
quelle
Beachten Sie, dass bei dieser Prüfung gemäß den Dokumenten zwischen Groß- und Kleinschreibung unterschieden wird.
Babken Vardanyan
6

Hier ist ein weiterer Einzeiler für Java 8.

String ext = Arrays.stream(fileName.split("\\.")).reduce((a,b) -> b).orElse(null)

Es funktioniert wie folgt:

  1. Teilen Sie die Zeichenfolge mit "." In ein Array von Zeichenfolgen auf.
  2. Konvertieren Sie das Array in einen Stream
  3. Verwenden Sie Reduzieren, um das letzte Element des Streams abzurufen, dh die Dateierweiterung
Jens.Huehn_at_SlideFab.com
quelle
4

Wie wäre es mit JFileChooser? Es ist nicht einfach, da Sie die endgültige Ausgabe analysieren müssen ...

JFileChooser filechooser = new JFileChooser();
File file = new File("your.txt");
System.out.println("the extension type:"+filechooser.getTypeDescription(file));

Das ist ein MIME-Typ ...

OK ... Ich vergesse, dass Sie den MIME-Typ nicht kennen wollen.

Interessanter Code unter folgendem Link: http://download.oracle.com/javase/tutorial/uiswing/components/filechooser.html

/*
 * Get the extension of a file.
 */  
public static String getExtension(File f) {
    String ext = null;
    String s = f.getName();
    int i = s.lastIndexOf('.');

    if (i > 0 &&  i < s.length() - 1) {
        ext = s.substring(i+1).toLowerCase();
    }
    return ext;
}

Verwandte Frage: Wie schneide ich eine Dateierweiterung aus einem String in Java?

eee
quelle
4

Hier ist eine Methode, die .tar.gzauch in einem Pfad mit Punkten in Verzeichnisnamen ordnungsgemäß funktioniert:

private static final String getExtension(final String filename) {
  if (filename == null) return null;
  final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
  final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
  final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
  return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}

afterLastSlashwurde erstellt, um das Auffinden zu afterLastBackslashbeschleunigen, da nicht die gesamte Zeichenfolge durchsucht werden muss, wenn einige Schrägstriche darin enthalten sind.

Das char[]Innere des Originals Stringwird wiederverwendet, wobei dort kein Müll hinzugefügt wird, und die JVM wird wahrscheinlich feststellen, dass afterLastSlashes sich sofort um Müll handelt, um ihn auf den Stapel anstatt auf den Haufen zu legen .

Olathe
quelle
Diese Methode wird aus dem Guava-Quellcode kopiert. Sie müssen dies erwähnen.
Humazed
1
Ich habe das nicht kopiert. Wenn es im Guava-Quellcode ist, haben sie es von hier kopiert. Vielleicht benachrichtigen Sie sie.
Olathe
Es tut mir leid, dass es übrigens nicht identisch ist. Mögen Sie und der Guava-Entwickler nur die gleiche Idee haben.
Humazed
2
Wirklich "gz" ist die richtige Erweiterung, um zurückzukehren. Wenn der aufrufende Code auch "tar" verarbeiten kann, sollte er zusätzlich außerhalb einer getExtensionFunktion prüfen . Wenn der Dateiname des Benutzers lautet, gibt "my zip. don't touch.tar.gz"diese Methode die falsche Erweiterung zurück.
intrepidis
2
// Modified from EboMike's answer

String extension = "/path/to/file/foo.txt".substring("/path/to/file/foo.txt".lastIndexOf('.'));

Die Erweiterung sollte beim Ausführen ".txt" enthalten.

longda
quelle
13
Stürzt ab, wenn der Name keine Erweiterung hat.
EboMike
2

Hier ist die Version mit Optional als Rückgabewert (da Sie nicht sicher sein können, ob die Datei eine Erweiterung hat) ... auch die Überprüfung der Integrität ...

import java.io.File;
import java.util.Optional;

public class GetFileExtensionTool {

    public static Optional<String> getFileExtension(File file) {
        if (file == null) {
            throw new NullPointerException("file argument was null");
        }
        if (!file.isFile()) {
            throw new IllegalArgumentException("getFileExtension(File file)"
                    + " called on File object that wasn't an actual file"
                    + " (perhaps a directory or device?). file had path: "
                    + file.getAbsolutePath());
        }
        String fileName = file.getName();
        int i = fileName.lastIndexOf('.');
        if (i > 0) {
            return Optional.of(fileName.substring(i + 1));
        } else {
            return Optional.empty();
        }
    }
}
schuttek
quelle
2

Wie wäre es mit der REGEX- Version:

static final Pattern PATTERN = Pattern.compile("(.*)\\.(.*)");

Matcher m = PATTERN.matcher(path);
if (m.find()) {
    System.out.println("File path/name: " + m.group(1));
    System.out.println("Extention: " + m.group(2));
}

oder mit unterstützter Null-Erweiterung:

static final Pattern PATTERN =
    Pattern.compile("((.*\\" + File.separator + ")?(.*)(\\.(.*)))|(.*\\" + File.separator + ")?(.*)");

class Separated {
    String path, name, ext;
}

Separated parsePath(String path) {
    Separated res = new Separated();
    Matcher m = PATTERN.matcher(path);
    if (m.find()) {
        if (m.group(1) != null) {
            res.path = m.group(2);
            res.name = m.group(3);
            res.ext = m.group(5);
        } else {
            res.path = m.group(6);
            res.name = m.group(7);
        }
    }
    return res;
}


Separated sp = parsePath("/root/docs/readme.txt");
System.out.println("path: " + sp.path);
System.out.println("name: " + sp.name);
System.out.println("Extention: " + sp.ext);

Ergebnis für * nix:
Pfad: / root / docs /
name: readme
Erweiterung: txt

Für Windows parsePath ("c: \ windows \ readme.txt"):
Pfad: c: \ windows \
name: readme
Erweiterung: txt

Dmitry Sokolyuk
quelle
1
String extension = com.google.common.io.Files.getFileExtension("fileName.jpg");
Alfaville
quelle
1

Hier habe ich eine kleine Methode gemacht (jedoch nicht so sicher und prüft nicht auf viele Fehler), aber wenn nur Sie ein allgemeines Java-Programm programmieren, ist dies mehr als genug, um den Dateityp zu finden. Dies funktioniert nicht für komplexe Dateitypen, aber diese werden normalerweise nicht so häufig verwendet.

    public static String getFileType(String path){
       String fileType = null;
       fileType = path.substring(path.indexOf('.',path.lastIndexOf('/'))+1).toUpperCase();
       return fileType;
}
Rivalität
quelle
OP sucht nach eingebauter Methode
Panther
(1) Sie sollten verwenden, lastIndexOfdamit Dateinamen wie john.smith.report.docrichtig behandelt werden. (2) Sie sollten Fälle ordnungsgemäß behandeln, wenn keine Verlängerung vorhanden ist. Diese Methode gibt ABC/XYZfür einen Pfad wie zurück abc/xyz, was keinen Sinn ergibt. Es wäre sinnvoller, zurückzukehren ""oder null. (3) Das Dateitrennzeichen ist nicht immer /.
Radiodef
1

Abrufen der Dateierweiterung vom Dateinamen

/**
 * The extension separator character.
 */
private static final char EXTENSION_SEPARATOR = '.';

/**
 * The Unix separator character.
 */
private static final char UNIX_SEPARATOR = '/';

/**
 * The Windows separator character.
 */
private static final char WINDOWS_SEPARATOR = '\\';

/**
 * The system separator character.
 */
private static final char SYSTEM_SEPARATOR = File.separatorChar;

/**
 * Gets the extension of a filename.
 * <p>
 * This method returns the textual part of the filename after the last dot.
 * There must be no directory separator after the dot.
 * <pre>
 * foo.txt      --> "txt"
 * a/b/c.jpg    --> "jpg"
 * a/b.txt/c    --> ""
 * a/b/c        --> ""
 * </pre>
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename the filename to retrieve the extension of.
 * @return the extension of the file or an empty string if none exists.
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }
    int index = indexOfExtension(filename);
    if (index == -1) {
        return "";
    } else {
        return filename.substring(index + 1);
    }
}

/**
 * Returns the index of the last extension separator character, which is a dot.
 * <p>
 * This method also checks that there is no directory separator after the last dot.
 * To do this it uses {@link #indexOfLastSeparator(String)} which will
 * handle a file in either Unix or Windows format.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
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);
}

/**
 * Returns the index of the last directory separator character.
 * <p>
 * This method will handle a file in either Unix or Windows format.
 * The position of the last forward or backslash is returned.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
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);
}

Credits

  1. Von der Apache FileNameUtils-Klasse kopiert - http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.3.2/org/apache/commons/io/FilenameUtils.java#FilenameUtils. getExtension% 28java.lang.String% 29
Vasanth
quelle
1

Ohne Verwendung einer Bibliothek können Sie die String-Methode wie folgt aufteilen:

        String[] splits = fileNames.get(i).split("\\.");

        String extension = "";

        if(splits.length >= 2)
        {
            extension = splits[splits.length-1];
        }
Farah
quelle
0

Nur eine auf regulären Ausdrücken basierende Alternative. Nicht so schnell, nicht so gut.

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}
Shapiy
quelle
0

Ich habe einen besseren Weg gefunden, um eine Erweiterung zu finden, indem ich alle obigen Antworten gemischt habe

public static String getFileExtension(String fileLink) {

        String extension;
        Uri uri = Uri.parse(fileLink);
        String scheme = uri.getScheme();
        if (scheme != null && scheme.equals(ContentResolver.SCHEME_CONTENT)) {
            MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(CoreApp.getInstance().getContentResolver().getType(uri));
        } else {
            extension = MimeTypeMap.getFileExtensionFromUrl(fileLink);
        }

        return extension;
    }

public static String getMimeType(String fileLink) {
        String type = CoreApp.getInstance().getContentResolver().getType(Uri.parse(fileLink));
        if (!TextUtils.isEmpty(type)) return type;
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getMimeTypeFromExtension(FileChooserUtil.getFileExtension(fileLink));
    }
Raghav Satyadev
quelle
0

Ich mag die Einfachheit der Antwort von spectre und in einem seiner Kommentare ist ein Link zu einer anderen Antwort verlinkt, die Punkte in Dateipfaden auf einer anderen Frage von EboMike korrigiert .

Ohne eine Drittanbieter-API zu implementieren, schlage ich vor:

private String getFileExtension(File file) {

    String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')));
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf + 1); // doesn't return "." with extension
}

So etwas kann beispielsweise bei allen ImageIO- writeMethoden hilfreich sein , bei denen das Dateiformat übergeben werden muss.

Warum eine ganze API von Drittanbietern verwenden, wenn Sie selbst basteln können?

DDPWNAGE
quelle
0

Diese spezielle Frage hat mir viel Ärger gemacht, dann habe ich eine sehr einfache Lösung für dieses Problem gefunden, die ich hier poste.

file.getName().toLowerCase().endsWith(".txt");

Das ist es.

Vikram Bhardwaj
quelle
3
OP Benötigt eine Möglichkeit, eine Erweiterung zu extrahieren - nicht um eine zu testen.
Predrag Manojlovic
Was auch immer Sie in den meisten Fällen entwickeln, Sie müssen sich nur mit einem bestimmten Dateityp befassen. Wenn Ihr Problem in diesem Bereich auftritt, hilft Ihnen dies.
Vikram Bhardwaj
4
Was seine Anforderungen nicht erfüllt
Predrag Manojlovic
2
Dies ist keine Antwort auf die Frage, aber das war genau das, wonach ich gesucht habe.
Ediolot
-1

Versuche dies.

String[] extension = "adadad.adad.adnandad.jpg".split("\\.(?=[^\\.]+$)"); // ['adadad.adad.adnandad','jpg']
extension[1] // jpg
Adnane
quelle
-1
  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }
Ashish Pancholi
quelle
-4

Java hat in der Klasse java.nio.file.Files eine integrierte Methode, um damit umzugehen , die möglicherweise für Ihre Anforderungen geeignet ist :

File f = new File("/path/to/file/foo.txt");
String ext = Files.probeContentType(f.toPath());
if(ext.equalsIgnoreCase("txt")) do whatever;

Beachten Sie, dass diese statische Methode verwendet die Spezifikationen hier „Content - Type“ abgerufen werden, die unterschiedlich sein können.

Nick Giampietro
quelle
28
Das ist falsch. Der Rückgabetyp für probeContentType ist der Mime-Inhaltstyp, nicht die Dateierweiterung. Es wird normalerweise nicht mit der Erweiterung übereinstimmen. Dies wäre auch in einem Dateibrowser ziemlich langsam, da die Datei tatsächlich geöffnet wird, um den Typ zu bestimmen.
Charles