This shows you the differences between two versions of the page.
|
java:byte_streams [2015/03/04 19:20] gthanos [Χρησιμοποιώντας Byte Streams] |
java:byte_streams [2016/02/26 11:15] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Byte Streams ====== | ||
| - | |||
| - | Τα προγράμματα χρησιμοποιούν **byte streams** για να εκτελέσουν είσοδο και έξοδο bytes των 8-bit. Όλες οι κατηγορίες byte stream είναι απόγονοι των **InputStream** και **OutputStream**. | ||
| - | |||
| - | Υπάρχουν πολλές byte stream κλάσεις. Για να δείξουμε πώς δουλεύουν τα byte streams , θα επικεντρωθούμε στα **I / O byte streams**, **FileInputStream** και **FileOutputStream**. Άλλα είδη byte streams χρησιμοποιούνται με τον ίδιο τρόπο και διαφέρουν κυρίως στον τρόπο που κατασκευάζονται. | ||
| - | |||
| - | ==== Χρησιμοποιώντας Byte Streams ==== | ||
| - | |||
| - | Θα εξερευνήσουμε τα FileInputStream και FileOutputStream εξετάζοντας ένα παράδειγμα προγράμματος που ονομάζεται [[CopyBytes]], το οποίο χρησιμοποιεί byte streams για να αντιγράψει το [[xanadu.txt]], ένα byte τη φορά. | ||
| - | |||
| - | <code java CopyBytes.java> | ||
| - | import java.io.FileInputStream; | ||
| - | import java.io.FileOutputStream; | ||
| - | import java.io.IOException; | ||
| - | |||
| - | public class CopyBytes { | ||
| - | public static void main(String[] args) { | ||
| - | |||
| - | FileInputStream in = null; | ||
| - | FileOutputStream out = null; | ||
| - | |||
| - | try { | ||
| - | in = new FileInputStream("xanadu.txt"); | ||
| - | out = new FileOutputStream("outagain.txt"); | ||
| - | int c; | ||
| - | |||
| - | while ((c = in.read()) != -1) { | ||
| - | out.write(c); | ||
| - | } | ||
| - | } catch(IOException ex) { | ||
| - | System.out.prinln("An I/OException occured while trying to open input or output stream"); | ||
| - | } | ||
| - | } finally { | ||
| - | if (in != null) { | ||
| - | in.close(); | ||
| - | } | ||
| - | if (out != null) { | ||
| - | out.close(); | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | </code> | ||
| - | |||
| - | To //CopyBytes// περνάει τον περισσότερο χρόνο του σε ένα απλό βρόχο που διαβάζει το ρεύμα εισόδου και γράφει το ρεύμα εξόδου, ένα byte τη φορά, όπως φαίνεται στην παρακάτω εικόνα. | ||
| - | |||
| - | {{ :java:bytestream.gif |}} | ||
| - | |||
| - | ==== Πάντα να κλείνετε τα Streams ==== | ||
| - | |||
| - | Το κλείσιμο ενός stream όταν δεν είναι πλέον αναγκαίo είναι πολύ σημαντικό. Τόσο σημαντικό ώστε το //CopyBytes// χρησιμοποιεί ένα //τελικό// block για να εγγυηθεί ότι και τα δύο stream θα κλείσουν ακόμα και αν παρουσιαστεί κάποιο σφάλμα. Η πρακτική αυτή βοηθά στην αποφυγή σοβαρών διαρροών πόρων. | ||
| - | |||
| - | Ένα πιθανό σφάλμα είναι ότι το //CopyBytes// δεν μπόρεσε να ανοίξει το ένα ή και τα δύο αρχεία. Σε αυτή την περίπτωση θα παραχθεί ένα //I/O Exception//. Όταν συμβαίνει αυτό, η stream μεταβλητή που αντιστοιχεί στο αρχείο δεν αλλάζει ποτέ από την αρχική null τιμή του. Αυτός είναι ο λόγος για τον οποίο το //CopyBytes// φροντίζει ώστε κάθε stream μεταβλητή να περιέχει μια αναφορά αντικειμένου πριν από την κλήση του //close//. | ||
| - | |||
| - | ==== Πότε να μην χρησιμοποιείτε τα Byte Streams ==== | ||
| - | |||
| - | Το //CopyBytes// φαίνεται σαν ένα φυσιολογικό πρόγραμμα, αλλά αποτελεί στην πραγματικότητα ένα είδος I / O χαμηλού επιπέδου που θα πρέπει να αποφεύγετε. Δεδομένου ότι το //xanadu.txt// περιέχει δεδομένα χαρακτήρων, η καλύτερη προσέγγιση είναι να χρησιμοποιήσετε [[java:character_streams|streams χαρακτήρων]], όπως αναλύεται στην επόμενη ενότητα. Υπάρχουν επίσης streams για πιο πολύπλοκους τύπους δεδομένων. Τα byte streams θα πρέπει να χρησιμοποιούνται μόνο για πιο primitive I / O. Τέλος, κάτι που πρέπει να θυμόμαστε για τα byte streams είναι ότι όλα τα άλλα είδη stream είναι βασισμένα πάνω τους. | ||