Dans Python
je peux joindre deux chemins avec os.path.join
:
os.path.join("foo", "bar") # => "foo/bar"
J'essaye d'obtenir la même chose en Java, sans me soucier si OS
c'est Unix
, Solaris
ou Windows
:
public static void main(String[] args) {
Path currentRelativePath = Paths.get("");
String current_dir = currentRelativePath.toAbsolutePath().toString();
String filename = "data/foo.txt";
Path filepath = currentRelativePath.resolve(filename);
// "data/foo.txt"
System.out.println(filepath);
}
Je m'attendais à ce que Path.resolve( )
cela rejoigne mon répertoire actuel /home/user/test
avec data/foo.txt
making /home/user/test/data/foo.txt
. Qu'est-ce que je me trompe?
filepath.toString()
new File(parent, child)
Réponses:
Même si la solution originale pour obtenir le répertoire actuel en utilisant les
empty String
œuvres. Mais il est recommandé d'utiliser lauser.dir
propriété pour le répertoire courant etuser.home
pour le répertoire personnel.production:
À partir de la documentation de la classe Java Path :
Pourquoi ça
Paths.get("").toAbsolutePath()
marcheLorsqu'une chaîne vide est transmise à
Paths.get("")
, l'Path
objet renvoyé contient un chemin vide. Mais lorsque nous appelonsPath.toAbsolutePath()
, il vérifie si la longueur du chemin est supérieure à zéro, sinon il utilise lauser.dir
propriété système et renvoie le chemin actuel.Voici le code pour l'implémentation du système de fichiers Unix: UnixPath.toAbsolutePath ()
En gros, vous devez créer à
Path
nouveau l' instance une fois que vous avez résolu le chemin du répertoire actuel.Je suggérerais également d'utiliser
File.separatorChar
pour le code indépendant de la plate-forme.Production:
la source
separatorChar
est inférieur à une "abstraction de niveau supérieur", quelque chose qui ressemble àPathBuilder(currentRelativePath).append("data").append("foo.txt")
Paths#get(String first, String... more)
États,Pour obtenir le répertoire actuel des utilisateurs, vous pouvez simplement utiliser
System.getProperty("user.dir")
.De plus, la
get
méthode utilise l' argument de longueur variable deString
, qui sera utilisé pour fournir les chaînes de chemin suivantes. Donc, pour créerPath
pour/test/inside/abc.txt
vous devez l'utiliser de la manière suivante,la source
Pas une méthode spécifique.
Si vous utilisez java 8 ou supérieur, vous avez 2 options:
a) Utilisez java.util.StringJoiner
b) Utilisation
String.join(File.pathSeparator, "path1", "path2");
Si vous utilisez java 7 ou une version antérieure, vous pouvez utiliser la bibliothèque commons-lang d'apache commons. La classe StringUtils a une méthode pour joindre des chaînes à l'aide d'un séparateur.
c)
StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);
Remarque: vous pouvez utiliser le séparateur de chemin linux "/" pour Windows (rappelez-vous simplement que les chemins absolus sont quelque chose comme "/ C: / mydir1 / mydir2". Utiliser always "/" est très utile si vous utilisez des protocoles tels que file: //
la source
/home/user/test:foo.txt
File.separator
a travaillé pour moi au lieu deFile.pathSeparator
Le moyen le plus simple est:
Vous ne devriez jamais écrire
Paths.get("")
. Je suis surpris que cela fonctionne du tout. Si vous souhaitez faire référence explicitement au répertoire actuel, utilisezPaths.get(System.getProperty("user.dir"))
. Si vous voulez le répertoire personnel de l'utilisateur, utilisezPaths.get(System.getProperty("user.home"))
.Vous pouvez également combiner les approches:
la source
Le moyen le plus fiable et indépendant de la plate-forme de joindre des chemins en Java consiste à utiliser
Path::resolve
(comme indiqué dans JavaDoc pourPaths::get
). Pour un tableau de longueur arbitraire de chaînes représentant des morceaux d'un chemin, celles-ci peuvent être jointes à l'aide d'un flux Java:la source
Tu peux faire comme
Un bon article détaillé est ici Path Sample Usecase
la source