User Tools

Site Tools


java:class_path

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:class_path [2015/03/04 19:42] – [Δημιουργώντας ένα Path] gthanosjava:class_path [2020/03/09 07:19] (current) – [Μετατροπή ενός Path] gthanos
Line 1: Line 1:
-====== Η κλάση Path ======+====== Το interface Path ======
  
-Η κλάση //Path//, η οποία εισήχθη στην έκδοση SE 7 της Java , είναι ένα από τα κύρια σημεία του //java.nio.file// πακέτου. Για όσους χρησιμοποιούν I / O αρχείου , είναι χρήσιμο να ξέρουν τα ισχυρά χαρακτηριστικά αυτής της κλάσης.+<WRAP important 70% round> 
 +**Η ενότητα αυτή είναι προαιρετική και δεν απαραίτητη για την κατανόηση των ενοτήτων που ακολουθούν.** 
 +</WRAP>
  
-Σημείωση Αν έχετε  pre-JDK7 κώδικα που χρησιμοποιεί //java.io.File//, μπορείτε να επωφεληθείτε από τη λειτουργικότητα της κλάσης //Path// χρησιμοποιώντας τη μέθοδο //File.toPath//+Το interface [[http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html|Path]] αποτελεί προγραμματική αναπαράσταση ενός μονοπατιού στο σύστημα αρχείων (//filesystem//). 
  
-Όπως υποδηλώνει το όνομά της, η κλάση //Path// είναι μια προγραμματική αναπαράσταση ενός μονοπατιού στο σύστημα αρχείωνΈνα //Path// αντικείμενο περιέχει το όνομα του αρχείου και της λίστας διευθύνσεων που χρησιμοποιήθηκαν για την κατασκευή του μονοπατιούκαι χρησιμοποιείται για να εξετάσει, εντοπίσετε και χειριστείτε τα αρχεία.+Κάθε αντικείμενο που υλοποιεί το interface //Path// λαμβάνει υπόψη του τις ιδιαιτερότητες του λειτουργικού συστήματοςΣτο λειτουργικό σύστημα GNU/Linux, ένα //Path// χρησιμοποιεί τη σύνταξη (/home/Joe/foo), ενώ στο Microsoft Windowsένα //Path// χρησιμοποιεί τη σύνταξη (C:\home\Joe\foo)
  
-Ένα παράδειγμα //Path// αντανακλά την υποκείμενη πλατφόρμα. Στο λειτουργικό σύστημα Solaris, ένα //Path// χρησιμοποιεί τη σύνταξη του Solaris (/ home / Joe / foo) και στο Microsoft Windows, ένα //Path// χρησιμοποιεί τη σύνταξη των Windows (C: \ home \ Joe \ foo). Ένα //Path// δεν είναι ανεξάρτητο από το σύστημα. Δεν μπορούμε να συγκρίνουμε ένα //Path// από το σύστημα αρχείων Solaris και να περιμένουμε να ταιριάξει με ένα //Path// από ένα σύστημα αρχείων των Windows, ακόμη και αν η δομή της διεύθυνσης είναι η ίδια και οι δύο παρουσίες εντοπίζουν το ίδιο σχετικό αρχείο. +Το αρχείο ή η διεύθυνση που αντιστοιχεί σε ένα αντικείμενο τύπου //Path// μπορεί να μην υπάρχει. Μπορούμε να δημιουργήσουμε ένα //Path// προκειμένου να εξάγουμε τμήματα από αυτό ή να το συγκρίνουμε με ένα άλλο //Path//. Επίσης, μπορούμε να χρησιμοποιήσουμε τις μεθόδους της κλάσης [[java:class_file|File]] για να ελέγξουμε την ύπαρξη του αρχείου ή του καταλόγου που αντιστοιχεί στο //Path//, να δημιουργήσουμε το αρχείο εάν δεν υπάρχει, να το ανοίξουμε, να το διαγράψουμε, να του αλλάξουμε τα δικαιώματά κ.α.
- +
-Το αρχείο ή η διεύθυνση που αντιστοιχεί στο //Path// μπορεί να μην υπάρχει. Μπορούμε να δημιουργήσουμε ένα παράδειγμα //Path// και να το χειριστούμε με διάφορους τρόπους: μπορούμε να προσθέσουμε σε αυτό, να εξαγάγετε κομμάτια από αυτό ή ακόμα και να το συγκρίνουμε με ένα άλλο //Path//. Επίσης, μπορούμε να χρησιμοποιήσουμε τις μεθόδους της κλάσης //Files// για να ελέγχει την ύπαρξη του αρχείου που αντιστοιχεί στο //Path//, να δημιουργήσουμε το αρχείο, νατο ανοίξουμε, να το διαγράψουμε, να του αλλάξουμε τα δικαιώματά του, και ούτω καθεξής. +
- +
-==== Λειτουργίες της Path ==== +
- +
-Η κλάση //Path// περιλαμβάνει διάφορες μεθόδους που μπορούν να χρησιμοποιηθούν για να αποκτήσουν πληροφορίες σχετικά με το μονοπάτι, αποκτήσουν πρόσβαση σε στοιχεία του μονοπατιού, μετατρέψουν το μονοπάτι σε άλλες μορφές, ή να εξάγουν τμήματα ενός μονοπατιού.  +
-Υπάρχουν επίσης μέθοδοι για το ταίριασμα της συμβολοσειράς του μονοπατιού  και μέθοδοι για την αφαίρεση κομματιών από ένα μονοπάτι. Εδώ θα εξετάσουμε αυτές τις μεθόδους της Path, που μερικές φορές ονομάζονται syntactic λειτουργίες, επειδή λειτουργούν στο ίδιο το μονοπάτι και δεν έχουν πρόσβαση στο σύστημα αρχείων.+
  
 ==== Δημιουργώντας ένα Path ==== ==== Δημιουργώντας ένα Path ====
  
