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
Next revision Both sides next revision
java:character_streams [2015/03/10 11:52]
gthanos [Χρησιμοποιώντας Streams Xαρακτήρων]
java:character_streams [2016/02/15 13:40]
gthanos [Διαβάζοντας και γράφοντας μία γραμμή]
Line 1: Line 1:
 ====== Streams Χαρακτήρων (Character Streams) ====== ====== Streams Χαρακτήρων (Character Streams) ======
  
-Η πλατφόρμα της Java αποθηκεύει τιμές χαρακτήρα χρησιμοποιώντας την σύμβαση Unicode. Ένα character stream I/O μεταφράζει αυτόματα ​αυτή ​την εσωτερική μορφή στο και από το τοπικό σύνολο ​χαρακτήρων+Η Java χρησιμοποιεί για την κωδικοποίηση χαρακτήρων ​τη σύμβαση Unicode. Οποιοδήποτε αρχείο περιέχει ​χαρακτήρες, για κάθε ​χαρακτήρα περιέχει ​την ​ισοδύναμη δυαδική μορφή του χαρακτήρα. Ένα character stream I/O μεταφράζει αυτόματα της δυαδικές τιμές ​σε unicode ​χαρακτήρες.
  
-Για τις περισσότερες εφαρμογές,​ η I/O με streams χαρακτήρων δεν είναι πιο περίπλοκη από την I/O με byte streams. Η είσοδος και έξοδος που γίνεται με stream κλάσεις,​ μεταφράζει αυτόματα στο και από το τοπικό σύνολο χαρακτήρων. Ένα πρόγραμμα που χρησιμοποιεί streams χαρακτήρων αντί για byte streams, προσαρμόζεται αυτόματα στο τοπικό σύνολο χαρακτήρων. 
 ==== Χρησιμοποιώντας 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 39: 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 με γνώμονα την γραμμή και όχι στις έννοιες των [[java:​character_streams#​Buffered I/​O|Buffered I/O]] και [[Μορφοποίησης]] . +Το παράδειγμα [[CopyLines]] επικαλείται τις BufferedReader.readLine και PrintWriter.println για να διαβάσει και ​να γράψει ​μία γραμμή ​κάθε ​φορά.
- +
-Το παράδειγμα [[CopyLines]] επικαλείται τις BufferedReader.readLine και PrintWriter.println για να κάνει είσοδο ​και ​έξοδο, ​μία γραμμή ​τη φορά.+
  
 <code java CopyLines.java>​ <code java CopyLines.java>​
Line 88: Line 85:
 </​code>​ </​code>​
  
-Η κληση της //​readline//​ επιστρέφει μια γραμμή κειμένου. To πρόγραμμα //​CopyLines//​ εξάγει κάθε γραμμή,​ χρησιμοποιώντας την //​println//,​ η οποία προσθέτει τον χαρακτήρα αλλαγής γραμμής για το τρέχον λειτουργικό σύστημα. Αυτός μπορεί να μην είναι ο ίδιος χαρακτήρας αλλαγής γραμμής που χρησιμοποιήθηκε στο αρχείο εισόδου.+Η κλήση της //​readline//​ επιστρέφει μια γραμμή κειμένου. To πρόγραμμα //​CopyLines//​ εξάγει κάθε γραμμή,​ χρησιμοποιώντας την //​println//,​ η οποία προσθέτει τον χαρακτήρα αλλαγής γραμμής για το τρέχον λειτουργικό σύστημα. Αυτός μπορεί να μην είναι ο ίδιος χαρακτήρας αλλαγής γραμμής που χρησιμοποιήθηκε στο αρχείο εισόδου ​ή μπορεί να είναι διαφορετικός (εξαρτάται από το λειτουργικό σύστημα που χρησιμοποιήθηκε για την εγγραφή του αρχικού αρχείου).
  
 ==== Buffered I/O ==== ==== Buffered I/O ====
Line 96: Line 93:
 Για να μειωθεί αυτό το είδος overhead, η πλατφόρμα της Java υλοποιεί //​buffered//​ I / O streams. Τα buffered streams εισόδου διαβάζουν δεδομένα από μια περιοχή μνήμης που είναι γνωστή ως //buffer//. Ομοίως,​ τα buffered streams εξόδου γράφουν δεδομένα σε ένα //buffer//. Για να μειωθεί αυτό το είδος 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:+Ένα πρόγραμμα μπορεί να μετατρέψει ένα unbuffered stream ​ σε ένα buffered stream χρησιμοποιώντας το ιδίωμα περιτυλίγματος που έχουμε χρησιμοποιήσει αρκετές ​προηγούμενα, όπου το unbuffered stream περνά στον ​ constructor για μια buffered stream κλάση. ​Παρακάτω ​δίνεται πώς μπορείτε να τροποποιήσετε τις κλήσεις constructor στο παράδειγμα //​CopyCharacters//​ για να χρησιμοποιούν buffered I / O:
  
 <code java> <code java>
Line 103: Line 100:
 </​code>​ </​code>​
  
-Υπάρχουν τέσσερις κλάσεις τύπου buffered stream που χρησιμοποιούνται για να τυλίξουν unbuffered strams: Οι BufferedInputStream και BufferedOutputStream δημιουργούν buffered byte streams, ενώ οι BufferedReader και BufferedWriter ​δημιουργούν buffered streams χαρακτήρων.fered byte streams, ενώ οι BufferedReader και ​BufferedWriter δημιουργούν buffered streams χαρακτήρων. ​+Υπάρχουν τέσσερις κλάσεις τύπου buffered stream που χρησιμοποιούνται για να τυλίξουν unbuffered strams: Οι [[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:​byte_streams | Byte Streams ]] | Επόμενο:​ [[java:​formatting | Μορφοποίηση Εξόδου ]]|
java/character_streams.txt · Last modified: 2016/02/26 11:15 (external edit)