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 περνάει τον περισσότερο χρόνο επεξεργασίας μέσα σε ένα βρόχο που διαβάζει από το ρεύμα εισόδου και γράφει στο ρεύμα εξόδου.

Διαβάζοντας και γράφοντας περισσότερα από ένα 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);
      }
    } 
  }
}

Προκειμένου να μπορούμε να χειριζόμαστε περισσότερα δεδομένα σε κάθε κλήση συστήματος, η πλατφόρμα της Java υλοποιεί τις κλάσεις BufferedInputStream και BufferedOutputStream για την διαχείριση ροών δεδομένων όπου διαβάζονται ή γράφονται περισσότερα του ενός byte κάθε φορά.

Παρακάτω θα ξαναγράψουμε το πρόγραμμα CopyBytes μόνο που αυτή τη φορά το διάβασμα των bytes δεν θα γίνει ένα-ένα (unbuffered), αλλά θα διαβάζονται και θα γράφονται ακολουθίες των 512 bytes με την βοήθεια των κλάσεων BufferedInputStream και BufferedOutputStream.

CopyBufferedBytes.java
import java.io.*;
 
public class CopyBufferedBytes {
  public static void main(String[] args) throws IOException {
 
    BufferedInputStream in = null;
    BufferedOutputStream out = null;
    final int buffer_size = 256;
    byte []buffer = new byte[buffer_size];
 
    try {
      String filename;
      if(args.length > 0)
        filename = args[0];
      else
        filename = "xanadu.txt";
 
      in = new BufferedInputStream(new FileInputStream(filename));
      out = new BufferedOutputStream(new FileOutputStream("__"+filename));
      int size;
 
      while ((size = in.read(buffer, 0, buffer_size)) != -1) {
        out.write(buffer, 0, size);
      }
    } finally {
      if (in != null) {
        in.close();
      }
      if (out != null) {
        out.close();
      }
    }
  }
}
java/byte_streams.1583412970.txt.gz · Last modified: 2020/03/05 12:56 by gthanos