In Java gegeben a java.net.URL oder ein String in Form von http://www.example.com/some/path/to/a/file.xml , was ist der einfachste Weg, den Dateinamen abzüglich der Erweiterung zu erhalten? In diesem Beispiel suche ich also nach etwas, das zurückkehrt "file".
Ich kann mir mehrere Möglichkeiten vorstellen, dies zu tun, aber ich suche nach etwas, das leicht zu lesen und kurz ist.
SIE wissen, dass es nicht erforderlich ist, am Ende einen Dateinamen oder etwas, das wie ein Dateiname aussieht, anzugeben. In diesem Fall kann eine Datei.xml auf dem Server vorhanden sein oder nicht.
– miserable Variable
3. März ’09 um 9:47
in diesem Fall wäre das Ergebnis eine leere Zeichenfolge oder möglicherweise null.
– Sietse
3. März ’09 um 9:57
Ich denke, Sie müssen das Problem klarer definieren. Was ist mit folgenden URLS-Endungen? …./abc, …./abc/, …./abc.def, …./abc.def.ghi, …./abc?def.ghi
– miserable Variable
3. März ’09 um 10:10
Ich denke, es ist ziemlich klar. Wenn die URL auf eine Datei verweist, interessiere ich mich für den Dateinamen abzüglich der Erweiterung (sofern vorhanden). Abfrageteile liegen außerhalb des Dateinamens.
– Sietse
3. März ’09 um 10:29
der Dateiname ist der Teil der URL nach dem letzten Schrägstrich. die Dateierweiterung ist der Teil des Dateinamens nach dem letzten Punkt.
– Sietse
12. Juni ’12 um 10:59
Adrian B.
Anstatt das Rad neu zu erfinden, wie wäre es mit Apache Commons-io:
import org.apache.commons.io.FilenameUtils;
public class FilenameUtilTest {
public static void main(String[] args) throws Exception {
URL url = new URL("http://www.example.com/some/path/to/a/file.xml?foo=bar#test");
System.out.println(FilenameUtils.getBaseName(url.getPath())); // -> file
System.out.println(FilenameUtils.getExtension(url.getPath())); // -> xml
System.out.println(FilenameUtils.getName(url.getPath())); // -> file.xml
}
}
Es erscheint seltsam, eine Abhängigkeit von commons-io hinzuzufügen, wenn einfache Lösungen einfach mit dem JDK verfügbar sind (siehe URL#getPath und String#substring oder Path#getFileName oder File#getName).
– Jason C
6. Mai ’15 um 20:31
Die FilenameUtils-Klasse wurde entwickelt, um mit Windows und *nix-Pfad zu arbeiten, nicht mit URL.
– nhahtdh
29. Juli ’15 um 9:22
Beispiel aktualisiert, um eine URL zu verwenden, Beispielausgabewerte anzuzeigen und Abfrageparameter zu verwenden.
Warum die Ablehnung? Das ist unfair. Mein Code funktioniert, ich habe meinen Code gerade überprüft, nachdem ich die Ablehnung gesehen habe.
– Echtes Rot.
3. März ’09 um 9:49
Ich habe dich positiv bewertet, weil es etwas lesbarer ist als meine Version. Die Ablehnung kann daran liegen, dass es nicht funktioniert, wenn keine Erweiterung oder keine Datei vorhanden ist.
– Sietse
3. März ’09 um 9:59
Sie können den zweiten Parameter weglassen, um substring()
– Jon Onstott
6. Dezember ’14 um 23:47
Das funktioniert bei beiden nicht http://example.org/file#anchor, http://example.org/file?p=foo&q=bar Noch http://example.org/file.xml#/p=foo&q=bar
– Matthias Ronge
29. Januar ’15 um 8:58
Wenn du lässt String url = new URL(original_url).getPath() und fügen Sie einen Sonderfall für Dateinamen hinzu, die kein a . enthalten . dann funktioniert das gut.
– Jason C
6. Mai ’15 um 20:28
Wenn Sie die Dateierweiterung nicht entfernen müssen, können Sie dies ohne fehleranfällige String-Manipulation und ohne Verwendung externer Bibliotheken tun. Funktioniert mit Java 1.7+:
@Carcigenate Ich habe es gerade noch einmal getestet und es scheint gut zu funktionieren. URI.getPath() gibt a . zurück String, also verstehe ich nicht, warum es nicht funktionieren sollte
– Zoltán
23. März ’18 um 10:15
Nvm. Mir ist jetzt klar, dass mein Problem darauf zurückzuführen ist, wie Clojure Var-Args während der Java-Interop behandelt. Die String-Überladung funktionierte nicht, da auch ein leeres Array übergeben werden musste, um die Var-Args von Paths/get zu verarbeiten. Es funktioniert jedoch immer noch, wenn Sie den Anruf loswerden getPath, und verwenden Sie stattdessen die URI-Überladung.
– krebserregend
23. März ’18 um 13:00
@Carcigenate meinst du Paths.get(new URI(url))? Das scheint bei mir nicht zu funktionieren
– Zoltán
11. Januar ’19 um 9:49
getFileName erfordert Android-API-Level 26
– Manuela
12. März ’20 um 9:11
tehvan
Dies sollte es ungefähr schaffen (die Fehlerbehandlung überlasse ich Ihnen):
import java.io.File
import java.net.URI
val uri = new URI("http://example.org/file.txt?whatever")
new File(uri.getPath).getName
res18: String = file.txt
Notiz: URI#gePath ist bereits intelligent genug, um Abfrageparameter und das Schema des Protokolls zu entfernen. Beispiele:
new URI("http://example.org/hey/file.txt?whatever").getPath
res20: String = /hey/file.txt
new URI("hdfs:///hey/file.txt").getPath
res21: String = /hey/file.txt
new URI("file:///hey/file.txt").getPath
res22: String = /hey/file.txt
schöne Lösung!
– CybeX
22. Januar ’18 um 14:58 Uhr
Dies ist die beste Option, da nur Standard-JDK verwendet wird
– Alexandros
19. April ’18 um 17:36
Am Ende des Tages habe ich mich gerade damit abgefunden. Elegante Lösung.
– Yusuph wickama
3. August ’21 um 5:45
Mike
public static String getFileName(URL extUrl) {
//URL: "http://photosaaaaa.net/photos-ak-snc1/v315/224/13/659629384/s659629384_752969_4472.jpg"
String filename = "";
//PATH: /photos-ak-snc1/v315/224/13/659629384/s659629384_752969_4472.jpg
String path = extUrl.getPath();
//Checks for both forward and/or backslash
//NOTE:**While backslashes are not supported in URL's
//most browsers will autoreplace them with forward slashes
//So technically if you're parsing an html page you could run into
//a backslash , so i'm accounting for them here;
String[] pathContents = path.split("[\\/]");
if(pathContents != null){
int pathContentsLength = pathContents.length;
System.out.println("Path Contents Length: " + pathContentsLength);
for (int i = 0; i < pathContents.length; i++) {
System.out.println("Path " + i + ": " + pathContents[i]);
}
//lastPart: s659629384_752969_4472.jpg
String lastPart = pathContents[pathContentsLength-1];
String[] lastPartContents = lastPart.split("\.");
if(lastPartContents != null && lastPartContents.length > 1){
int lastPartContentLength = lastPartContents.length;
System.out.println("Last Part Length: " + lastPartContentLength);
//filenames can contain . , so we assume everything before
//the last . is the name, everything after the last . is the
//extension
String name = "";
for (int i = 0; i < lastPartContentLength; i++) {
System.out.println("Last Part " + i + ": "+ lastPartContents[i]);
if(i < (lastPartContents.length -1)){
name += lastPartContents[i] ;
if(i < (lastPartContentLength -2)){
name += ".";
}
}
}
String extension = lastPartContents[lastPartContentLength -1];
filename = name + "." +extension;
System.out.println("Name: " + name);
System.out.println("Extension: " + extension);
System.out.println("Filename: " + filename);
}
}
return filename;
}
schöne Lösung!
– CybeX
22. Januar ’18 um 14:58 Uhr
Dies ist die beste Option, da nur Standard-JDK verwendet wird
– Alexandros
19. April ’18 um 17:36
Am Ende des Tages habe ich mich gerade damit abgefunden. Elegante Lösung.
– Yusuph wickama
3. August ’21 um 5:45
Hiren Patel
Werden Datei Name mit Erweiterung, ohne Erweiterung, nur Erweiterung mit nur 3 Zeilen:
SIE wissen, dass es nicht erforderlich ist, am Ende einen Dateinamen oder etwas, das wie ein Dateiname aussieht, anzugeben. In diesem Fall kann eine Datei.xml auf dem Server vorhanden sein oder nicht.
– miserable Variable
3. März ’09 um 9:47
in diesem Fall wäre das Ergebnis eine leere Zeichenfolge oder möglicherweise null.
– Sietse
3. März ’09 um 9:57
Ich denke, Sie müssen das Problem klarer definieren. Was ist mit folgenden URLS-Endungen? …./abc, …./abc/, …./abc.def, …./abc.def.ghi, …./abc?def.ghi
– miserable Variable
3. März ’09 um 10:10
Ich denke, es ist ziemlich klar. Wenn die URL auf eine Datei verweist, interessiere ich mich für den Dateinamen abzüglich der Erweiterung (sofern vorhanden). Abfrageteile liegen außerhalb des Dateinamens.
– Sietse
3. März ’09 um 10:29
der Dateiname ist der Teil der URL nach dem letzten Schrägstrich. die Dateierweiterung ist der Teil des Dateinamens nach dem letzten Punkt.
– Sietse
12. Juni ’12 um 10:59