Für 95% der Projekte sollte dies die akzeptierte Antwort sein. Das Umschreiben von Code wie diesem ist die Hauptursache für viele Kopfschmerzen!
Carsten Hoffmann
1
Fügen Sie einfach die folgende Zeile in Gradle hinzu, um die Abhängigkeit hinzuzufügen: - Kompilieren Sie 'commons-io: commons-io: 2.6'
Deepak Sharma
Beispiel bitte.
John Ktejik
8
Wenn Sie Apache Commons I / O bereits in Ihrem Projekt haben, ist das richtig. Wenn dies jedoch alles ist, was Sie dafür benötigen, fügen Sie Ihrem Projekt (mindestens) 2,5 MB Eigengewicht hinzu, um etwas zu erreichen, das problemlos mit einer einzigen Zeile erledigt werden kann.
if (str! = null && str.contains (".")) str.substring (0, str.lastIndexOf ('.')). FilenameUtils ist eine weitere Abhängigkeit und nicht immer verfügbar
Ocramot
88
Da die Verwendung von String.substringund String.lastIndexin einem Einzeiler gut ist, gibt es einige Probleme hinsichtlich der Fähigkeit, mit bestimmten Dateipfaden umzugehen.
Nehmen Sie zum Beispiel den folgenden Weg:
a.b/c
Die Verwendung des Einzeilers führt zu:
a
Das ist falsch
Das Ergebnis hätte sein sollen c, aber da der Datei eine Erweiterung fehlte, der Pfad jedoch ein Verzeichnis mit einem .im Namen hatte, wurde die Einzeiler-Methode dazu verleitet, einen Teil des Pfads als Dateinamen anzugeben, was nicht korrekt ist.
Um sein Verhalten wiederherzustellen, habe ich einige Tests geschrieben, die die neue Methode erfüllen sollte:
Pfad Dateiname
-------------- --------
a / b / cc
a / b / c.jpg c
a / b / c.jpg.jpg c.jpg
ab / cc
ab / c.jpg c
ab / c.jpg.jpg c.jpg
cc
c.jpg c
c.jpg.jpg c.jpg
(Und das ist alles, worauf ich überprüft habe - es gibt wahrscheinlich andere Überprüfungen, die vorhanden sein sollten, die ich übersehen habe.)
Die Umsetzung
Das Folgende ist meine Implementierung für die removeExtensionMethode:
Wenn Sie diese removeExtensionMethode mit den oben genannten 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, \das \bei Verwendung als Teil eines StringLiteral mit einem Escapezeichen versehen werden muss.
Nein, es könnte mehr als ein '.' Geben. du willst lastIndexOf ('.')
Adam Jaskiewicz
-1 für die Nichtanwendung der Methode, von der ich dachte, dass Sie sie verwenden. Das sind jetzt insgesamt +0 von mir. Ändere es schnell! ;)
Michael Myers
7
String fileName="foo.bar";int dotIndex=fileName.lastIndexOf('.');if(dotIndex>=0){// to prevent exception if there is no dot
fileName=fileName.substring(0,dotIndex);}
Verwenden Sie eine Methode im com.google.common.io.FilesUnterricht, wenn Ihr Projekt bereits von der Google-Kernbibliothek abhängig ist. Die Methode, die Sie benötigen, ist getNameWithoutExtension.
Dadurch wird "a.jpg.jpg" in "a" anstelle des (korrekten) "a.jpg" umgewandelt. Welchem Zweck dient die file.length() > 0Prüfung?
Klaus Gütter
Die Hauptfrage war "Wie entferne ich die Erweiterung?", Also ja, die Transformation "a.txt.zip" in "a" und ".htaccess" in Leere. Diese Funktion funktioniert mit Strings, sodass Dateinamen nicht null, aber dennoch 0 lang sein können. Überprüfen Sie schneller, ob es sich lohnt, bevor Sie Symbole analysieren. Grüße.
Antworten:
Dies ist die Art von Code, die wir nicht selbst machen sollten. Verwenden Sie Bibliotheken für das Alltägliche, retten Sie Ihr Gehirn für das Harte.
In diesem Fall empfehle ich die Verwendung von FilenameUtils.removeExtension () von Apache Commons IO
quelle
quelle
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Da die Verwendung von
String.substring
undString.lastIndex
in einem Einzeiler gut ist, gibt es einige Probleme hinsichtlich der Fähigkeit, mit bestimmten Dateipfaden umzugehen.Nehmen Sie zum Beispiel den folgenden Weg:
Die Verwendung des Einzeilers führt zu:
Das ist falsch
Das Ergebnis hätte sein sollen
c
, aber da der Datei eine Erweiterung fehlte, der Pfad jedoch ein Verzeichnis mit einem.
im Namen hatte, wurde die Einzeiler-Methode dazu verleitet, einen Teil des Pfads als Dateinamen anzugeben, was nicht korrekt ist.Notwendigkeit von Schecks
Inspiriert von Skaffmans Antwort , habe ich mir die
FilenameUtils.removeExtension
Methode des Apache Commons IO angesehen .Um sein Verhalten wiederherzustellen, habe ich einige Tests geschrieben, die die neue Methode erfüllen sollte:
(Und das ist alles, worauf ich überprüft habe - es gibt wahrscheinlich andere Überprüfungen, die vorhanden sein sollten, die ich übersehen habe.)
Die Umsetzung
Das Folgende ist meine Implementierung für die
removeExtension
Methode:Wenn Sie diese
removeExtension
Methode mit den oben genannten 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,
\
das\
bei Verwendung als Teil einesString
Literal mit einem Escapezeichen versehen werden muss.Die Ergebnisse waren:
Die Ergebnisse sind die gewünschten Ergebnisse, die in dem Test aufgeführt sind, den die Methode erfüllen sollte.
quelle
System.getProperty("file.separator")
und nicht nurFile.separator
?/path/to/.htaccess
Übrigens, in meinem Fall, als ich eine schnelle Lösung zum Entfernen einer bestimmten Erweiterung wollte, habe ich ungefähr Folgendes getan:
quelle
quelle
Ist das eine Trickfrage? : p
Ich kann mir keinen schnelleren Weg vorstellen.
quelle
Verwenden Sie eine Methode im
com.google.common.io.Files
Unterricht, wenn Ihr Projekt bereits von der Google-Kernbibliothek abhängig ist. Die Methode, die Sie benötigen, istgetNameWithoutExtension
.quelle
Sie können diese Funktion ausprobieren, sehr einfach
quelle
Ich habe die Antwort von coolbird gefunden besonders nützlich.
Aber ich habe die letzten Ergebnisaussagen geändert in:
da ich wollte, dass der vollständige Pfadname zurückgegeben wird.
quelle
quelle
Verwenden Sie einen regulären Ausdruck. Dieser ersetzt den letzten Punkt und alles danach.
Sie können auch ein Musterobjekt erstellen, wenn Sie den regulären Ausdruck vorkompilieren möchten.
quelle
quelle
"\\."
als "." ist speziell für Regex.Erstellen Sie eine neue Datei mit dem Pfad des Zeichenfolgenbilds
quelle
org.apache.commons.io.FilenameUtils Version 2.4 gibt die folgende Antwort
quelle
quelle
Das würde mir gefallen:
Vom Ende bis zum '.' Rufen Sie dann Teilzeichenfolge auf.
Edit: Könnte kein Golf sein, aber es ist effektiv :)
quelle
Beachten Sie die Szenarien, in denen es keine Dateierweiterung oder mehr als eine Dateierweiterung gibt
Beispiel Dateiname: Datei | file.txt | file.tar.bz2
quelle
Dies gibt ein Beispiel für img und imgLink aus
quelle
quelle
file.length() > 0
Prüfung?