java:byte_streams

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 τη φορά.

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();
            }
        }
    }
}

Η μέθοδος main της κλάσης CopyBytes περνάει τον περισσότερο χρόνο επεξεργασίας μέσα σε ένα βρόχο που διαβάζει από το ρεύμα εισόδου και γράφει στο ρεύμα εξόδου, ένα byte τη φορά, όπως φαίνεται στην παρακάτω εικόνα.

Πάντα να κλείνετε τα Streams

Το κλείσιμο ενός stream όταν δεν είναι πλέον αναγκαίo είναι πολύ σημαντικό. Η κλάση CopyBytes χρησιμοποιεί ένα τελικό block για να εγγυηθεί ότι και τα δύο stream θα κλείσουν ακόμα και αν παρουσιαστεί κάποιο σφάλμα. Η πρακτική αυτή βοηθά στην αποφυγή σοβαρών διαρροών πόρων.

Ένα πιθανό σφάλμα είναι ότι το CopyBytes δεν μπόρεσε να ανοίξει το ένα ή και τα δύο αρχεία. Σε αυτή την περίπτωση θα παραχθεί ένα I/O Exception. Όταν συμβαίνει αυτό, η stream μεταβλητή που αντιστοιχεί στο αρχείο θα έχει την τιμή null. Αυτός είναι ο λόγος για τον οποίο η κλάση CopyBytes φροντίζει ώστε κάθε stream μεταβλητή να περιέχει μια αναφορά αντικειμένου πριν από την κλήση του close.

Σε ποιες περιπτώσεις να μην χρησιμοποιείτε τα Byte Streams

Δεδομένου ότι το xanadu.txt περιέχει δεδομένα χαρακτήρων, η καλύτερη προσέγγιση είναι να χρησιμοποιήσετε streams χαρακτήρων, όπως αναλύεται στην επόμενη ενότητα. Υπάρχουν επίσης streams για πιο πολύπλοκους τύπους δεδομένων. Τα byte streams θα πρέπει να χρησιμοποιούνται μόνο για ανάγνωση και εγγραφή από και προς δυαδικά αρχεία.

java/byte_streams.txt · Last modified: 2016/02/26 11:15 (external edit)