-Ένα παράδειγμα //Path// περιέχει τις πληροφορίες που χρησιμοποιούνται για τον καθορισμό της θέσης του αρχείου ή διεύθυνσηςΑφού οριστεί, ένα //Path// είναι εφοδιασμένο με μία σειρά από ένα ή περισσότερα ονόματα. Ένα στοιχείο ρίζα ή ένα όνομα αρχείου μπορεί να περιλαμβάνεται, αλλά δεν είναι απαραίτητο. Ένα //Path// μπορεί να αποτελείται από ένα μόνο όνομα διεύθυνσης ή αρχείου.+Ένα παράδειγμα //Path// περιέχει τις πληροφορίες που χρησιμοποιούνται για τον καθορισμό της θέσης του αρχείου ή του καταλόγου. Ένα //Path// μπορεί να οριστεί ως το πλήρες path του αρχείου ή του καταλόγου ή το σχετικό path σε σχέση με το σημείο εκτέλεσης του προγράμματος στο filesystem 
  
-Μπορούμε εύκολα να δημιουργήσουμε ένα αντικείμενο //Path// χρησιμοποιώντας μία από τις ακόλουθες μεθόδους από βοηθητική κλάση //Paths// (σημειώστε το πληθυντικό) :+Μπορούμε εύκολα να δημιουργήσουμε ένα αντικείμενο //Path// χρησιμοποιώντας μία από τις ακόλουθες μεθόδους με χρήση της βοηθητικής κλάσης [[http://docs.oracle.com/javase/7/docs/api/java/nio/file/Paths.html|Paths]] (σημειώστε το πληθυντικό) :
  
 <code java> <code java>
Line 28: Line 23:
 </code> </code>
  
-Η μέθοδος Paths.get είναι συντομογραφία για τον παρακατω κώδικα :+Η μέθοδος ''Paths.get("/users/sally")'' είναι συντομογραφία για τον παρακάτω κώδικα :
  
 <code java> <code java>
Line 34: Line 29:
 </code> </code>
  
