Sunday, February 27, 2011

Java 7:Το νέο non-blocking I/O (NIO.2) - Part I

H Java 7, σε λίγο καιρό θα είναι πλέον γεγονός (υπάρχουν ήδη debug builds και beta εκδόσεις προς δοκιμή) και θα περιλαμβάνει πλήθος νέων χαρακτηριστικών που θα βελτιώσουν - αλλά λιγότερο και άλλα περισσότερο - την ποιότητα του κώδικα και θα κάνουν τη ζωή των developers ακόμα πιο εύκολη. Ένα από τα πιο αμφισβητούμενα APΙ της Java (από την έκδοση 1.4) και μετά ήταν και είναι το non-blocking I/O API (ΝΙΟ), τα βασικά στοιχεία του οποίου ήταν συνοπτικά τα εξής:
  • Δυνατότητα κωδικοποίησης και αποκωδικοποίησης αρχείων με διαφορετικά σετ χαρακτήρων
  • Ένα interface το οποίο μπορούσε να διαβάζει και να διαχειρίζεται αρχεία στη μνήμη
  • Δυνατόητα για επεξεργασία δεδομένων (read & write) χωρίς εμπόδια (non-blocking operations)
  • Μία νέα βιβλιοθήκη για regular expressions η οποία είχε στηριχθεί στην ισχυρή και σταθερή υλοποίηση της Perl
Όλα τα παραπάνω ήταν πράγματι ένα σημαντικό βήμα της Java αλλά υπήρχαν ακόμα αρκετά ζητήματα που είχαν μείνει σε εκκρεμότητα
  • Δεν ήταν δυνατή η διαχείριση αρχείων με τον ίδιο τρόπο και με σταθερότητα σε όλα τα λειτουργικά συστήματα.Όποιος έχει αναπτύξει κώδικα και χρειάστηκε να επεξεργαστεί αρχεία από ένα σύστημα σε windows και Linux θα χαμογελάσει κουνώντας το κεφάλι! Για το λόγο αυτό κατηγορήθηκε ότι καταστρατηγεί το slogan : "write once, run everywhere"
  • Δεν είχε ένα ενιαίο μοντέλο διαχείρισης των ιδιοτήτων των αρχείων (read / write access κτλ.)
  • Ήθελε μεγάλη προσπάθεια και error-prone κώδικα για να διαβάσει κάποιος τα περιεχόμενα ενός καταλόγου αναδρομικά.
  • Δεν επέτρεπε τη χρήση λειτουργιών που ήταν διαθέσιμες αποκλειστικά από ένα λειτουργικό σύστημα.
  • Η ανεπηρέαστη επεξεργασία δεδομένων για αρχεία δεν υποστηρίζοντα ακόμα και μέχρι την έκδοση 1.6
Η νέα έκδοση του NIO ( NIO.2 ) το οποίο ξεκίνησε ως JSR-203 είναι πλέον γεγονός στη Java 7 και αποτελεί μία από τις σημαντικότερες βελτιώσεις της με κυριότερα χαρακτηριστικά τα παρακάτω :
  • Νέες βασικές κλάσεις για διαχείριση αρχείων
    • FileSystem
    • FileStore
    • Path – Αντικαθιστά την παλαιά κλάση file
  • Ιδιότητες Αρχείων
  • Υποστήριξη λειτουργιών που είναι διαθέσιμες μόνο από συγκεκριμένα λειτουργικά συστήματα (π.χ. Symbolic Link) 
  • Το WatchService για την παρακολούθηση αλλαγών σε αρχεία ή της ιδιότητες αυτών και την ενεργοποίηση τμήματος κώδικα. 
  • Δυνατότητα αναδρομικής ανάγνωσης καταλόγων (μέθοδος walkFileTree)
  • Υποστήριξη ασύγχρονης επεξεργασίας αρχείων (Interface SeekableByteChannel) 
Ας δούμε μερικές παραπάνω λεπτομέριες για τις 3 κύριες κλάσεις της βασικής βιβλιοθήκης του NIO.2 
  • FileSystem - Αποτελεί την κλάση που αναλαμβάνει την "επικοινωνία" με το τρέχων σύστημα αρχείων, είτε αφορά το εξ'ορισμού σύστημα αρχείων που παρέχεται από το Λειτουργικό Σύστημα είτε από ένα εναλλακτικό σύστημα αρχείων που ανακτήθηκε με το URI7.
  • FileStore - Κλάση, η οποία αναλαμβάνει τη διαχείριση των partitions, των μονάδων δίσκων κτλ. Αντιπροσωπεύει με άλλα λόγια, το αποθηκευτικό μέσο στο οποίο βρίσκεται ένα αρχείο
  • Path - Η κλάση που αντικαθιστά την παλιά κλάση File και χρησιμοποιείται για όλες τις ενέργειες πάνω σε ένα αρχείο (αντιγραφή, μετακίνηση, διαγραφή κτλ.) και διαχειρίζεται όλες τις έννοιες μιας πλήρης διαδρομής (path) είτε αυτή αφορά ένα αρχείο είτε έναν κατάλογο. Αξιοσημείωτο είναι ότι όλες οι μέθοδοι της κλάσης Path δημιουργούν μόνο ένα είδος exception, το κλασσικό IOException. Αν και αυτό είναι αναμφίβολα ένα βήμα προς την απλοποίηση του κώδικα και βοηθάει προς την κατεύθυνση αυτή, υπάρχουν κάποιες (λίγες ομολογουμένως περιπτώσεις) στις οποίες, καθιστά δύσκολο τον εντοπισμό ενός πιο εξειδικευμένου προβλήματος και τη διαχείρισή του.

Στα επόμενα άρθρα θα δείξω μερικά σύντομα παραδείγματα τόσο για τις βασικές κλάσεις του NIO.2 όσο και για τα υπόλοιπα νέα χαρακτηριστικά.

0 comments:

Post a Comment