Juste pour être clair, je ne recherche pas le type MIME.
Disons que j'ai l'entrée suivante: /path/to/file/foo.txt
Je voudrais un moyen de décomposer cette entrée, en particulier .txt
pour l'extension. Existe-t-il un moyen intégré de le faire en Java? Je voudrais éviter d'écrire mon propre analyseur.
"txt"
de"filename.txt"
parce que certains quelque part la plate - forme pourrait vouloir utiliser"filename,txt"
.path.substring(path.lastIndexOf("."));
..... Et oui ... Ils sont sûrs de ne pas dupliquer quelque chose pour rien ...".txt"
de"filename.txt"
, ce qui n'est peut-être pas le résultat souhaité, et pire encore, il échoue avecStringIndexOutOfBoundsException
au lieu de renvoyer une chaîne vide s'il n'y a pas d'extension.Réponses:
Dans ce cas, utilisez FilenameUtils.getExtension depuis Apache Commons IO
Voici un exemple de la façon de l'utiliser (vous pouvez spécifier le chemin d'accès complet ou simplement le nom du fichier):
Dépendance Maven:
Gradle Groovy DSL
Gradle Kotlin DSL
Autres https://search.maven.org/artifact/commons-io/commons-io/2.6/jar
la source
Avez-vous vraiment besoin d'un "analyseur" pour cela?
En supposant que vous ayez affaire à des noms de fichiers similaires à Windows, pas quelque chose comme ça
archive.tar.gz
.Btw, dans le cas où un répertoire peut avoir un '.', Mais le nom de fichier lui-même ne le fait pas (comme
/path/to.a/file
), vous pouvez le fairela source
i > 0
devrait être changé eni >= 0
oui != -1
. Cela prend en charge les noms de fichiers comme.htaccess
.la source
Si vous utilisez la bibliothèque Guava , vous pouvez recourir à la
Files
classe d'utilité. Il a une méthode spécifique,getFileExtension()
. Par exemple:De plus, vous pouvez également obtenir le nom de fichier avec une fonction similaire, getNameWithoutExtension () :
la source
getFileExtension
ce n'estint dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)
vraiment pas grave. notez également queFiles
marqué comme "instable" pour une raison quelconque.Si sur Android, vous pouvez utiliser ceci:
la source
Afin de prendre en compte les noms de fichiers sans caractères avant le point, vous devez utiliser cette légère variation de la réponse acceptée:
la source
Ceci est une méthode testée
Et cas de test:
la source
Mon sale et peut minuscule en utilisant String.replaceAll :
Notez que le premier
*
est gourmand, donc il saisira autant de caractères que possible, puis il ne restera que le dernier point et l'extension de fichier.la source
.replaceAll(".*\\.", "")
retourner ".txt"
si vous ne voulez que "txt", faites
path.lastIndexOf(".") + 1
la source
Comme il ressort de toutes les autres réponses, il n'y a pas de fonction «intégrée» adéquate. Il s'agit d'une méthode simple et sûre.
la source
Que diriez-vous (en utilisant Java 1.5 RegEx):
la source
Si vous prévoyez d'utiliser commons-io Apache, et que vous voulez juste vérifier l'extension du fichier puis effectuez une opération, vous pouvez utiliser ce , voici un extrait:
la source
Voici un autre one-liner pour Java 8.
Cela fonctionne comme suit:
la source
Qu'en est-il de JFileChooser? Ce n'est pas simple car vous devrez analyser sa sortie finale ...
qui est un type MIME ...
OK ... j'oublie que vous ne voulez pas connaître son type MIME.
Code intéressant dans le lien suivant: http://download.oracle.com/javase/tutorial/uiswing/components/filechooser.html
Question connexe: Comment découper une extension de fichier à partir d'une chaîne en Java?
la source
Voici une méthode qui gère
.tar.gz
correctement, même dans un chemin avec des points dans les noms de répertoire:afterLastSlash
est créé pourafterLastBackslash
accélérer la recherche car il n'aura pas à rechercher la chaîne entière s'il y a des barres obliques.L'
char[]
intérieur de l'originalString
est réutilisé, sans ajout de déchets, et la JVM remarquera probablement qu'ilafterLastSlash
s'agit immédiatement de déchets afin de le mettre sur la pile au lieu du tas .la source
getExtension
fonction. Si le nom de fichier de l'utilisateur est"my zip. don't touch.tar.gz"
alors cette méthode retournera la mauvaise extension.l'extension doit avoir ".txt" en cours d'exécution.
la source
Voici la version avec Facultatif comme valeur de retour (car vous ne pouvez pas être sûr que le fichier a une extension) ...
la source
Que diriez- vous de la version REGEX :
ou avec une extension nulle prise en charge:
résultat pour * nix:
chemin: / root / docs /
nom: readme
Extension: txt
pour Windows, parsePath ("c: \ windows \ readme.txt"):
chemin: c: \ windows \
nom: readme
Extension: txt
la source
la source
Ici, j'ai fait une petite méthode (mais pas si sécurisée et ne vérifie pas de nombreuses erreurs), mais si c'est seulement vous qui programmez un programme java général, c'est plus que suffisant pour trouver le type de fichier. Cela ne fonctionne pas pour les types de fichiers complexes, mais ceux-ci ne sont normalement pas autant utilisés.
la source
lastIndexOf
les noms de fichiers comme ceux-cijohn.smith.report.doc
sont traités correctement. (2) Vous devez gérer correctement les cas lorsqu'il n'y a pas d'extension. Cette méthode retourneABC/XYZ
pour un chemin commeabc/xyz
, ce qui n'a aucun sens. Il serait plus logique de revenir""
ounull
. (3) Le séparateur de fichiers n'est pas toujours/
.Obtention d'une extension de fichier à partir d'un nom de fichier
Crédits
la source
Sans utiliser de bibliothèque, vous pouvez utiliser la méthode String divisée comme suit:
la source
Juste une alternative basée sur l'expression régulière. Pas si vite, pas si bien.
la source
J'ai trouvé un meilleur moyen de trouver une extension en mélangeant toutes les réponses ci-dessus
la source
J'aime la simplicité de la réponse du spectre , et lié dans l'un de ses commentaires est un lien vers une autre réponse qui fixe des points dans les chemins de fichiers, sur une autre question, faite par EboMike .
Sans implémenter une sorte d'API tierce, je suggère:
Quelque chose comme ça peut être utile, par exemple, dans n'importe laquelle des
write
méthodes d'ImageIO , où le format de fichier doit être transmis.Pourquoi utiliser une API tierce quand vous pouvez bricoler?
la source
Cette question particulière m'a donné beaucoup de mal alors j'ai trouvé une solution très simple à ce problème que je poste ici.
C'est ça.
la source
essaye ça.
la source
la source
Java a une manière intégrée de gérer cela, dans la classe java.nio.file.Files , qui peut répondre à vos besoins:
Notez que cette méthode statique utilise les spécifications trouvées ici pour récupérer le "type de contenu", qui peut varier.
la source