-Το ακόλουθο παράδειγμα δημιουργεί το /u/joe/logs/foo.log υποθέτοντας ότι το η home διεύθυνση είναι η /u/joe/logs/foo.log αν είμαστε σε Windows.+Το ακόλουθο παράδειγμα δημιουργεί το path <home directory>/logs/foo.log. 
  
 <code java> <code java>
 Path p5 = Paths.get(System.getProperty("user.home"),"logs", "foo.log"); Path p5 = Paths.get(System.getProperty("user.home"),"logs", "foo.log");
 </code> </code>
 +
 +Εάν το home dir του χρήστη αντιστοιχεί στο ''/home/joe'' το πλήρες path θα αντιστοιχεί στο ''/home/joe/logs/foo.log'', ενώ εάν το home dir του χρήστη αντιστοιχεί στο ''c:\users\joe'' το πλήρες path θα αντιστοιχεί στο ''c:\users\joe\logs\foo.log''.
  
 ==== Ανάκτηση πληροφοριών σχετικά με ένα Path ==== ==== Ανάκτηση πληροφοριών σχετικά με ένα Path ====
  
-Μπορείτε να σκεφτείτε το //Path// ως την αποθήκευση αυτών των στοιχείων ονομάτων σαν μια ακολουθία. Το υψηλότερο στοιχείο στην δομή του καταλόγου θα βρίσκεται στο ευρετήριο 0. Η χαμηλότερη στοιχείο στην δομή διευθύνσεων θα βρίσκεται στο ευρετήριο //[n-1]//όπου //n// είναι ο αριθμός των στοιχείων ονομάτων στο //Path//Μέθοδοι είναι διαθέσιμες για την ανάκτηση μεμονωμένων στοιχείων ή κομματιών του //Path// χρησιμοποιώντας αυτά τα ευρετήρια.+Μπορείτε να σκεφτείτε το //Path// ως την αποθήκευση αυτών των στοιχείων ονομάτων σε μια ακολουθία. Το υψηλότερο στοιχείο στην δομή του καταλόγου θα βρίσκεται στη θέση 0 και το χαμηλότερο στοιχείο στην δομή διευθύνσεων θα βρίσκεται στη θέση //[n-1]// (όπου //n// είναι ο αριθμός των στοιχείων ονομάτων στο //Path//)Η κλάση //Path// παρέχει μεθόδους για την ανάκτηση μεμονωμένων στοιχείων ή τμημάτων του //Path//
  
 Τα παραδείγματα που θα χρησιμοποιήσουμε παρακάτω χρησιμοποιούν την ακόλουθη δομή διευθύνσεων. Τα παραδείγματα που θα χρησιμοποιήσουμε παρακάτω χρησιμοποιούν την ακόλουθη δομή διευθύνσεων.
Line 56: Line 53:
 Path path = Paths.get("C:\\home\\joe\\foo"); Path path = Paths.get("C:\\home\\joe\\foo");
  
-// Solaris syntax+// GNU/Linux syntax
 Path path = Paths.get("/home/joe/foo"); Path path = Paths.get("/home/joe/foo");
  
Line 80: Line 77:
 </code> </code>
  
-Έξοδος σε λειτουργικό σύστημα Solaris OS :+Έξοδος σε λειτουργικό σύστημα GNU/Linux :
  
 <code java> <code java>
Line 95: Line 92:
  
 <code java> <code java>
-// Solaris syntax+// GNU/Linux syntax
 Path path = Paths.get("sally/bar"); Path path = Paths.get("sally/bar");
 </code> </code>
Line 108: Line 105:
 ==== Αφαίρεση περιττών κομματιών από ένα Path ==== ==== Αφαίρεση περιττών κομματιών από ένα Path ====
  
-Πολλά συστήματα αρχείων χρησιμοποιούν τον συμβολισμό "." για να υποδηλώσουν την τρέχουσα διεύθυνση και τον ".." για να υποδηλώσουν τη γονική διεύθυνση. Μπορεί να έχουμε μια κατάσταση όπου ένα μονοπάτι περιέχει περιττές πληροφορίες καταλόγου. Ίσως ένας server έχει ρυθμιστεί ώστε να αποθηκεύσει τα log αρχεία του στην "/ dir / logs /"διεύθυνσηκαι θέλουμε να διαγράψουμε το τελικό σύμβολο "/". από το μονοπάτι.+Παραδοσιακά τα συστήματα αρχείων χρησιμοποιούν τον συμβολισμό "." για να υποδηλώσουν την τρέχουσα διεύθυνση και τον ".." για να υποδηλώσουν τη γονική διεύθυνση. Μπορεί να έχουμε μια κατάσταση όπου ένα μονοπάτι περιέχει περιττές πληροφορίες καταλόγου. Για παράδειγμα, ένας //web server// έχει ρυθμιστεί ώστε να αποθηκεύσει τα log αρχεία του στη διεύθυνση ''/dir/logs/'' και θέλουμε να διαγράψουμε το τελικό σύμβολο ''/''. από το μονοπάτι.
  
