Obtenez de nom de fichier à partir de l'URL
En Java, compte tenu d'une java.net.URL
ou un String
dans la forme de http://www.example.com/some/path/to/a/file.xml
, quelle est la meilleure façon d'obtenir le nom de fichier, moins l'extension? Ainsi, dans cet exemple, je suis à la recherche de quelque chose qui renvoie "file"
.
Je peux penser à plusieurs façons de le faire, mais je suis à la recherche de quelque chose qui est facile à lire et court.
- Vous VOUS rendez compte il n'est pas nécessaire pour qu'il y ait un nom de fichier à la fin, ou même quelque chose qui ressemble à un nom de fichier. Dans ce cas, il peut ou peut ne pas être un file.xml sur le serveur.
- dans ce cas, le résultat devrait être une chaîne vide, ou peut-être null.
- Je pense que vous avez besoin de définir le problème plus clairement. Quid des URL suivantes terminaisons? ..../abc, ..../abc/, ..../abc.def, ..../abc.def.ghi, ..../abc?def.ghi
- Je pense que c'est assez clair. Si l'URL pointe vers un fichier, je suis intéressé par le nom de fichier moins l'extension (si il en a un). Requête les pièces tombent en dehors du nom de fichier.
- Le client n'a aucun moyen de savoir si le serveur utilise un fichier!
- Vous n'avez pas défini avec précision ce que vous voulez dire par un "nom de fichier" ou une "extension" - et non, ce ne sont pas des termes que tout le monde comprenne de la même manière.
- le nom de fichier est la partie de l'url après le dernier slash. l'extension de fichier est la partie du nom de fichier après la dernière période.
- Vous pourriez être en mesure de le faire à l'aide de l'Apache Commons IO FilenameUtils classe. Voir la réponse fournie par slashnick: stackoverflow.com/questions/8393849/...
- Connexes: stackoverflow.com/questions/4050087/... (Contient la meilleure réponse, pas de dépendance, mais ne pas atteindre l'objectif de suppression de l'extension.)
Vous devez vous connecter pour publier un commentaire.
Plutôt que de réinventer la roue, et à l'aide d'Apache commons-io:
URL#getPath
etString#substring
ouPath#getFileName
ouFile#getName
).compile 'commons-io:commons-io:2.4'
pour Gradle et<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
pour mavenunable to resolve class org.apache.commons.io.FilenameUtils
ce n'est pas une solution valable pour tous les environnements.substring()
http://example.org/file#anchor
,http://example.org/file?p=foo&q=bar
nihttp://example.org/file.xml#/p=foo&q=bar
String url = new URL(original_url).getPath()
et ajouter un cas particulier pour les noms de fichiers qui ne contiennent pas un.
alors cela fonctionne bien.\
ou:
?Ce doit couper (je vais laisser la gestion d'erreur pour vous):
http://www.example.com/
ouhttp://www.example.com/folder/
)lastIndexOf
ne fonctionne pas de cette façon. Mais l'intention est claire.Si vous n'avez pas besoin de se débarrasser de l'extension de fichier, voici un moyen de le faire sans recourir à des erreurs de manipulation de Chaîne et sans utiliser des bibliothèques externes. Fonctionne avec Java 1.7+:
URI.getPath()
renvoie uneString
, donc je ne vois pas pourquoi ça ne marcherait pasgetPath
, et utiliser l'URI de surcharge à la place.Paths.get(new URI(url))
? Cela ne semble pas fonctionner pour moiObtenir Fichier Nom avec l'Extension, sans l'Extension, seule Extension avec seulement 3 ligne:
Résultat Du Journal:
Espère que ça va vous aider.
J'ai trouvé ceci:
Faire simple :
url.getFile()
avecurl.toString()
et il fonctionne avec#
dans le chemin d'accès.Un liner:
Code complet:
Note:
URI#gePath
est déjà assez intelligent pour dépouiller les paramètres de la requête et le protocole du programme. Exemples:Ici est la façon la plus simple de le faire sur Android. Je sais que ça ne fonctionnera pas en Java, mais Il peut aider à développeur d'applications Android.
Créer un objet d'URL à partir de la Chaîne. Lors de la première que vous avez un objet d'URL il existe des méthodes de tirer facilement juste au sujet de toute bribe d'information dont vous avez besoin.
Je peux que recommander fortement la Javaalmanac site web qui a des tonnes d'exemples, mais qui a depuis déménagé. Vous pourriez trouver http://exampledepot.8waytrips.com/egs/java.io/File2Uri.html intéressant:
Il y a quelques façons:
Java 7 E/S De Fichier:
Apache Commons:
À L'Aide De Jersey:
Sous-chaîne:
Si vous souhaitez obtenir uniquement le nom de fichier à partir d'un java.net.URL (non compris les paramètres de la requête), vous pouvez utiliser la fonction suivante:
Par exemple, cette saisie de l'URL:
Doit être traduit cette Chaîne de sortie:
J'ai trouvé que certaines urls lorsqu'il est passé directement à
FilenameUtils.getName
retour des résultats indésirables, et ceci doit être pris pour éviter les exploits.Par exemple,
retourne
dont je doute que quelqu'un veut le permettre.
La fonction suivante semble bien fonctionner, et montre certains de ces cas de test, et il retourne
null
lorsque le nom de fichier ne peut pas être déterminé.Cela est enveloppé avec certains tests simples cas dans l'exemple suivant:
Url peuvent avoir des paramètres à la fin, ce
/
peuvent apparaître dans le fragment. Vous extrait de mauvaises choses.La
Url
objet dans urllib vous permet d'accéder au chemin d'accès du nom de fichier sans échappement. Voici quelques exemples:andy réponse refaite à l'aide de la fonction split():
Comment à ce sujet:
Afin de retourner le nom de fichier sans l'extension et sans paramètres utiliser les éléments suivants:
Afin de retourner nom de fichier avec l'extension sans params utiliser ceci:
Au-delà de l'ensemble des méthodes de pointe, mon truc simple est
StringTokenizer
:J'ai le même problème, avec la vôtre. Je l'ai résolu en ce:
importer java.io.*;
J'espère que cela va vous aider.