java:byte_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:byte_streams [2015/02/21 22:59]
elkarafe
java:byte_streams [2016/02/26 11:15] (current)
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 38: Line 40:
 </​code> ​ </​code> ​
  
-To CopyBytes περνάει τον περισσότερο χρόνο ​του ​σε ένα ​απλό ​βρόχο που διαβάζει το ρεύμα εισόδου και γράφει το ρεύμα εξόδου,​ ένα byte τη φορά, όπως φαίνεται στην παρακάτω εικόνα.+Η μέθοδος main της κλάσης //CopyBytes// περνάει τον περισσότερο χρόνο ​επεξεργασίας μέσα ​σε ένα βρόχο που διαβάζει ​από ​το ρεύμα εισόδου και γράφει ​στο ρεύμα εξόδου,​ ένα byte τη φορά, όπως φαίνεται στην παρακάτω εικόνα.
  
-{{:​java:​bytestream.gif?400|}}+{{ :​java:​bytestream.gif |}}
  
 ==== Πάντα να κλείνετε τα Streams ==== ==== Πάντα να κλείνετε τα Streams ====
  
-Το κλείσιμο ενός stream όταν δεν είναι πλέον αναγκαίo είναι πολύ σημαντικό. ​Τόσο ​σημαντικό ώστε το //​CopyBytes//​ χρησιμοποιεί ένα //​τελικό//​ block για να εγγυηθεί ότι και τα δύο stream θα κλείσουν ακόμα και αν παρουσιαστεί κάποιο σφάλμα. Η πρακτική αυτή βοηθά στην αποφυγή σοβαρών διαρροών πόρων.+Το κλείσιμο ενός stream όταν δεν είναι πλέον αναγκαίo είναι πολύ σημαντικό. ​Η κλάση //​CopyBytes//​ χρησιμοποιεί ένα //​τελικό//​ block για να εγγυηθεί ότι και τα δύο stream θα κλείσουν ακόμα και αν παρουσιαστεί κάποιο σφάλμα. Η πρακτική αυτή βοηθά στην αποφυγή σοβαρών διαρροών πόρων. 
 + 
 +Ένα πιθανό σφάλμα είναι ότι το //​CopyBytes//​ δεν μπόρεσε να ανοίξει το ένα ή και τα δύο αρχεία. Σε αυτή την περίπτωση θα παραχθεί ένα //I/O Exception//​. Όταν συμβαίνει αυτό, η stream μεταβλητή που αντιστοιχεί στο αρχείο θα έχει την τιμή **null**. Αυτός είναι ο λόγος για τον οποίο η κλάση //​CopyBytes//​ φροντίζει ώστε κάθε stream μεταβλητή να περιέχει μια αναφορά αντικειμένου πριν από την κλήση του //​close//​. 
 + 
 +==== Σε ποιες περιπτώσεις να μην χρησιμοποιείτε τα Byte Streams ==== 
 + 
 +Δεδομένου ότι το //​xanadu.txt//​ περιέχει δεδομένα χαρακτήρων,​ η καλύτερη προσέγγιση είναι να χρησιμοποιήσετε [[java:​character_streams|streams χαρακτήρων]],​ όπως αναλύεται στην επόμενη ενότητα. Υπάρχουν επίσης streams για πιο πολύπλοκους τύπους δεδομένων. Τα byte streams θα πρέπει να χρησιμοποιούνται μόνο για ανάγνωση και εγγραφή από και προς δυαδικά αρχεία.  
 + 
 +|Προηγούμενο:​ [[:​java:​file_io_intro | Είσοδος και έξοδος αρχείων ]]| Επόμενο:​ [[:​java:​character_streams | Streams Χαρακτήρων]] |
  
-Ένα πιθανό σφάλμα είναι ότι το //​CopyBytes//​ δεν μπόρεσε να ανοίξει το ένα ή και τα δύο αρχεία. Όταν συμβαίνει αυτό, η stream μεταβλητή που αντιστοιχεί στο αρχείο δεν αλλάζει ποτέ από την αρχική null τιμή του. Αυτός είναι ο λόγος για τον οποίο το //​CopyBytes//​ φροντίζει ώστε κάθε stream μεταβλητή να περιέχει μια αναφορά αντικειμένου πριν από την κλήση του //close//. 
java/byte_streams.1424559591.txt.gz · Last modified: 2016/02/26 11:15 (external edit)