java:character_streams

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:character_streams [2015/03/09 07:45]
gthanos [I/O με γνώμονα την Γραμμή]
java:character_streams [2016/02/15 13:41]
gthanos [Buffered I/O]
Line 1: Line 1:
 ====== Streams Χαρακτήρων (Character Streams) ====== ====== Streams Χαρακτήρων (Character Streams) ======
  
-Η πλατφόρμα της ​Java αποθηκεύει τιμές χαρακτήρα ​χρησιμοποιώντας την σύμβαση Unicode. Ένα character stream I / O μεταφράζει αυτόματα αυτή ​την ​εσωτερική μορφή στο και από το τοπικό ​σύνολο ​χαρακτήρων. Στις δυτικές περιοχές,​ το τοπικό ​σύνολο χαρακτήρων είναι ​συνήθως ένα υπερσύνολο του ASCII των 8-bit. +Η Java χρησιμοποιεί για την ​κωδικοποίηση χαρακτήρων τη σύμβαση Unicode. Οποιοδήποτε αρχείο περιέχει χαρακτήρες, για κάθε χαρακτήρα περιέχει την ισοδύναμη δυαδική μορφή του χαρακτήρα. Ένα character stream I/O μεταφράζει αυτόματα της δυαδικές ​τιμές σε unicode χαρακτήρες.
- +
-Για τις περισσότερες εφαρμογές, η I / O με streams ​χαρακτήρα δεν ​είναι πιο περίπλοκη από την I / O με byte streams. Η είσοδος και έξοδος που γίνεται με stream κλάσεις,​ μεταφράζει αυτόματα στο και από το τοπικό σύνολο ​χαρακτήρων. Ένα πρόγραμμα που χρησιμοποιεί streams ​χαρακτήρα ​αντί για byte streams, ​προσαρμόζεται αυτόματα στο τοπικό σύνολο ​χαρακτήρων και ​είναι έτοιμο για διεθνοποίηση - και όλα αυτά χωρίς επιπλέον προσπάθεια από τον προγραμματιστή. +
- +
-Αν η διεθνοποίηση ​δεν αποτελεί προτεραιότητα, ​μπορείτε απλά να χρησιμοποιήσετε τις κλάσεις τύπου stream ​χαρακτήρα, χωρίς ​να δίνουν ιδιαίτερη προσοχή σε θέματα συνόλου χαρακτήρων. Αργότερα,​ αν η διεθνοποίηση γίνει προτεραιότητα, το πρόγραμμά σας μπορεί να προσαρμοστεί χωρίς εκτεταμένη εκ νέου κωδικοποίηση+
  
 ==== Χρησιμοποιώντας Streams Xαρακτήρων ==== ==== Χρησιμοποιώντας Streams Xαρακτήρων ====
  
-Όλες οι κλάσεις ​τύπου stream χαρακτήρα κατάγονται από τις κλάσεις Reader και Writer. ​Όπως ​και με τα byte streams, υπάρχουν κλάσεις ​stream χαρακτήρα που ειδικεύονται σε I / O αρχείου : FileReader και FileWriter. Το παράδειγμα ​[[CopyCharacters]] παρουσιάζει ​αυτές ​τις κλάσεις.+Όλες οι κλάσεις που ​περιγράφουν ​stream χαρακτήρων κατάγονται από τις κλάσεις ​[[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​Reader.html|Reader]] ​και ​[[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​Writer.html|Writer]]. Σε αναλογία ​και με τα byte streams ​που είδαμε προηγούμενα, υπάρχουν ​οι κλάσεις ​[[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​FileReader.html|FileReader]] ​και [[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​FileWriter.html|FileWriter]] ​που επιτρέπουν την ανάγνωση και την εγγραφή streams ​χαρακτήρων. Το παρακάτω ​παράδειγμα ​της κλάσης //CopyCharacters// παρουσιάζει τις κλάσεις αυτές.
  
 <code java CopyCharacters.java>​ <code java CopyCharacters.java>​
Line 42: Line 38:
 </​code>​ </​code>​
  
-Το //​CopyCharacters//​ είναι παρόμοιο με το //​CopyBytes//​. Η σημαντικότερη διαφορά είναι ότι ​το //​CopyCharacters//​ χρησιμοποιεί ​FileReader ​και FileWriter για είσοδο και έξοδο στη θέση των FileInputStream και FileOutputStream. Παρατηρήστε ότι και τα δύο //​CopyBytes//​ και //​CopyCharacters//​ χρησιμοποιούν μια μεταβλητή int για να διαβάσουν και να γράψουν. Ωστόσο,​ στο //​CopyCharacters//,​ η μεταβλητή int κρατά μια τιμή χαρακτήρα στα 16 τελευταία bit του, ενώ στο CopyBytes, η μεταβλητή int κρατά μια byte τιμή στα τελευταία 8 bit του.+Η κλάση ​//​CopyCharacters//​ είναι παρόμοια με την κλάση ​//​CopyBytes//​. Η σημαντικότερη διαφορά είναι ότι ​η //​CopyCharacters//​ χρησιμοποιεί ​τις κλάσεις [[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​Reader.html ​και ​[[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​Writer.html|FileWriter]] για είσοδο και έξοδο στη θέση των FileInputStream και FileOutputStream. Παρατηρήστε ότι τόσο η κλάση ​//​CopyBytes// ​όσο ​και ​η κλάση ​//​CopyCharacters//​ χρησιμοποιούν μια μεταβλητή int για να διαβάσουν και να γράψουν. Ωστόσο,​ στο //​CopyCharacters//,​ η μεταβλητή int κρατά μια τιμή χαρακτήρα στα 16 τελευταία bit του, ενώ στο CopyBytes, η μεταβλητή int κρατά μια byte τιμή στα τελευταία 8 bit του.
  
 ==== Streams Xαρακτήρων που χρησιμοποιούν Byte Streams ==== ==== Streams Xαρακτήρων που χρησιμοποιούν Byte Streams ====
  