-Τα παραδείγματα που ακολουθούν περιλαμβάνουν και τα δύο περιττά κομμάτια :+Τα παραδείγματα που ακολουθούν περιλαμβάνουν τα δύο παραπάνω παραδείγματα :
  
 <code java> <code java>
Line 117: Line 114:
 </code> </code>
  
-Η μέθοδος //normalize// αφαιρεί τυχόν περιττά στοιχεία, το οποίο περιλαμβάνουν οποιεσδήποτε περιπτώσεις "." ή "directory/.."Και τα δύο προηγούμενα παραδείγματα ομαλοποίηση στο / home / Joe / foo.+Η μέθοδος [[http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html#normalize()|normalize]] αφαιρεί τυχόν περιττά στοιχεία, το οποίο περιλαμβάνουν οποιεσδήποτε περιπτώσεις "." ή "directory/.."Τα δύο προηγούμενα παραδείγματα καταλήγουν στο μονοπάτι στο ''/home/Joe/foo''.
  
-Είναι σημαντικό να σημειωθεί ότι η //normalize// δεν ελέγχει στο σύστημα αρχείων, όταν αθαρίζειτο μονοπάτι. Πρόκειται για μία εντελώς συντακτική λειτουργία. Στο δεύτερο παράδειγμα, αν το //sally// ήταν ένα symbolic link, αφαιρώντας το sally/.. θα μπορούσε να οδηγήσει σε ένα //Path// που δεν εντοπίζει πια το ζητούμενο αρχείο.+<WRAP tip 80% center round> 
 +Είναι σημαντικό να σημειωθεί ότι η //normalize// δεν ελέγχει στο σύστημα αρχείων για να ελέγξει εάν το μονπατι που προκύπτει από το normlization υπάρχει ή όχι. Στο παραπάνω παράδειγμα, αν το //sally// ήταν ένα //symbolic link//, αφαιρώντας το τμήμα ''sally/..'' θα μπορούσαμε να οδηγηθούμε σε ένα //Path// που δεν εντοπίζει πλέον το ζητούμενο αρχείο. 
 +</WRAP>
  
-Για να "καθαρίσουμε" ένα μονοπάτι, διασφαλίζοντας παράλληλα ότι το αποτέλεσμα εντοπίζει το σωστό αρχείο, μπορούμε να χρησιμοποιήσουμε τη μέθοδο //toRealPath//. Αυτή η μέθοδος περιγράφεται στην παρακάτω.+Για να "καθαρίσουμε" ένα μονοπάτι, διασφαλίζοντας παράλληλα ότι το αποτέλεσμα εντοπίζει το σωστό αρχείο, μπορούμε να χρησιμοποιήσουμε τη μέθοδο //toRealPath//η οποία περιγράφεται παρακάτω.
  
 ==== Μετατροπή ενός Path ==== ==== Μετατροπή ενός Path ====
  
-Μπορούμε να χρησιμοποιήσουμε τρεις μεθόδους για να μετατρέψουμε ένα //Path//. Αν χρειαστεί να μετατρέψουμε το μονοπάτι σε ένα string που μπορεί να ανοίξει από ένα browser, μπορούμε να χρησιμοποιήσουμε την μέθοδο //toUri//+Μπορούμε να χρησιμοποιήσουμε τρεις μεθόδους για να μετατρέψουμε ένα //Path// 
 + 
 +=== Η μέθοδος toUri === 
 + 
 +Αν χρειαστεί να μετατρέψουμε το μονοπάτι σε ένα string που μπορεί να ανοίξει από ένα browser, μπορούμε να χρησιμοποιήσουμε την μέθοδο //toUri//
 Για παράδειγμα: Για παράδειγμα:
  
Line 134: Line 137:
 </code> </code>
  
