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/10 11:20]
gthanos [Buffered I/O]
java:character_streams [2016/02/26 11:15] (current)
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 με γνώμονα την Γραμμή ====+==== Διαβάζοντας και γράφοντας μία γραμμή ====
  
-Οι I/O χαρακτήρα λαμβάνουν χώρα συνήθως σε μεγαλύτερες μονάδες από μονούς χαρακτήρες. Μια συνηθισμένη ​ μονάδα είναι η γραμμήμία σειρά από χαρακτήρες με ένα χαρακτήρα αλλαγής γραμμής στο τέλος. ​Ένας ​χαρακτήρας αλλαγής γραμμής μπορεί να είναι μια ακολουθία χαρακτήρων carriege return/line feed ('​\r''​\n'​),​ ένας χαρακτήρας carriege return ('​\r'​),​ ή ένας χαρακτήρας line feed ('​\n'​). Υποστηρικτικά όλοι οι χαρακτήρες αλλαγής γραμμής επιτρέπουν στα προγράμματα να διαβάζουν αρχεία κειμένου που δημιουργήθηκαν σε οποιοδήποτε από τα ευρέως χρησιμοποιούμενα λειτουργικά συστήματα.+Η διαδικασία ανάγνωσης ή διαβάσματος ​χαρακτήρων λαμβάνουν χώρα συνήθως σε ομάδες χαρακτήρων. Μια συνηθισμένη ​ μονάδα είναι η γραμμή. Η γραμμή ορίζεται ως μία σειρά από χαρακτήρες με ένα χαρακτήρα αλλαγής γραμμής στο τέλος. ​Ο χαρακτήρας αλλαγής γραμμής μπορεί να είναι μια ακολουθία χαρακτήρων carriege return/line feed ('​\r''​\n'​),​ ένας χαρακτήρας carriege return ('​\r'​),​ ή ένας χαρακτήρας line feed ('​\n'​). ​
  
-Ας τροποποιήσουμε το //​CopyCharacters// ​παράδειγμα για να χρησιμοποιήσουμε I/O με γνώμονα την γραμμή. Για να το κάνουμε αυτό, θα πρέπει να χρησιμοποιήσουμε δύο κλάσεις που δεν έχουμε ξαναδεί,​ τις ​BufferedReader και PrintWriter. Σε αυτό το παράδειγμα,​ θα εστιάσουμε στην υποστήριξη I/O με γνώμονα την γραμμή και όχι στις έννοιες των ​[[java:character_streams#​Buffered I/O|Buffered I/O]] και [[Μορφοποίησης]] .+Ας τροποποιήσουμε το παράδειγμα ​//​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]]. 
  
-Το παράδειγμα [[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 ==== ==== Buffered I/O ====
Line 99: 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 106: 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 ​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:​byte_streams | Byte Streams ]] | Επόμενο:​ [[java:​formatting | Μορφοποίηση Εξόδου ]]|
java/character_streams.1425986442.txt.gz · Last modified: 2016/02/26 11:15 (external edit)