Comment combiner des tracés en Java?
Est-il un Java équivalent pour System.IO.Chemin d'accès.Combiner()
en C#/.NET? Ou tout autre code pour accomplir cette?
Cette méthode statique combine une ou plusieurs chaînes dans un chemin.
- This DONC, la question pourrait aider.
Vous devez vous connecter pour publier un commentaire.
Plutôt que de garder tout basée sur une chaîne, vous devez utiliser une classe qui est conçu pour représenter un chemin du système de fichiers.
Si vous êtes à l'aide de Java 7 ou Java 8, vous devriez sérieusement envisager de l'utiliser
java.nio.fichier.Path
;Path.resolve
peut être utilisé pour combiner un chemin avec un autre, ou avec une chaîne. LeChemins
de la classe helper est utile aussi. Par exemple:Si vous avez besoin pour répondre à la pré-Java-7 environnements, vous pouvez utiliser
java.io.Fichier
, comme ceci:Si vous voulez à nouveau comme une chaîne de caractères plus tard, vous pouvez appeler
getPath()
. En effet, si vous avez vraiment voulu imiterPath.Combine
, vous pouvez simplement écrire quelque chose comme:path2
(en ignorantpath1
) sipath2
est un chemin d'accès absolu. La version de Java vais laisser tomber le leader/
ou\
et de le traiter comme un chemin d'accès relatif.File f2 = new File(path2); if (f2.isAbsolute()) return f2;
quelque part dans votre fonction.new File(String... pathElements)
serait plus propre, possible avec unnew File(File basepath, String... pathElements)
File.getCanonicalPath
.File
en C# si vous le souhaitiez. (Je suppose que vous voulez dire que l'existence deFile
est un avantage qui je serais d'accord avec vous.)Path.Combine
fonctionne très bien pour la plupart des cas, et vous avez toujours laUri
classe.Path
objets qu'avecFile
... mais dans .NET, il y a toujoursFileInfo
etDirectoryInfo
si vous le souhaitez. Peu importe, ce n'est pas une question pour C#, étant donné que c'est seulement une langue,...Dans Java 7, vous devez utiliser
résoudre
:Tandis que le NIO2 Chemin de classe peut sembler un peu redondant avec le Fichier inutilement différentes API, il est en fait plus subtilement élégant et robuste.
Noter que
Paths.get()
(comme suggéré par quelqu'un d'autre) n'a pas une surcharge de prendre unPath
, et de fairePaths.get(path.toString(), childPath)
n'est PAS la même chose queresolve()
. À partir de laChemins.get()
docs:La sœur de la fonction de
resolve
est l'excellentrelativiser
:La principale réponse est d'utiliser les objets de Fichier. Cependant Commons IO dispose d'une classe FilenameUtils qui peut faire ce genre de chose, comme le concat() méthode.
Je sais que c'est un long temps depuis que Jon origine de réponse, mais j'ai eu une semblable exigence de l'OP.
Par le biais de l'extension de Jon solution je suis venu avec la suivante, qui va en prendre un ou plusieurs segments de tracé prend autant de segments de tracé que vous pouvez jeter à elle.
Utilisation
Code ici pour les autres avec un problème similaire
indépendant de la plateforme approche (utilise le Fichier.séparateur, ie les travaux dépend de système d'exploitation, là où le code est en cours d'exécution:
Pour améliorer JodaStephen réponse, Apache Commons IO a FilenameUtils qui le fait. Exemple (sur Linux):
Il est indépendant de la plateforme et de produire ce séparateurs de votre système a besoin.
Si vous n'avez pas besoin de plus que des chaînes de caractères, vous pouvez utiliser com.google.commun.io.Fichiers
pour obtenir
Voici une solution qui gère les chemins multiples de pièces et de conditions de bords:
La fin de la partie, peut-être, mais je voulais partager mon point de vue sur ce. Je suis à l'aide d'un Générateur de modèle et de permettre idéalement enchaîné
append
appels. Il peut facilement être étendu pour prendre en charge le travail avecPath
objets.Exemple d'utilisation:
L'résultant
absolute
contiendra quelque chose comme:ou peut-être même:
Cela fonctionne aussi dans Java 8 :
Cette solution offre une interface pour rejoindre le chemin des fragments d'un String[] tableau. Il utilise java.io.Fichier.Fichier(Chaîne de parent, String enfant):
Alors vous pouvez simplement faire:
Retourne: