2015-01-20 13 views
5

Eines der wirklich netten Dinge über java.io.File ist, dass es Pfade zu einem vorhersagbaren Format normalisieren kann.Java: Wie normalisiert man Pfade mit nio Path?

new File("/", inputPath).getPath() gibt immer eine Zeichenfolge mit relativen Pfaden normalisiert aus und immer mit vorhersagbaren Pfadtrennzeichen beginnt und endet.

Gibt es eine Möglichkeit, dies mit den neuen Klassen Path oder Paths zu tun?

(Beachten Sie auch, dass ich mit abstrakten Wegen für andere Systeme zu tun habe, das hat nichts mit einem lokalen Dateisystem zu tun)

Weitere Beispiele für Verhalten mag ich:

- "/foo" -> "/foo" 
- "//foo/" -> "/foo" 
- "foo/" -> "/foo" 
- "foo/bar" -> "/foo/bar" 
- "foo/bar/../baz" -> "/foo/baz" 
- "foo//bar" -> "/foo/bar" 
+0

Die Gründe möchte ich die nio-API verwenden sind nette Zusätze wie Paths.get() (die sich sauberer anfühlt als neue File()) und Path-Pfad(). Ich versuche nur, diese mit der bestehenden Einfachheit der Normalisierung zu mischen, die wir mit neuer Datei ("/", Eingabe) bekommen. – TREE

+0

Und ich kann auch als Kommentar zum Universum hinzufügen, dass es sehr verwirrend ist, dass java.io.FileSystem und java.nio.file.FileSystem beide existieren. – TREE

+0

Siehe Bearbeiten meiner Antwort (und ich weiß nicht, wo Sie 'java.io.FileSystem' überhaupt gesehen haben) – fge

Antwort

6

Dieser Code funktioniert:

public final class Foo 
{ 
    private static final List<String> INPUTS = Arrays.asList(
     "/foo", "//foo", "foo/", "foo/bar", "foo/bar/../baz", "foo//bar" 
    ); 

    public static void main(final String... args) 
    { 
     Path path; 

     for (final String input: INPUTS) { 
      path = Paths.get("/", input).normalize(); 
      System.out.printf("%s -> %s\n", input, path); 
     } 
    } 
} 

Ausgang:

/foo -> /foo 
//foo -> /foo 
foo/ -> /foo 
foo/bar -> /foo/bar 
foo/bar/../baz -> /foo/baz 
foo//bar -> /foo/bar 

HINWEIS jedoch, dass dies NICHT tragbar ist. Es wird nicht auf Windows-Rechnern arbeiten ...

Wenn Sie eine tragbare Lösung möchten Sie memoryfilesystem, öffnen Sie ein Unix-Dateisystem verwenden können, und verwenden Sie diese:

try (
    final FileSystem fs = MemoryFileSystem.newLinux().build(); 
) { 
    // path operations here 
} 
+0

toAbsolutePath() scheint zu Setze das Arbeitsverzeichnis des Java-Prozesses auf alles, was nicht mit einem Pfadtrennzeichen beginnt (was ich nicht suche ... Ich beschäftige mich überhaupt nicht mit dem lokalen Dateisystem). toRealPath() versucht tatsächlich, den Pfad auf dem lokalen Dateisystem zu finden. – TREE

+0

Wenn Sie nicht mit dem lokalen Dateisystem arbeiten, bedeutet das, dass Sie 'Paths.get()' nicht verwenden, um Ihre Pfade abzurufen, richtig? – fge

+0

OK, ich bin mir nicht sicher, was Sie tun wollen, aber versuchen Sie einfach das Ergebnis von 'Paths.get ("/"," yourpathhere ")' 'zu normalisieren. Das sollte es tun. – fge