User Tools

Site Tools


java:byte_streams

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
java:byte_streams [2020/03/05 12:53] – [Σε ποιες περιπτώσεις να μην χρησιμοποιείτε τα Byte Streams] gthanosjava:byte_streams [2020/03/09 07:27] (current) – [Buffered Streams] gthanos
Line 3: Line 3:
 Όλες οι κλάσεις που θα δούμε στη συνέχεια αυτής της ενότητας χρησιμοποιούν εσωτερικά **byte streams** για να εκτελέσουν είσοδο και έξοδο δεδομένων από αρχεία ή άλλες πηγές. Οι κλάσεις τύπου byte-stream είναι απόγονοι των κλάσεων **InputStream** και **OutputStream**. Όλες οι κλάσεις που θα δούμε στη συνέχεια αυτής της ενότητας χρησιμοποιούν εσωτερικά **byte streams** για να εκτελέσουν είσοδο και έξοδο δεδομένων από αρχεία ή άλλες πηγές. Οι κλάσεις τύπου byte-stream είναι απόγονοι των κλάσεων **InputStream** και **OutputStream**.
  
-Για να δείξουμε πώς δουλεύουν τα 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, θα ξεκινήσουμε από τις κλάσεις **[[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 ====
  
-Θα εξερευνήσουμε τις κλάσεις FileInputStream και FileOutputStream με χρήση του παρακάτω παραδείγματος //CopyBytes//, το οποίο λαμβάνει προς αντιγραφή ένα αρχείο από την γραμμή εντολών. Μπορείτε να χρησιμοποιήσετε ένα αρχείο κειμένου (π.χ. [[xanadu.txt]]) ή οποιαδήποτε [[http://bellard.org/bpg/lena30.jpg|εικόνα]].+Θα εξερευνήσουμε τις κλάσεις FileInputStream και FileOutputStream με χρήση του παρακάτω παραδείγματος //CopyBytes//, το οποίο λαμβάνει προς αντιγραφή ένα αρχείο από την γραμμή εντολών. Μπορείτε να χρησιμοποιήσετε ένα αρχείο κειμένου (π.χ. [[xanadu.txt]]), μία εικόνα ή οποιοδήποτε άλλο αρχείο για να το εκτελέσετε. Το παράδειγμα χρησιμοποιεί την εικόνα [[http://optipng.sourceforge.net/pngtech/img/lena.png|lena.png]].
  
 <code java CopyBytes.java>  <code java CopyBytes.java> 
Line 30: Line 30:
 </code>  </code> 
  
-Η μέθοδος main της κλάσης //CopyBytes// περνάει τον περισσότερο χρόνο επεξεργασίας μέσα σε ένα βρόχο που διαβάζει από το ρεύμα εισόδου και γράφει στο ρεύμα εξόδου.+Η μέθοδος main της κλάσης //CopyBytes// περνάει τον περισσότερο χρόνο επεξεργασίας μέσα σε ένα βρόχο που διαβάζει από το ρεύμα εισόδου και γράφει στο ρεύμα εξόδου ένα byte σε κάθε επανάληψη.
  
  
-===== Διαβάζοντας και γράφοντας περισσότερα από ένα bytes σε δυαδικό αρχείο =====+===== Διαβάζοντας και γράφοντας περισσότερα από ένα bytes =====
  
-Το παράδειγμα που είδαμε προηγουμένως το πρόγραμμα διαβάζει και γράφει ένα byte κάθε φορά. Προκειμένου να μπορούμε να χειριζόμαστε περισσότερα δεδομένα σε κάθε κλήση συστήματοςη πλατφόρμα της Java υλοποιεί τις κλάσεις [[http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html|BufferedInputStream]] και [[http://docs.oracle.com/javase/7/docs/api/java/io/BufferedOutputStream.html|BufferedOutputStream]] για την διαχείριση ροών δεδομένων όπου διαβάζονται ή γράφονται περισσότερα του ενός byte κάθε φορά.+Το παράδειγμα που είδαμε προηγουμένως το πρόγραμμα διαβάζει και γράφει ένα byte κάθε φορά. Παρακάτω θα δούμε το ίδιο πρόγραμμα, μόνο που αυτή τη φορά διαβάζουμε και γράφουμε περισσότερα του ενός bytes σε κάθε εντολή read και write.
  
-Παρακάτω θα ξαναγράψουμε το πρόγραμμα CopyBytes μόνο που αυτή τη φορά το διάβασμα των bytes δεν θα γίνει ένα-ένα (unbuffered), αλλά θα διαβάζονται και θα γράφονται ακολουθίες των 512 bytes με την βοήθεια των κλάσεων [[http://docs.oracle.com/javase/7/docs/api/java/io/BufferedInputStream.html|BufferedInputStream]] και [[http://docs.oracle.com/javase/7/docs/api/java/io/BufferedOutputStream.html|BufferedOutputStream]].+<code java 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); 
 +      } 
 +    }  
 +  } 
 +
 +</code> 
 + 
 +===== Buffered Streams ===== 
 + 
 +Στα παραπάνω streams, υπάρχει η δυνατότητα να χρησιμοποιήσετε επιπλέον buffered streams, δηλαδή streams που κάνουν εσωτερικά buffering ώστε να βελτιστοποιήσουν την διαδικασία ανάγνωσης εγγραφής. Οι κλάσεις αυτές είναι οι [[https://docs.oracle.com/javase/8/docs/api/java/io/BufferedInputStream.html|BufferedInputStream]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/BufferedOutputStream.html|BufferedOutputStream]]. Το μέγεθος του χρησιμοποιούμενου buffer είναι παραμετροποιήσιμο στον κατασκευαστή των παραπάνω κλάσεων. Προτείνεται να μην επιλέγετε εσείς το μέγεθος του buffer (εκτός αν ξέρετε τι κάνετε...).  
 + 
 +Παρακάτω δίνεται το προηγούμενο παράδειγμα χρησιμοποιώντας τις κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/BufferedInputStream.html|BufferedInputStream]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/BufferedOutputStream.html|BufferedOutputStream]].
  
 <code java CopyBufferedBytes.java> <code java CopyBufferedBytes.java>
Line 45: Line 72:
   public static void main(String[] args) throws IOException {   public static void main(String[] args) throws IOException {
  
-    BufferedInputStream in null; +    String filename "lena.png";
-    BufferedOutputStream out = null; +
-    final int buffer_size = 256; +
-    byte []buffer = new byte[buffer_size];+
  
-    try +    try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(filename))
-      String filename+      BufferedOutputStream out new BufferedOutputStream(new FileOutputStream("__"+filename)) ) {
-      if(args.length > 0) +
-        filename = args[0]+
-      else +
-        filename = "xanadu.txt";+
              
-      in = new BufferedInputStream(new FileInputStream(filename)); +      byte []array = new byte[512]
-      out = new BufferedOutputStream(new FileOutputStream("__"+filename))+      int length;
-      int size;+
  
-      while ((size = in.read(buffer, 0, buffer_size)) != -1) { +      while ((length = in.read(array)) != -1) { 
-        out.write(buffer, 0, size);+        System.out.println(length); 
 +        out.write(array, 0, length);
       }       }
-    } finally { +    } 
-      if (in != null) { +
-        in.close(); +
-      } +
-      if (out != null) { +
-        out.close(); +
-      } +
-    }+
   }   }
 } }
 </code> </code>
  
