code efficace sage, est ce que vous voulez dire que je l' espère, pas sage CPU
mkoryak
3
Il ne demandait pas comment faire, il demandait quelle était la manière la plus efficace. Je suis venu ici à la recherche de la même chose.
Edward Falk
Réponses:
285
C'est le genre de code que nous ne devrions pas faire nous-mêmes. Utilisez des bibliothèques pour les choses banales, gardez votre cerveau pour les choses difficiles.
Pour 95% des projets, cela devrait être la réponse acceptée. La réécriture de code comme celui-ci est à l'origine de nombreux maux de tête!
Carsten Hoffmann
1
Ajoutez simplement la ligne suivante dans gradle pour ajouter la dépendance: - compilez 'commons-io: commons-io: 2.6'
Deepak Sharma
exemple s'il vous plaît.
john ktejik
8
Si vous avez déjà des E / S Apache Commons dans votre projet, c'est vrai. Mais si tout ce dont vous avez besoin, vous ajoutez (au moins) 2,5 Mo de poids mort à votre projet pour quelque chose qui peut être facilement réalisé avec une seule ligne.
if (str! = null && str.contains (".")) str.substring (0, str.lastIndexOf ('.')). FilenameUtils est une autre dépendance, et pas toujours disponible
ocramot
88
Comme l'utilisation de String.substringet String.lastIndexdans une seule ligne est une bonne chose, il y a quelques problèmes en termes de capacité à gérer certains chemins de fichiers.
Prenons par exemple le chemin suivant:
a.b/c
L'utilisation du one-liner entraînera:
a
C'est incorrect.
Le résultat aurait dû être c, mais comme le fichier n'avait pas d'extension, mais que le chemin avait un répertoire avec un .dans le nom, la méthode one-liner a été trompée en donnant une partie du chemin comme nom de fichier, ce qui n'est pas correct.
Afin de recréer son comportement, j'ai écrit quelques tests que la nouvelle méthode devrait remplir, qui sont les suivants:
Nom de fichier du chemin
-------------- --------
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
(Et c'est tout ce que j'ai vérifié - il y a probablement d'autres contrôles qui devraient être en place que j'ai négligés.)
La mise en oeuvre
Voici mon implémentation pour la removeExtensionméthode:
L'exécution de cette removeExtensionméthode avec les tests ci-dessus donne les résultats énumérés ci-dessus.
La méthode a été testée avec le code suivant. Comme cela a été exécuté sous Windows, le séparateur de chemin est un \qui doit être échappé avec un \lorsqu'il est utilisé dans le cadre d'un Stringlittéral.
Très bonne réponse. Y a-t-il une raison particulière pour laquelle vous utilisez System.getProperty("file.separator")et pas seulement File.separator?
halirutan le
2
Un mot d'avertissement: cette solution supprime également le chemin précédent, pas seulement l'extension, contrairement à la méthode Apache Commons IO.
DHa
3
Il semble que cela échouera pour le/path/to/.htaccess
Kuzeko
17
BTW, dans mon cas, lorsque je voulais une solution rapide pour supprimer une extension spécifique, c'est à peu près ce que j'ai fait:
Non, il peut y en avoir plus d'un "."; vous voulez lastIndexOf ('.')
Adam Jaskiewicz
-1 pour ne pas utiliser la méthode que je pensais que vous utilisiez. C'est maintenant un total de +0 de ma part. Changez-le vite! ;)
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);}
Est-ce une question piège? : p
Je ne peux pas penser à un guichet automatique plus rapide.
Utilisez une méthode en com.google.common.io.Filesclasse si votre projet dépend déjà de la bibliothèque principale de Google. La méthode dont vous avez besoin est getNameWithoutExtension.
Cela transformera "a.jpg.jpg" en "a" au lieu du (correct) "a.jpg". Dans quel but sert le file.length() > 0chèque?
Klaus Gütter
La question principale était "comment supprimer l'extension?", Donc oui, sa transformation "a.txt.zip" en "a" et ".htaccess" en vide. Cette fonction fonctionne avec les chaînes, donc les noms de fichiers peuvent ne pas être nuls mais peuvent toujours avoir une longueur de 0, vérifiez plus rapidement si cela en vaut la peine avant d'analyser les symboles. Cordialement.
Réponses:
C'est le genre de code que nous ne devrions pas faire nous-mêmes. Utilisez des bibliothèques pour les choses banales, gardez votre cerveau pour les choses difficiles.
Dans ce cas, je recommande d'utiliser FilenameUtils.removeExtension () d' Apache Commons IO
la source
la source
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Comme l'utilisation de
String.substring
etString.lastIndex
dans une seule ligne est une bonne chose, il y a quelques problèmes en termes de capacité à gérer certains chemins de fichiers.Prenons par exemple le chemin suivant:
L'utilisation du one-liner entraînera:
C'est incorrect.
Le résultat aurait dû être
c
, mais comme le fichier n'avait pas d'extension, mais que le chemin avait un répertoire avec un.
dans le nom, la méthode one-liner a été trompée en donnant une partie du chemin comme nom de fichier, ce qui n'est pas correct.Besoin de chèques
Inspiré par la réponse de skaffman , j'ai jeté un coup d'œil à la
FilenameUtils.removeExtension
méthode de l' Apache Commons IO .Afin de recréer son comportement, j'ai écrit quelques tests que la nouvelle méthode devrait remplir, qui sont les suivants:
(Et c'est tout ce que j'ai vérifié - il y a probablement d'autres contrôles qui devraient être en place que j'ai négligés.)
La mise en oeuvre
Voici mon implémentation pour la
removeExtension
méthode:L'exécution de cette
removeExtension
méthode avec les tests ci-dessus donne les résultats énumérés ci-dessus.La méthode a été testée avec le code suivant. Comme cela a été exécuté sous Windows, le séparateur de chemin est un
\
qui doit être échappé avec un\
lorsqu'il est utilisé dans le cadre d'unString
littéral.Les résultats ont été:
Les résultats sont les résultats souhaités décrits dans le test que la méthode doit remplir.
la source
System.getProperty("file.separator")
et pas seulementFile.separator
?/path/to/.htaccess
BTW, dans mon cas, lorsque je voulais une solution rapide pour supprimer une extension spécifique, c'est à peu près ce que j'ai fait:
la source
la source
Est-ce une question piège? : p
Je ne peux pas penser à un guichet automatique plus rapide.
la source
Utilisez une méthode en
com.google.common.io.Files
classe si votre projet dépend déjà de la bibliothèque principale de Google. La méthode dont vous avez besoin estgetNameWithoutExtension
.la source
vous pouvez essayer cette fonction, très basique
la source
J'ai trouvé la réponse de coolbird particulièrement utile.
Mais j'ai changé les dernières déclarations de résultat en:
car je voulais que le nom complet du chemin soit renvoyé.
la source
la source
Utilisez une expression régulière. Celui-ci remplace le dernier point, et tout ce qui suit.
Vous pouvez également créer un objet Pattern si vous souhaitez précompiler le regex.
la source
la source
"\\."
en "." est spécial pour regex.créer un nouveau fichier avec le chemin de l'image de chaîne
la source
org.apache.commons.io.FilenameUtils version 2.4 donne la réponse suivante
la source
la source
Je voudrais faire comme ceci:
De la fin jusqu'au '.' puis appelez substring.
Edit: Ce n'est peut-être pas un golf mais c'est efficace :)
la source
En gardant à l'esprit les scénarios où il n'y a pas d'extension de fichier ou il y a plus d'une extension de fichier
exemple Nom de fichier: fichier | file.txt | file.tar.bz2
la source
Cela affichera un exemple pour img et imgLink
la source
la source
file.length() > 0
chèque?