Domanda Unire percorsi in Java


In Python Posso unire due percorsi con os.path.join:

os.path.join("foo", "bar") # => "foo/bar"

Sto cercando di ottenere lo stesso in Java, senza preoccuparmi se il OS è Unix, Solaris o 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);

}

Me lo aspettavo Path.resolve( ) si unirebbe alla mia directory corrente /home/user/test con data/foo.txt fabbricazione /home/user/test/data/foo.txt. Cosa sto sbagliando?


64
2017-12-25 02:16


origine


risposte:


Anche se la soluzione originale per ottenere la directory corrente utilizzando il empty String lavori. Ma si raccomanda di usare il user.dir proprietà per la directory corrente e user.home per la home directory.

Path currentPath = Paths.get(System.getProperty("user.dir"));
Path filePath = Paths.get(currentPath.toString(), "data", "foo.txt");
System.out.println(filePath.toString());

produzione:

/Users/user/coding/data/foo.txt

Da Java Sentiero Documentazione di classe:

Un percorso è considerato un percorso vuoto se consiste esclusivamente di un elemento nome che è empty. Accedere a un file usando un empty path is equivalent to accessing the default directory del file system.


Perché Paths.get("").toAbsolutePath() lavori

Quando una stringa vuota viene passata al Paths.get(""), il ritorno Path l'oggetto contiene un percorso vuoto. Ma quando chiamiamo Path.toAbsolutePath(), controlla se la lunghezza del percorso è maggiore di zero, altrimenti utilizza user.dir proprietà di sistema e restituisce il percorso corrente.

Ecco il codice per l'implementazione del file system Unix: UnixPath.toAbsolutePath ()


Fondamentalmente è necessario creare il Path istanza di nuovo dopo aver risolto il percorso della directory corrente.

Anche io suggerirei di usare File.separatorChar per codice indipendente dalla piattaforma.

Path currentRelativePath = Paths.get("");
Path currentDir = currentRelativePath.toAbsolutePath(); // <-- Get the Path and use resolve on it.
String filename = "data" + File.separatorChar + "foo.txt";
Path filepath = currentDir.resolve(filename);

// "data/foo.txt"
System.out.println(filepath);

Produzione:

/Users/user/coding/data/foo.txt

54
2017-12-25 02:25



Paths#get(String first, String... more) stati,

Converte una stringa di percorso o a sequenza di stringhe che quando uniti formano una stringa di percorso, a a Path.

...

UN Path che rappresenta un vuoto il percorso viene restituito se prima è vuoto   stringa e altro non contengono stringhe non vuote.

Per ottenere la directory utente corrente puoi semplicemente usarla System.getProperty("user.dir").

Path path = Paths.get(System.getProperty("user.dir"), "abc.txt");
System.out.println(path);

Inoltre, get usi del metodo argomento a lunghezza variabile di String, che verrà utilizzato per fornire stringhe di percorso successive. Quindi, per creare Path per /test/inside/abc.txt devi usarlo in un modo seguente,

Path path = Paths.get("/test", "inside", "abc.txt");

14
2017-12-25 02:34



Non un metodo specifico.

Se usi java 8 o superiore, hai 2 opzioni:

a) Utilizzare java.util.StringJoiner

StringJoiner joiner = new StringJoiner(File.pathSeparator); //Separator
joiner.add("path1").add("path2");
String joinedString = joiner.toString();

b) Usa String.join(File.pathSeparator, "path1", "path2");

Se usi java 7 o inferiore, puoi usare la libreria commons-lang da commons apache. La classe StringUtils ha un metodo per unire le stringhe usando un separatore.

c) StringUtils.join(new Object[] {"path1", "path2"}, File.pathSeparator);

A sidenote: puoi usare linux pathseparator "/" per windows (ricorda che i percorsi assoluti sono qualcosa come "/ C: / mydir1 / mydir2". Usare sempre "/" è molto utile se usi protocolli come file: //


7
2017-12-25 02:34



Il modo più semplice è:

Path filepath = Paths.get("foo", "bar");

Non dovresti mai scrivere Paths.get(""). Sono sorpreso che funzioni affatto. Se si desidera fare riferimento alla directory corrente in modo esplicito, utilizzare Paths.get(System.getProperty("user.dir")). Se si desidera la directory home dell'utente, utilizzare Paths.get(System.getProperty("user.home")).

Puoi anche combinare gli approcci:

Path filepath = Paths.get(
    System.getProperty("user.home"), "data", "foo.txt");

5
2017-12-25 22:10



Il modo più affidabile e indipendente dalla piattaforma per unire i percorsi in Java è l'utilizzo Path::resolve (come indicato nel JavaDoc per Paths::get). Per una serie arbitraria di stringhe che rappresentano parti di un percorso, queste possono essere unite usando un flusso Java:

private static final String[] pieces = {
    System.getProperty("user.dir"),
    "data",
    "foo.txt"};
public static void main (String[] args) {
    Path dest = Arrays.stream(pieces).reduce(
    /* identity    */ Paths.get(""),
    /* accumulator */ Path::resolve,
    /* combiner    */ Path::resolve);
    System.out.println(dest);
}

1
2017-11-01 06:05