User Tools

Site Tools


java:byte_streams

This is an old revision of the document!


Ροές Δυαδικών Δεδομένων

Όλες οι κλάσεις που θα δούμε στη συνέχεια αυτής της ενότητας χρησιμοποιούν εσωτερικά byte streams για να εκτελέσουν είσοδο και έξοδο δεδομένων από αρχεία ή άλλες πηγές. Οι κλάσεις τύπου byte-stream είναι απόγονοι των κλάσεων InputStream και OutputStream.

Για να δείξουμε πώς δουλεύουν τα byte streams, θα ξεκινήσουμε από τις κλάσεις FileInputStream και FileOutputStream που είναι οι βασικότερες. Άλλες κλάσεις χτίζουν πάνω σε αυτές προκειμένου να προσφέρουν επιπλέον λειτουργικότητα.

Χρησιμοποιώντας Byte Streams

Θα εξερευνήσουμε τις κλάσεις FileInputStream και FileOutputStream με χρήση του παρακάτω παραδείγματος CopyBytes, το οποίο λαμβάνει προς αντιγραφή ένα αρχείο από την γραμμή εντολών. Μπορείτε να χρησιμοποιήσετε ένα αρχείο κειμένου (π.χ. xanadu.txt) ή μία εικόνα.

CopyBytes.java
import java.io.*;
 
public class CopyBytes {
  public static void main(String[] args) throws IOException {
 
    String filename = "lena.png";
 
    try (FileInputStream in = new FileInputStream(filename);
      FileOutputStream out = new FileOutputStream("__"+filename)) {
 
      int c;
 
      while ((c = in.read()) != -1) {
        out.write(c);
      }
    } 
  }
}

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

Διαβάζοντας και γράφοντας περισσότερα από ένα bytes

Το παράδειγμα που είδαμε προηγουμένως το πρόγραμμα διαβάζει και γράφει ένα byte κάθε φορά. Παρακάτω θα δούμε το ίδιο πρόγραμμα, μόνο που αυτή τη φορά διαβάζουμε και γράφουμε περισσότερα του ενός bytes σε κάθε εντολή read και write.

CopyBytes.java
import java.io.*;
 
public class CopyBytes {
  public static void main(String[] args) throws IOException {
 
    String filename = "lena.png";
 
    try (FileInputStream in = new FileInputStream(filename);
      FileOutputStream out = new FileOutputStream("__"+filename)) {
 
      byte []array = new byte[512];
      int length;
 
      while ((length = in.read(array)) != -1) {
        System.out.println(length);
        out.write(array, 0, length);
      }
    } 
  }
}

Buffered Streams

Εκτός τα “απλά” input/output streams, υπάρχει η δυνατότητα να χρησιμοποιήσετε buffered streams, δηλαδή streams που κάνουν εσωτερικά buffering ώστε να βελτιστοποιήσουν την διαδικασία ανάγνωσης εγγραφής. Οι κλάσεις αυτές είναι οι BufferedInputStream και BufferedOutputStream. Το μέγεθος του χρησιμοποιούμενου buffer είναι παραμετροποιήσιμο στον κατασκευαστή των παραπάνω κλάσεων. Προτείνεται να μην επιλέγετε εσείς το μέγεθος του buffer (εκτός αν ξέρετε τι κάνετε…).

Παρακάτω δίνεται το προηγούμενο παράδειγμα χρησιμοποιώντας τις κλάσεις BufferedInputStream και BufferedOutputStream.

CopyBufferedBytes.java
import java.io.*;
 
public class CopyBufferedBytes {
  public static void main(String[] args) throws IOException {
 
    String filename = "lena.png";
 
    try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(filename));
      BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("__"+filename)) ) {
 
      byte []array = new byte[512];
      int length;
 
      while ((length = in.read(array)) != -1) {
        System.out.println(length);
        out.write(array, 0, length);
      }
    } 
  }
}
java/byte_streams.1583413601.txt.gz · Last modified: 2020/03/05 13:06 (external edit)