-Η μέθοδος //toAbsolutePath// μετατρέπει ένα μονοπάτι σε ένα απόλυτο μονοπάτι. Αν το μονοπάτι είναι ήδη απόλυτο, επιστρέφει το ίδιο αντικείμενο Path. Η μέθοδος //toAbsolutePath// μπορεί να είναι πολύ χρήσιμη κατά την επεξεργασία ονομάτων αρχείων εισαγόμενα από τον χρήστη . Για παράδειγμα:+=== Η μέθοδος toAbsolutePath ===
  
-<code java> +Η μέθοδος //toAbsolutePath// μετατρέπει το δοθέν μονοπάτι σε απόλυτο μονοπάτι. Αν το μονοπάτι είναι ήδη απόλυτο, επιστρέφει το ίδιο αντικείμενο. Το μονοπάτι δεν είναι απαραίτητο να υφίσταται στο σύστημα αρχείων για να λειτουργήσει η μέθοδος. Παρακάτω δίνεται ένα παράδειγμα χρήσης της μεθόδου.
-ass FileTest { +
-    public static void main(String[] args) {+
  
-        if (args.length < 1) { +<code java FileTest.java> 
-            System.out.println("usage: FileTest file"); +class FileTest { 
-            System.exit(-1)+  public static void main(String[] args{
-        }+
  
-        // Converts the input string to a Path object. +    if (args.length < 1{ 
-        Path inputPath = Paths.get(args[0]); +      System.out.println("usage: FileTest file"); 
- +      System.exit(-1);
-        // Converts the input Path +
-        // to an absolute path. +
-        // Generally, this means prepending +
-        // the current working +
-        // directory If this example +
-        // were called like this: +
-        //     java FileTest foo +
-        // the getRoot and getParent methods +
-        // would return null +
-        // on the original "inputPath" +
-        // instance.  Invoking getRoot and +
-        // getParent on the "fullPath" +
-        // instance returns expected values. +
-        Path fullPath = inputPath.toAbsolutePath();+
     }     }
 +    Path inputPath = Paths.get(args[0]);
 +    Path fullPath = inputPath.toAbsolutePath();
 +  }
 } }
 </code> </code>
  
-Η μέθοδος //toAbsolutePath// μετατρέπει την είσοδο του χρήστη και επιστρέφει ένα //Path// που επιστρέφει χρήσιμες τιμές όταν ερωτηθούν. Το αρχείο δεν είναι απαραίτητο να υπάρχει για να λειτουργήσει αυτή η μέθοδος.+=== Η μέθοδος toRealPath ===
  
-Η μέθοδος //toRealPath// επιστρέφει την πραγματική πορεία ενός υπάρχοντος αρχείου. Επίσης, εκτελεί πολλές λειτουργίες σε μία:+Η μέθοδος //toRealPath// επιστρέφει το "πραγματικό" μονοπάτι ενός υπάρχοντος αρχείου ή καταλόγου, εκτελώντας πολλές λειτουργίες ταυτόχρονα:
  
   * Αν περνά σε αυτή τη μέθοδο η τιμή //true// και το σύστημα αρχείων υποστηρίζει symbolic links, τότε επιλύει όλα τα symbolic links στο μονοπάτι.   * Αν περνά σε αυτή τη μέθοδο η τιμή //true// και το σύστημα αρχείων υποστηρίζει symbolic links, τότε επιλύει όλα τα symbolic links στο μονοπάτι.
   * Αν το //Path// είναι σχετικό, επιστρέφει ένα απόλυτο //Path//.   * Αν το //Path// είναι σχετικό, επιστρέφει ένα απόλυτο //Path//.
-  * Αν το //Path// περιλαμβάνει τυχόν περιττά στοιχεία, επιστρέφει ένα μονοπάτι χωρίς αυτά τα στοιχεία .+  * Αν το //Path// περιλαμβάνει τυχόν περιττά στοιχεία (//loops//), επιστρέφει ένα μονοπάτι χωρίς αυτά τα στοιχεία. 
 + 
 +|Προηγούμενο: [[:java:class_file | Η κλάση File ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:file_io_intro| Ροές δεδομένων ]] | 
java/class_path.1425498140.txt.gz · Last modified: 2015/03/04 19:42 by gthanos