====== Το interface Path ====== **Η ενότητα αυτή είναι προαιρετική και δεν απαραίτητη για την κατανόηση των ενοτήτων που ακολουθούν.** Το interface [[http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html|Path]] αποτελεί προγραμματική αναπαράσταση ενός μονοπατιού στο σύστημα αρχείων (//filesystem//). Κάθε αντικείμενο που υλοποιεί το interface //Path// λαμβάνει υπόψη του τις ιδιαιτερότητες του λειτουργικού συστήματος. Στο λειτουργικό σύστημα GNU/Linux, ένα //Path// χρησιμοποιεί τη σύνταξη (/home/Joe/foo), ενώ στο Microsoft Windows, ένα //Path// χρησιμοποιεί τη σύνταξη (C:\home\Joe\foo). Το αρχείο ή η διεύθυνση που αντιστοιχεί σε ένα αντικείμενο τύπου //Path// μπορεί να μην υπάρχει. Μπορούμε να δημιουργήσουμε ένα //Path// προκειμένου να εξάγουμε τμήματα από αυτό ή να το συγκρίνουμε με ένα άλλο //Path//. Επίσης, μπορούμε να χρησιμοποιήσουμε τις μεθόδους της κλάσης [[java:class_file|File]] για να ελέγξουμε την ύπαρξη του αρχείου ή του καταλόγου που αντιστοιχεί στο //Path//, να δημιουργήσουμε το αρχείο εάν δεν υπάρχει, να το ανοίξουμε, να το διαγράψουμε, να του αλλάξουμε τα δικαιώματά κ.α. ==== Δημιουργώντας ένα Path ==== Ένα παράδειγμα //Path// περιέχει τις πληροφορίες που χρησιμοποιούνται για τον καθορισμό της θέσης του αρχείου ή του καταλόγου. Ένα //Path// μπορεί να οριστεί ως το πλήρες path του αρχείου ή του καταλόγου ή το σχετικό path σε σχέση με το σημείο εκτέλεσης του προγράμματος στο filesystem. Μπορούμε εύκολα να δημιουργήσουμε ένα αντικείμενο //Path// χρησιμοποιώντας μία από τις ακόλουθες μεθόδους με χρήση της βοηθητικής κλάσης [[http://docs.oracle.com/javase/7/docs/api/java/nio/file/Paths.html|Paths]] (σημειώστε το πληθυντικό) : Path p1 = Paths.get("/tmp/foo"); Path p2 = Paths.get(args[0]); Path p3 = Paths.get(URI.create("file:///Users/joe/FileTest.java")); Η μέθοδος ''Paths.get("/users/sally")'' είναι συντομογραφία για τον παρακάτω κώδικα : Path p4 = FileSystems.getDefault().getPath("/users/sally"); Το ακόλουθο παράδειγμα δημιουργεί το path /logs/foo.log. Path p5 = Paths.get(System.getProperty("user.home"),"logs", "foo.log"); Εάν το home dir του χρήστη αντιστοιχεί στο ''/home/joe'' το πλήρες path θα αντιστοιχεί στο ''/home/joe/logs/foo.log'', ενώ εάν το home dir του χρήστη αντιστοιχεί στο ''c:\users\joe'' το πλήρες path θα αντιστοιχεί στο ''c:\users\joe\logs\foo.log''. ==== Ανάκτηση πληροφοριών σχετικά με ένα Path ==== Μπορείτε να σκεφτείτε το //Path// ως την αποθήκευση αυτών των στοιχείων ονομάτων σε μια ακολουθία. Το υψηλότερο στοιχείο στην δομή του καταλόγου θα βρίσκεται στη θέση 0 και το χαμηλότερο στοιχείο στην δομή διευθύνσεων θα βρίσκεται στη θέση //[n-1]// (όπου //n// είναι ο αριθμός των στοιχείων ονομάτων στο //Path//). Η κλάση //Path// παρέχει μεθόδους για την ανάκτηση μεμονωμένων στοιχείων ή τμημάτων του //Path// Τα παραδείγματα που θα χρησιμοποιήσουμε παρακάτω χρησιμοποιούν την ακόλουθη δομή διευθύνσεων. {{ :java:io-dirstructure.gif?250 |}} Το ακόλουθο απόσπασμα κώδικα ορίζει ένα παράδειγμα //Path// και στη συνέχεια, επικαλείται διάφορες μεθόδους για να λάβει πληροφορίες σχετικά με τη διαδρομή: // None of these methods requires that the file corresponding // to the Path exists. // Microsoft Windows syntax Path path = Paths.get("C:\\home\\joe\\foo"); // GNU/Linux syntax Path path = Paths.get("/home/joe/foo"); System.out.format("toString: %s%n", path.toString()); System.out.format("getFileName: %s%n", path.getFileName()); System.out.format("getName(0): %s%n", path.getName(0)); System.out.format("getNameCount: %d%n", path.getNameCount()); System.out.format("subpath(0,2): %s%n", path.subpath(0,2)); System.out.format("getParent: %s%n", path.getParent()); System.out.format("getRoot: %s%n", path.getRoot()); Έξοδος σε λειτουργικό σύστημα Microsoft Windows : C:\home\joe\foo foo home 3 home\joe \home\joe C:\ Έξοδος σε λειτουργικό σύστημα GNU/Linux : /home/joe/foo foo home 3 home/joe /home/joe / Το προηγούμενο παράδειγμα δείχνει την έξοδο για ένα απόλυτο μονοπάτι. Στο ακόλουθο παράδειγμα, καθορίζεται ένα σχετικό μονοπάτι : // GNU/Linux syntax Path path = Paths.get("sally/bar"); or // Microsoft Windows syntax Path path = Paths.get("sally\\bar"); {{ :java:path.gif?400 |}} ==== Αφαίρεση περιττών κομματιών από ένα Path ==== Παραδοσιακά τα συστήματα αρχείων χρησιμοποιούν τον συμβολισμό "." για να υποδηλώσουν την τρέχουσα διεύθυνση και τον ".." για να υποδηλώσουν τη γονική διεύθυνση. Μπορεί να έχουμε μια κατάσταση όπου ένα μονοπάτι περιέχει περιττές πληροφορίες καταλόγου. Για παράδειγμα, ένας //web server// έχει ρυθμιστεί ώστε να αποθηκεύσει τα log αρχεία του στη διεύθυνση ''/dir/logs/'' και θέλουμε να διαγράψουμε το τελικό σύμβολο ''/''. από το μονοπάτι. Τα παραδείγματα που ακολουθούν περιλαμβάνουν τα δύο παραπάνω παραδείγματα : /home/./joe/foo /home/sally/../joe/foo Η μέθοδος [[http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html#normalize()|normalize]] αφαιρεί τυχόν περιττά στοιχεία, το οποίο περιλαμβάνουν οποιεσδήποτε περιπτώσεις "." ή "directory/..". Τα δύο προηγούμενα παραδείγματα καταλήγουν στο μονοπάτι στο ''/home/Joe/foo''. Είναι σημαντικό να σημειωθεί ότι η //normalize// δεν ελέγχει στο σύστημα αρχείων για να ελέγξει εάν το μονπατι που προκύπτει από το normlization υπάρχει ή όχι. Στο παραπάνω παράδειγμα, αν το //sally// ήταν ένα //symbolic link//, αφαιρώντας το τμήμα ''sally/..'' θα μπορούσαμε να οδηγηθούμε σε ένα //Path// που δεν εντοπίζει πλέον το ζητούμενο αρχείο. Για να "καθαρίσουμε" ένα μονοπάτι, διασφαλίζοντας παράλληλα ότι το αποτέλεσμα εντοπίζει το σωστό αρχείο, μπορούμε να χρησιμοποιήσουμε τη μέθοδο //toRealPath//, η οποία περιγράφεται παρακάτω. ==== Μετατροπή ενός Path ==== Μπορούμε να χρησιμοποιήσουμε τρεις μεθόδους για να μετατρέψουμε ένα //Path//. === Η μέθοδος toUri === Αν χρειαστεί να μετατρέψουμε το μονοπάτι σε ένα string που μπορεί να ανοίξει από ένα browser, μπορούμε να χρησιμοποιήσουμε την μέθοδο //toUri//. Για παράδειγμα: Path p1 = Paths.get("/home/logfile"); // Result is file:///home/logfile System.out.format("%s%n", p1.toUri()); === Η μέθοδος toAbsolutePath === Η μέθοδος //toAbsolutePath// μετατρέπει το δοθέν μονοπάτι σε απόλυτο μονοπάτι. Αν το μονοπάτι είναι ήδη απόλυτο, επιστρέφει το ίδιο αντικείμενο. Το μονοπάτι δεν είναι απαραίτητο να υφίσταται στο σύστημα αρχείων για να λειτουργήσει η μέθοδος. Παρακάτω δίνεται ένα παράδειγμα χρήσης της μεθόδου. class FileTest { public static void main(String[] args) { if (args.length < 1) { System.out.println("usage: FileTest file"); System.exit(-1); } Path inputPath = Paths.get(args[0]); Path fullPath = inputPath.toAbsolutePath(); } } === Η μέθοδος toRealPath === Η μέθοδος //toRealPath// επιστρέφει το "πραγματικό" μονοπάτι ενός υπάρχοντος αρχείου ή καταλόγου, εκτελώντας πολλές λειτουργίες ταυτόχρονα: * Αν περνά σε αυτή τη μέθοδο η τιμή //true// και το σύστημα αρχείων υποστηρίζει symbolic links, τότε επιλύει όλα τα symbolic links στο μονοπάτι. * Αν το //Path// είναι σχετικό, επιστρέφει ένα απόλυτο //Path//. * Αν το //Path// περιλαμβάνει τυχόν περιττά στοιχεία (//loops//), επιστρέφει ένα μονοπάτι χωρίς αυτά τα στοιχεία. |Προηγούμενο: [[:java:class_file | Η κλάση File ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:file_io_intro| Ροές δεδομένων ]] |