-|Προηγούμενο: [[:java:file_io_intro | Είσοδος και έξοδος αρχείων ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:character_streams Ροές Χαρακτήρων]] |+<WRAP tip 80% center round> 
 +O ρόλος του buffer είναι πάντα η βελτιστοποίηση της απόδοσης κατά την ανάγνωση ή εγγραφή. Για παράδειγμα, διαβάζοντας από το δίσκο είναι γνωστό ότι ο δίσκος διαβάζει σε τμήματα των 2Κ ή 4Κ κατ' ελάχιστο. Εάν εσείς διαβάζετε λιγότερα δεδομένα κάθε φορά (π.χ. 512 bytes που είναι το προηγούμενο παράδειγμα) και δεν χρησιμοποιήσετε ένα buffered stream, για να διαβάσετε το σύνολο μιας σελίδας του δίσκου θα χρειαστείτε κατ' ελάχιστο 8 προσπελάσεις (8*512 = 4Κ). Αντ' αυτού, χρησιμοποιώντας ένα buffered stream επιτυγχάνετε η κάθε σελίδα του δίσκου να προσπελαστεί μόνο μία φορά και η συνολική πληροφορία της σελίδας να αποθηκευτεί στο ενδιάμεσο buffer. 
 +</WRAP> 
 + 
 +|Προηγούμενο: [[:java:file_io_intro | Είσοδος και έξοδος αρχείων ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:byte_streams_to_data Μετασχηματισμός των ροών δεδομένων σε τύπους δεδομένων]] |
  
java/byte_streams.1583412838.txt.gz · Last modified: 2020/03/05 12:53 by gthanos