This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
|
java:character_streams [2015/03/10 12:38] gthanos [Buffered I/O] |
java:character_streams [2016/02/15 13:21] 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]]. |
| - | ==== I/O με γνώμονα την Γραμμή ==== | + | |
| + | ==== Διαβάζοντας και γράφοντας μία γραμμή ==== | ||
| Οι 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 με γνώμονα την γραμμή. Για να το κάνουμε αυτό, θα πρέπει να χρησιμοποιήσουμε δύο κλάσεις που δεν έχουμε ξαναδεί, τις BufferedReader και PrintWriter. Σε αυτό το παράδειγμα, θα εστιάσουμε στην υποστήριξη I/O με γνώμονα την γραμμή. | + | Ας τροποποιήσουμε το παράδειγμα //CopyCharacters// για να χρησιμοποιήσουμε I/O με γνώμονα την γραμμή. Για να το κάνουμε αυτό, θα πρέπει να χρησιμοποιήσουμε δύο κλάσεις που δεν έχουμε ξαναδεί, τις BufferedReader και PrintWriter. Σε αυτό το παράδειγμα, θα εστιάσουμε στην υποστήριξη I/O με γνώμονα την γραμμή. |
| Το παράδειγμα [[CopyLines]] επικαλείται τις BufferedReader.readLine και PrintWriter.println για να κάνει είσοδο και έξοδο, μία γραμμή τη φορά. | Το παράδειγμα [[CopyLines]] επικαλείται τις BufferedReader.readLine και PrintWriter.println για να κάνει είσοδο και έξοδο, μία γραμμή τη φορά. | ||