java:byte_streams
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:byte_streams [2020/02/27 20:52] – [Ροές Δυαδικών Δεδομένων] gthanos | java: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:// | + | Για να δείξουμε πώς δουλεύουν τα byte streams, θα ξεκινήσουμε από τις κλάσεις **[[http:// |
==== Χρησιμοποιώντας Byte Streams ==== | ==== Χρησιμοποιώντας Byte Streams ==== | ||
- | Θα εξερευνήσουμε τις κλάσεις FileInputStream και FileOutputStream με χρήση του παρακάτω παραδείγματος // | + | Θα εξερευνήσουμε τις κλάσεις FileInputStream και FileOutputStream με χρήση του παρακάτω παραδείγματος // |
<code java CopyBytes.java> | <code java CopyBytes.java> | ||
Line 14: | Line 15: | ||
public static void main(String[] args) throws IOException { | public static void main(String[] args) throws IOException { | ||
- | | + | |
- | FileOutputStream out = null; | + | |
- | try { | + | try (FileInputStream in = new FileInputStream(filename); |
- | String | + | |
- | if(args.length > 0) | + | |
- | filename = args[0]; | + | |
- | | + | |
- | filename | + | |
| | ||
- | in = new FileInputStream(filename); | ||
- | out = new FileOutputStream(" | ||
int c; | int c; | ||
Line 31: | Line 25: | ||
out.write(c); | out.write(c); | ||
} | } | ||
- | | + | } |
- | if (in != null) { | + | |
- | in.close(); | + | |
- | } | + | |
- | if (out != null) { | + | |
- | out.close(); | + | |
- | } | + | |
- | | + | |
} | } | ||
} | } | ||
</ | </ | ||
- | Η μέθοδος main της κλάσης // | + | Η μέθοδος main της κλάσης // |
- | {{ : | ||
- | <WRAP tip 80% center round> | + | ===== Διαβάζοντας και γράφοντας περισσότερα από ένα bytes ===== |
- | Το κλείσιμο των streams | + | Το παράδειγμα που είδαμε προηγουμένως το πρόγραμμα διαβάζει και γράφει ένα byte κάθε φορά. Παρακάτω θα δούμε το ίδιο πρόγραμμα, μόνο που αυτή τη φορά διαβάζουμε και γράφουμε περισσότερα του ενός bytes σε κάθε εντολή read και write. |
- | Ένα πιθανό σφάλμα είναι ότι το //CopyBytes// __δεν__ μπόρεσε να ανοίξει το ένα ή και τα δύο αρχεία. Σε αυτή την περίπτωση θα παραχθεί ένα //I/O Exception//. Όταν συμβαίνει αυτό, η μεταβλητή που αντιστοιχεί στο stream που απέτυχε να ανοίξει θα έχει την τιμή | + | <code java CopyBytes.java> |
- | </ | + | import java.io.*; |
- | ==== Σε ποιες περιπτώσεις να μην χρησιμοποιείτε τα Byte Streams ==== | + | public class CopyBytes { |
+ | public static void main(String[] args) throws IOException { | ||
- | Είδαμε ότι το παραπάνω πρόγραμμα δουλεύει τόσο με αρχεία κειμένου όσο και με δυαδικά αρχεία. Στις περιπτώσεις που θέλετε να γράψετε δυαδικά αρχεία, | + | String filename = "lena.png"; |
- | ===== Διαβάζοντας και γράφοντας περισσότερα από ένα bytes σε δυαδικό αρχείο | + | try (FileInputStream in = new FileInputStream(filename); |
+ | FileOutputStream out = new FileOutputStream(" | ||
+ | |||
+ | byte []array | ||
+ | int length; | ||
+ | |||
+ | while ((length | ||
+ | System.out.println(length); | ||
+ | out.write(array, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Buffered Streams | ||
- | Το παράδειγμα που είδαμε | + | Στα |
- | Παρακάτω | + | Παρακάτω |
<code java CopyBufferedBytes.java> | <code java CopyBufferedBytes.java> | ||
Line 70: | Line 72: | ||
public static void main(String[] args) throws IOException { | public static void main(String[] args) throws IOException { | ||
- | | + | |
- | BufferedOutputStream out = null; | + | |
- | final int buffer_size = 256; | + | |
- | byte []buffer = new byte[buffer_size]; | + | |
- | try { | + | try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(filename)); |
- | String | + | |
- | if(args.length > 0) | + | |
- | filename = args[0]; | + | |
- | | + | |
- | filename | + | |
| | ||
- | | + | |
- | out = new BufferedOutputStream(new FileOutputStream(" | + | int length; |
- | int size; | + | |
- | while ((size = in.read(buffer, 0, buffer_size)) != -1) { | + | while ((length |
- | out.write(buffer, 0, size); | + | System.out.println(length); |
+ | out.write(array, 0, length); | ||
} | } | ||
- | | + | } |
- | if (in != null) { | + | |
- | in.close(); | + | |
- | } | + | |
- | if (out != null) { | + | |
- | out.close(); | + | |
- | } | + | |
- | | + | |
} | } | ||
} | } | ||
</ | </ | ||
- | |Προηγούμενο: | + | <WRAP tip 80% center round> |
+ | O ρόλος του buffer είναι πάντα η βελτιστοποίηση της απόδοσης κατά την ανάγνωση ή εγγραφή. Για παράδειγμα, | ||
+ | </ | ||
+ | |||
+ | |Προηγούμενο: | ||
java/byte_streams.1582836756.txt.gz · Last modified: 2020/02/27 20:52 by gthanos