java:byte_streams

Differences

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

Link to this comparison view

java:byte_streams [2016/02/15 12:23]
gthanos [Πάντα να κλείνετε τα 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**, **[[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​FileInputStream.html|FileInputStream]]** και **[[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​io/​FileOutputStream.html|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) throws IOException { 
- 
-        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);​ 
-            } 
-        } finally { 
-            if (in != null) { 
-                in.close(); 
-            } 
-            if (out != null) { 
-                out.close();​ 
-            } 
-        } 
-    } 
-} 
-</​code> ​ 
- 
-Η μέθοδος main της κλάσης //​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 είναι βασισμένα πάνω τους. 
- 
-|Προηγούμενο:​ [[:​java:​file_io_intro | Είσοδος και έξοδος αρχείων ]]| Επόμενο:​ [[:​java:​character_streams | Streams Χαρακτήρων]] | 
  
java/byte_streams.txt · Last modified: 2016/02/26 11:15 (external edit)