2017-03-04 1 views
0

Ich habe Probleme, die java.nio.file.Path.relativize() Methode zu verstehen. Ich bin mir auch bewusst, dass eine ähnliche question gefragt wurde, aber die Antwort hat mir nicht geholfen, das Konzept zu verstehen.NIO.2: Verständnis der Relativize() - Methode

In Anbetracht der folgende Code-Schnipsel:

Path path = Paths.get("/Users/somename/documents/Test/cat.html"); 
Path path2 = Paths.get("/documents/Test/cat.html"); 
System.out.println((path.relativize(path2))); //output: ../../../../../documents/Test/cat.html 

Kann mir jemand erklären, einen Schritt-für-Schritt-Ansatz, wie die relativize() Methode in diesem Beispiel funktioniert? Warum muss ich 5 Verzeichnisse hochgehen?

+0

Was ist Ihr derzeitiges Verständnis davon, was die Methode bewirken soll? –

Antwort

2

Ich werde am Ende meiner Antwort auf Ihr Beispiel zurückkommen.

Der Zweck von relativize() ist unabhängig von der zugrunde liegenden Dateisystemstruktur, wenn es um die Adressierung/den Zugriff auf Dateien und Ordner geht. Sie müssen nicht wissen, in welchem ​​übergeordneten Ordner/Pfad sich Ihr App-Ordner befindet. Sie müssen nur Ihre App-bezogene Dateistruktur kennen und können relativize() verwenden, um auf die benötigten Dateien zuzugreifen, die in völlig anderen Ordnern abgelegt werden können.

Hier ist ein Beispiel:

Angenommen, Sie haben eine App erstellt haben. Ihre einfache Ordnerstruktur ist

/myApp/app/app.java 
/myApp/img/picture1.img 
/myApp/sounds/ringtones/bell.mp3 

Starten der App Ihre Arbeitspfad ist

<parent path>/myApp/app/ 

Wenn Sie picture1.img jetzt zugreifen möchten, müssen Sie nicht wissen, was seine wirklichen Weg (von der Wurzel nach unten zu seinem eigentlichen Ordner) ist. Verwenden Sie einfach den relativen Pfad relativize() bietet. Es geht so:

Path path = Paths.get("/myApp/app/app.java"); 
Path path2 = Paths.get("/myApp/img/picture1.img"); 
System.out.println((path.relativize(path2))); 

was dazu führt,

../../img/picture1.img 

Dies ist der „relative Pfad“ aus der Datei app.java zu Ihrer Datei picture1.img.

Das erste Pfad Symbol für die Datei steht app.java selbst

Die zweiten für seinen übergeordneten Ordner ist /app

Sie befinden sich nun im Ordner

/myApp 

von wo Sie wieder die Leiter nach dem p gehen ath

/img/picture1.img 

Sie können die Datei erhalten die relativen Pfad oben gezeigt, und Sie müssen über ihre realpath nicht kümmern(), die zum Beispiel sein könnte:

/Users/me/apps/myApp/img/picture1.img 

Es ist einfach doesn‘ Es stört Sie nicht, wo sich Ihr App-Ordner befindet, solange Sie Ihre eigene Ordnerstruktur kennen und auf Ihre Dateien mit relativen Pfaden zugreifen.

zu Ihrem Beispiel Nun zurück

Relativieren() weiß nicht, dass aus Ihrer Sicht

<parent folder>/documents/Test/cat.html 

sollten die gleichen wie

/Users/somename/documents/Test/cat.html 

sein für relativize() es sieht so aus

/root/Users/somename/documents/Test/cat.html 
/root/documents/Test/cat.html 

also von der oberen cat.html beginnen Sie gehen

1) cat.html = ../

2) Test = ../../

3) Dokumente = ../../../

4) somename = ../../../../

5) Users = ../../../../. ./

Jetzt haben Sie erreicht d root und jetzt gehst du die Leiter entlang und folgst dem zweiten Pfad.

So ist der Ausgang

../../../../../documents/Test/cat.html

ist völlig korrekt aus Relativieren() 's Punkt Aussicht.

Hat diese Erklärung Ihnen geholfen, die Funktion von relativize() besser zu verstehen?

+0

Diese Erklärung war genau das, wonach ich suchte. Ich verstehe es jetzt vollständig, danke. – Helenesh

+0

Gern geschehen. :-) – DiabolicWords