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:byte_streams [2015/02/22 23:27] elkarafe |
java:byte_streams [2015/03/10 11:46] gthanos [Πότε να μην χρησιμοποιείτε τα Byte Streams] |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Byte Streams ====== | ||
+ | |||
Τα προγράμματα χρησιμοποιούν **byte streams** για να εκτελέσουν είσοδο και έξοδο bytes των 8-bit. Όλες οι κατηγορίες byte stream είναι απόγονοι των **InputStream** και **OutputStream**. | Τα προγράμματα χρησιμοποιούν **byte streams** για να εκτελέσουν είσοδο και έξοδο bytes των 8-bit. Όλες οι κατηγορίες byte stream είναι απόγονοι των **InputStream** και **OutputStream**. | ||
- | Υπάρχουν πολλές byte stream κλάσεις. Για να δείξουμε πώς δουλεύουν τα byte streams , θα επικεντρωθούμε στα **I / O byte streams**, **FileInputStream** και **FileOutputStream**. Άλλα είδη byte streams χρησιμοποιούνται με τον ίδιο τρόπο και διαφέρουν κυρίως στον τρόπο που κατασκευάζονται. | + | Υπάρχουν πολλές 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 ==== | ==== Χρησιμοποιώντας Byte Streams ==== | ||
- | Θα εξερευνήσουμε τα FileInputStream και FileOutputStream εξετάζοντας ένα παράδειγμα προγράμματος που ονομάζεται [[CopyBytes]], το οποίο χρησιμοποιεί byte streams για να αντιγράψει το [[xanadu.txt]], ένα byte τη φορά. | + | Θα εξερευνήσουμε τα FileInputStream και FileOutputStream εξετάζοντας ένα παράδειγμα προγράμματος που ονομάζεται //CopyBytes//, το οποίο χρησιμοποιεί byte streams για να αντιγράψει το [[xanadu.txt]], ένα byte τη φορά. |
- | <code java> | + | <code java CopyBytes.java> |
import java.io.FileInputStream; | import java.io.FileInputStream; | ||
import java.io.FileOutputStream; | import java.io.FileOutputStream; | ||
import java.io.IOException; | import java.io.IOException; | ||
- | + | ||
public class CopyBytes { | public class CopyBytes { | ||
public static void main(String[] args) throws IOException { | public static void main(String[] args) throws IOException { | ||
- | + | ||
FileInputStream in = null; | FileInputStream in = null; | ||
FileOutputStream out = null; | FileOutputStream out = null; | ||
- | + | ||
try { | try { | ||
in = new FileInputStream("xanadu.txt"); | in = new FileInputStream("xanadu.txt"); | ||
out = new FileOutputStream("outagain.txt"); | out = new FileOutputStream("outagain.txt"); | ||
int c; | int c; | ||
- | + | ||
while ((c = in.read()) != -1) { | while ((c = in.read()) != -1) { | ||
out.write(c); | out.write(c); | ||
Line 40: | Line 42: | ||
To //CopyBytes// περνάει τον περισσότερο χρόνο του σε ένα απλό βρόχο που διαβάζει το ρεύμα εισόδου και γράφει το ρεύμα εξόδου, ένα byte τη φορά, όπως φαίνεται στην παρακάτω εικόνα. | To //CopyBytes// περνάει τον περισσότερο χρόνο του σε ένα απλό βρόχο που διαβάζει το ρεύμα εισόδου και γράφει το ρεύμα εξόδου, ένα byte τη φορά, όπως φαίνεται στην παρακάτω εικόνα. | ||
- | {{:java:bytestream.gif?400|}} | + | {{ :java:bytestream.gif |}} |
==== Πάντα να κλείνετε τα Streams ==== | ==== Πάντα να κλείνετε τα Streams ==== | ||
Line 46: | Line 48: | ||
Το κλείσιμο ενός stream όταν δεν είναι πλέον αναγκαίo είναι πολύ σημαντικό. Τόσο σημαντικό ώστε το //CopyBytes// χρησιμοποιεί ένα //τελικό// block για να εγγυηθεί ότι και τα δύο stream θα κλείσουν ακόμα και αν παρουσιαστεί κάποιο σφάλμα. Η πρακτική αυτή βοηθά στην αποφυγή σοβαρών διαρροών πόρων. | Το κλείσιμο ενός stream όταν δεν είναι πλέον αναγκαίo είναι πολύ σημαντικό. Τόσο σημαντικό ώστε το //CopyBytes// χρησιμοποιεί ένα //τελικό// block για να εγγυηθεί ότι και τα δύο stream θα κλείσουν ακόμα και αν παρουσιαστεί κάποιο σφάλμα. Η πρακτική αυτή βοηθά στην αποφυγή σοβαρών διαρροών πόρων. | ||
- | Ένα πιθανό σφάλμα είναι ότι το //CopyBytes// δεν μπόρεσε να ανοίξει το ένα ή και τα δύο αρχεία. Όταν συμβαίνει αυτό, η stream μεταβλητή που αντιστοιχεί στο αρχείο δεν αλλάζει ποτέ από την αρχική null τιμή του. Αυτός είναι ο λόγος για τον οποίο το //CopyBytes// φροντίζει ώστε κάθε stream μεταβλητή να περιέχει μια αναφορά αντικειμένου πριν από την κλήση του //close//. | + | Ένα πιθανό σφάλμα είναι ότι το //CopyBytes// δεν μπόρεσε να ανοίξει το ένα ή και τα δύο αρχεία. Σε αυτή την περίπτωση θα παραχθεί ένα //I/O Exception//. Όταν συμβαίνει αυτό, η stream μεταβλητή που αντιστοιχεί στο αρχείο δεν αλλάζει ποτέ από την αρχική null τιμή του. Αυτός είναι ο λόγος για τον οποίο το //CopyBytes// φροντίζει ώστε κάθε stream μεταβλητή να περιέχει μια αναφορά αντικειμένου πριν από την κλήση του //close//. |
+ | |||
+ | ==== Σε ποιες περιπτώσεις να μην χρησιμοποιείτε τα Byte Streams ==== | ||
- | ==== Πότε να μην χρησιμοποιείτε τα Byte Streams ==== | + | Το //CopyBytes// φαίνεται σαν ένα φυσιολογικό πρόγραμμα, αλλά αποτελεί στην πραγματικότητα ένα είδος I / O χαμηλού επιπέδου που θα πρέπει να αποφεύγετε. Δεδομένου ότι το //xanadu.txt// περιέχει δεδομένα χαρακτήρων, η καλύτερη προσέγγιση είναι να χρησιμοποιήσετε [[java:character_streams|streams χαρακτήρων]], όπως αναλύεται στην επόμενη ενότητα. Υπάρχουν επίσης streams για πιο πολύπλοκους τύπους δεδομένων. Τα byte streams θα πρέπει να χρησιμοποιούνται μόνο για πιο primitive I / O. Τέλος, κάτι που πρέπει να θυμόμαστε για τα byte streams είναι ότι όλα τα άλλα είδη stream είναι βασισμένα πάνω τους. |
- | Το //CopyBytes// φαίνεται σαν ένα φυσιολογικό πρόγραμμα, αλλά αποτελεί στην πραγματικότητα ένα είδος I / O χαμηλού επιπέδου που θα πρέπει να αποφεύγετε. Δεδομένου ότι το //xanadu.txt// περιέχει δεδομένα χαρακτήρων, η καλύτερη προσέγγιση είναι να χρησιμοποιήσετε character streams, όπως αναλύεται στην επόμενη ενότητα. Υπάρχουν επίσης streams για πιο πολύπλοκους τύπους δεδομένων. Τα byte streams θα πρέπει να χρησιμοποιούνται μόνο για πιο primitive I / O. Τέλος, κάτι που πρέπει να θυμόμαστε για τα byte streams είναι ότι όλα τα άλλα είδη stream είναι βασισμένα πάνω τους. | + | |Προηγούμενο: [[:java:file_io_intro | Είσοδος και έξοδος αρχείων ]]| Επόμενο: [[:java:character_streams | Streams Χαρακτήρων]] | |