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 .txt
für die Erweiterung aufzuteilen. Gibt es eine eingebaute Möglichkeit, dies in Java zu tun? Ich möchte vermeiden, meinen eigenen Parser zu schreiben.
"txt"
von der zurückgegeben wird,"filename.txt"
da eine Plattform möglicherweise irgendwo verwendet werden möchte"filename,txt"
.path.substring(path.lastIndexOf("."));
..... Und ja .. Sie werden sicher nicht umsonst etwas duplizieren ...".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,StringIndexOutOfBoundsException
anstatt eine leere Zeichenfolge zurückzugeben, wenn keine Erweiterung vorhanden ist.Antworten:
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):
Maven-Abhängigkeit:
Gradle Groovy DSL
Gradle Kotlin DSL
Andere https://search.maven.org/artifact/commons-io/commons-io/2.6/jar
quelle
Benötigen Sie dafür wirklich einen "Parser"?
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 tunquelle
i > 0
sollte geändert werden zui >= 0
oderi != -1
. Dies kümmert sich um Dateinamen wie.htaccess
.quelle
Wenn Sie die Guava- Bibliothek verwenden, können Sie auf die
Files
Utility-Klasse zurückgreifen . Es hat eine bestimmte MethodegetFileExtension()
. Zum Beispiel:Darüber hinaus erhalten Sie möglicherweise auch den Dateinamen mit einer ähnlichen Funktion, getNameWithoutExtension () :
quelle
getFileExtension
tatsächlich sehen, ist es einfachint dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)
keine große Sache. Beachten Sie auch, dassFiles
aus irgendeinem Grund als "instabil" markiert.Unter Android können Sie Folgendes verwenden:
quelle
Um Dateinamen ohne Zeichen vor dem Punkt zu berücksichtigen , müssen Sie diese geringfügige Abweichung der akzeptierten Antwort verwenden:
quelle
Dies ist eine getestete Methode
Und Testfall:
quelle
Mein schmutziger und vielleicht kleinster mit String.replaceAll :
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.quelle
.replaceAll(".*\\.", "")
return ".txt"
Wenn Sie nur "txt" wollen, machen Sie
path.lastIndexOf(".") + 1
quelle
Wie aus allen anderen Antworten hervorgeht, gibt es keine adäquate "eingebaute" Funktion. Dies ist eine sichere und einfache Methode.
quelle
Wie wäre es (mit Java 1.5 RegEx):
quelle
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:
quelle
Hier ist ein weiterer Einzeiler für Java 8.
Es funktioniert wie folgt:
quelle
Wie wäre es mit JFileChooser? Es ist nicht einfach, da Sie die endgültige Ausgabe analysieren müssen ...
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
Verwandte Frage: Wie schneide ich eine Dateierweiterung aus einem String in Java?
quelle
Hier ist eine Methode, die
.tar.gz
auch in einem Pfad mit Punkten in Verzeichnisnamen ordnungsgemäß funktioniert:afterLastSlash
wurde erstellt, um das Auffinden zuafterLastBackslash
beschleunigen, da nicht die gesamte Zeichenfolge durchsucht werden muss, wenn einige Schrägstriche darin enthalten sind.Das
char[]
Innere des OriginalsString
wird wiederverwendet, wobei dort kein Müll hinzugefügt wird, und die JVM wird wahrscheinlich feststellen, dassafterLastSlash
es sich sofort um Müll handelt, um ihn auf den Stapel anstatt auf den Haufen zu legen .quelle
getExtension
Funktion prüfen . Wenn der Dateiname des Benutzers lautet, gibt"my zip. don't touch.tar.gz"
diese Methode die falsche Erweiterung zurück.Die Erweiterung sollte beim Ausführen ".txt" enthalten.
quelle
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 ...
quelle
Wie wäre es mit der REGEX- Version:
oder mit unterstützter Null-Erweiterung:
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
quelle
quelle
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.
quelle
lastIndexOf
damit Dateinamen wiejohn.smith.report.doc
richtig behandelt werden. (2) Sie sollten Fälle ordnungsgemäß behandeln, wenn keine Verlängerung vorhanden ist. Diese Methode gibtABC/XYZ
für einen Pfad wie zurückabc/xyz
, was keinen Sinn ergibt. Es wäre sinnvoller, zurückzukehren""
odernull
. (3) Das Dateitrennzeichen ist nicht immer/
.Abrufen der Dateierweiterung vom Dateinamen
Credits
quelle
Ohne Verwendung einer Bibliothek können Sie die String-Methode wie folgt aufteilen:
quelle
Nur eine auf regulären Ausdrücken basierende Alternative. Nicht so schnell, nicht so gut.
quelle
Ich habe einen besseren Weg gefunden, um eine Erweiterung zu finden, indem ich alle obigen Antworten gemischt habe
quelle
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:
So etwas kann beispielsweise bei allen ImageIO-
write
Methoden hilfreich sein , bei denen das Dateiformat übergeben werden muss.Warum eine ganze API von Drittanbietern verwenden, wenn Sie selbst basteln können?
quelle
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.
Das ist es.
quelle
Versuche dies.
quelle
quelle
Java hat in der Klasse java.nio.file.Files eine integrierte Methode, um damit umzugehen , die möglicherweise für Ihre Anforderungen geeignet ist :
Beachten Sie, dass diese statische Methode verwendet die Spezifikationen hier „Content - Type“ abgerufen werden, die unterschiedlich sein können.
quelle