-Τα streams χαρακτήρων είναι συχνά «περιτυλίγματα» ​για ​byte streams. ​Το stream χαρακτήρων χρησιμοποιεί το byte stream για την εκτέλεση της φυσικής I/O, ενώ το stream χαρακτήρων χειρίζεται τη μετάφραση μεταξύ των χαρακτήρων και bytes. Η FileReader, για παράδειγμα,​ χρησιμοποιεί την FileInputStream,​ ενώ η FileWriter χρησιμοποιεί την FileOutputStream.+Τα streams χαρακτήρων είναι συχνά «περιτυλίγματα» ​των ​byte streams. ​Κάθε ​stream χαρακτήρων χρησιμοποιεί το byte stream για την εκτέλεση της φυσικής I/O, ενώ το stream χαρακτήρων χειρίζεται τη μετάφραση μεταξύ των χαρακτήρων και bytes. Η κλάση [[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​Reader.html, για παράδειγμα,​ χρησιμοποιεί την ​κλάση [[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​FileInputStream.html|FileInputStream]], ενώ η FileWriter χρησιμοποιεί την ​κλάση [[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​FileOutputStream.html|FileOutputStream]].
  
-Υπάρχουν δύο γενικού σκοπού byte-προς-χαρακτήρα streams "​γέφυρα"​ : τα InputStreamReader ​και ​OutputStreamWriter. Χρησιμοποιήστε ​τα για να δημιουργήσετε streams χαρακτήρων όταν δεν υπάρχουν προδημιουργημένες κλάσεις stream χαρακτήρων που ανταποκρίνονται στις ανάγκες σας. ​+==== Διαβάζοντας και ​γράφοντας μία γραμμή ​====
  
-==== I/O με γνώμονα την ​Γραμμή ​====+Η διαδικασία ανάγνωσης ή διαβάσματος χαρακτήρων λαμβάνουν χώρα συνήθως σε ομάδες χαρακτήρων. Μια συνηθισμένη  μονάδα είναι η γραμμή. Η γραμμή ορίζεται ως μία σειρά από χαρακτήρες με ένα χαρακτήρα αλλαγής γραμμής στο τέλος. Ο χαρακτήρας αλλαγής γραμμής μπορεί να είναι μια ακολουθία χαρακτήρων carriege return/line feed ('​\r''​\n'​),​ ένας χαρακτήρας carriege return ('​\r'​),​ ή ένας χαρακτήρας line feed ('​\n'​). ​
  
-Οι I/O χαρακτήρα λαμβάνουν χώρα ​συνήθως σε μεγαλύτερες μονάδες από μονούς χαρακτήρες. Μια συνηθισμένη ​ μονάδα είναι η γραμμή: μία σειρά από χαρακτήρες με ένας τερματιστής γραμμής ​στο τέλος. Ένας ​χαρακτήρας αλλαγής γραμμής μπορεί ​να είναι μια ακολουθία χαρακτήρων carriege return/line feed ('​\r''​\n'​),​ ένας χαρακτήρας carriege return ('​\r'​),​ ή ένας χαρακτήρας line feed ('​\n'​). Υποστηρικτικά όλοι οι χαρακτήρες αλλαγής ​γραμμής επιτρέπουν στα προγράμματα να διαβάζουν αρχεία ​κειμένου ​που δημιουργήθηκαν σε οποιοδήποτε από τα ευρέως ​χρησιμοποιούμενα λειτουργικά συστήματα.+Ας τροποποιήσουμε το παράδειγμα ​//​CopyCharacters//​ για να χρησιμοποιήσουμε I/O χαρακτήρων για να διαβάσουμε και να γράψουμε γραμμήραμμή. Για να το κάνουμε αυτό, θα πρέπει να χρησιμοποιήσουμε δύο κλάσεις που δεν έχουμε ξαναδεί, ​τις [[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​BufferedReader.html|BufferedReader]] και [[https://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​PrintWriter.html|PrintWriter]]
  
-Ας τροποποιήσουμε το //​CopyCharacters//​ παράδειγμα για να χρησιμοποιήσουμε I/O με γνώμονα την γραμμή. Για να το κάνουμε αυτό, θα πρέπει να χρησιμοποιήσουμε δύο κλάσεις που δεν έχουμε ξαναδεί,​ τις BufferedReader και PrintWriter. Σε αυτό το παράδειγμα,​ θα εστιάσουμε στην υποστήριξη I/O με γνώμονα την γραμμή και όχι στις έννοιες των [[Buffered I/O]] και [[Μορφοποίησης]] . +Το παράδειγμα [[CopyLines]] επικαλείται τις BufferedReader.readLine και PrintWriter.println για να διαβάσει και ​να γράψει ​μία γραμμή ​κάθε ​φορά.
- +
-Το παράδειγμα [[CopyLines]] επικαλείται τις BufferedReader.readLine και PrintWriter.println για να κάνει είσοδο ​και ​έξοδο, ​μία γραμμή ​τη φορά.+
  
 <code java CopyLines.java>​ <code java CopyLines.java>​
Line 91: Line 85:
 </​code>​ </​code>​
  
-Η κληση της //​readline//​ επιστρέφει μια γραμμή κειμένου. To πρόγραμμα //​CopyLines//​ εξάγει κάθε γραμμή,​ χρησιμοποιώντας την //​println//,​ η οποία προσθέτει τον χαρακτήρα αλλαγής γραμμής για το τρέχον λειτουργικό σύστημα. Αυτός μπορεί να μην είναι ο ίδιος χαρακτήρας αλλαγής γραμμής που χρησιμοποιήθηκε στο αρχείο εισόδου.+Η κλήση της //​readline//​ επιστρέφει μια γραμμή κειμένου. To πρόγραμμα //​CopyLines//​ εξάγει κάθε γραμμή,​ χρησιμοποιώντας την //​println//,​ η οποία προσθέτει τον χαρακτήρα αλλαγής γραμμής για το τρέχον λειτουργικό σύστημα. Αυτός μπορεί να μην είναι ο ίδιος χαρακτήρας αλλαγής γραμμής που χρησιμοποιήθηκε στο αρχείο εισόδου ​ή μπορεί να είναι διαφορετικός (εξαρτάται από το λειτουργικό σύστημα που χρησιμοποιήθηκε για την εγγραφή του αρχικού αρχείου). 
 + 
 +==== Buffered I/O ==== 
 + 
 +Τα περισσότερα από τα παραδείγματα που έχουμε δει μέχρι στιγμής χρησιμοποιούν //​unbuffered//​ I / O. Αυτό σημαίνει ότι κάθε αίτημα ανάγνωσης ή εγγραφής χειρίζεται απευθείας από το υποκείμενο λειτουργικό σύστημα. Αυτό μπορεί να κάνει ένα πρόγραμμα πολύ λιγότερο αποτελεσματικό,​ δεδομένου ότι κάθε τέτοιο αίτημα,​ προκαλεί συχνά την πρόσβαση δίσκου,​ τη δραστηριότητα του δικτύου,​ ή κάποια άλλη ενέργεια που είναι σχετικά ακριβή. 
 + 
 +Για να μειωθεί αυτό το είδος overhead, η πλατφόρμα της Java υλοποιεί //​buffered//​ I / O streams. Τα buffered streams εισόδου διαβάζουν δεδομένα από μια περιοχή μνήμης που είναι γνωστή ως //buffer//. Ομοίως,​ τα buffered streams εξόδου γράφουν δεδομένα σε ένα //​buffer//​. 
 + 
 +Ένα πρόγραμμα μπορεί να μετατρέψει ένα unbuffered stream ​ σε ένα buffered stream χρησιμοποιώντας το ιδίωμα περιτυλίγματος που έχουμε χρησιμοποιήσει αρκετές προηγούμενα,​ όπου το unbuffered stream περνά στον ​ constructor για μια buffered stream κλάση. Παρακάτω δίνεται πώς μπορείτε να τροποποιήσετε τις κλήσεις constructor στο παράδειγμα //​CopyCharacters//​ για να χρησιμοποιούν buffered I / O: 
 + 
 +<code java> 
 +inputStream = new BufferedReader(new FileReader("​xanadu.txt"​));​ 
 +outputStream = new BufferedWriter(new FileWriter("​characteroutput.txt"​));​ 
 +</​code>​ 
 + 
 +Υπάρχουν τέσσερις κλάσεις τύπου buffered stream που χρησιμοποιούνται για να μετατρέψουν unbuffered streams σε buffered streams: Οι [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​BufferedInputStream.html|BufferedInputStream]] και [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​BufferedOutputStream.html|BufferedOutputStream]] δημιουργούν buffered byte streams, ενώ οι [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​BufferedReader.html|BufferedReader]] και [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​BufferedWriter.html|BufferedWriter]] δημιουργούν buffered streams χαρακτήρων.  
 + 
 +|Προηγούμενο:​ [[:​java:​byte_streams | Byte Streams ]] | Επόμενο:​ [[java:​formatting | Μορφοποίηση Εξόδου ]]|
java/character_streams.txt · Last modified: 2016/02/26 11:15 (external edit)