Both sides previous revisionPrevious revisionNext revision | Previous revision |
java:file_io_intro [2020/03/06 16:38] – [Είσοδος και Έξοδος του προγράμματος] gthanos | java:file_io_intro [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 |
---|
====== Είσοδος και Έξοδος του προγράμματος ====== | ====== Ροές δεδομένων ====== |
| |
Για την ανάγνωση και εγγραφή από εξωτερικές πηγές η Java χρησιμοποιεί ροές πληροφορίας, οι οποίες ονομάζονται //streams//. Τα //streams// διακρίνονται σε [[https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html|InputStream]] για διάβασμα δεδομένων από μία πηγή και [[https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html|Output Stream]] για εγγραφή δεδομένων σε μία πηγή. Οι πηγές από τις οποίες μπορεί να διαβάσει ή στις οποίες μπορεί να γράψει ένα stream είναι πάρα πολλές. Για παράδειγμα ένα stream ανάγνωσης ή εγγραφής μπορεί να εφαρμοστεί σε αρχείο, σε ένα tcp/ip socket ή ακόμη και σε ένα πίνακα από bytes. | Για την ανάγνωση και εγγραφή από εξωτερικές πηγές η Java χρησιμοποιεί ροές πληροφορίας, οι οποίες ονομάζονται //streams//. Τα //streams// διακρίνονται σε [[https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html|InputStream]] για διάβασμα δεδομένων από μία πηγή και [[https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html|Output Stream]] για εγγραφή δεδομένων σε μία πηγή. Οι πηγές από τις οποίες μπορεί να διαβάσει ή στις οποίες μπορεί να γράψει ένα stream είναι πάρα πολλές. Για παράδειγμα ένα stream ανάγνωσης ή εγγραφής μπορεί να εφαρμοστεί σε αρχείο, σε ένα tcp/ip socket ή ακόμη και σε ένα πίνακα από bytes. |
| |
* Ένα stream είναι μια ακολουθία πληροφορίας (ροή από bytes). | * Ένα stream είναι μια ακολουθία πληροφορίας (ροή από bytes). |
* Ένα πρόγραμμα χρησιμοποιεί ένα //input stream// για να διαβάσει δεδομένα από μια πηγή. | * Ένα πρόγραμμα Java χρησιμοποιεί ένα //input stream// για να διαβάσει δεδομένα από μια πηγή. |
* Ένα πρόγραμμα χρησιμοποιεί ένα //output stream// για να γράψει δεδομένα σε έναν προορισμό. | * Ένα πρόγραμμα Java χρησιμοποιεί ένα //output stream// για να γράψει δεδομένα σε έναν προορισμό. |
| |
Στις περιπτώσεις που θέλουμε να διαβάσουμε συμβολοσειρές (π.χ. αρχεία κειμένου), δηλαδή ροές χαρακτήρων τότε η Java παρέχει τις εξειδικευμένες κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/Reader.html|java.io.Reader]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html|java.io.Writer]] οι οποίες εκτός από το να γράφουν και να διαβάζουν ροές πληροφορίας, κωδικοποιούν τις ροές χαρακτήρων σε ροές δυαδικής πληροφορίας (ροές bytes) και αντίστοφά κατά την εγγραφή ή την ανάγνωση σε/από την απομακρυσμένη πηγή. Μέσω αυτών των κλάσεων απλοποιείται η ανάγνωση και η εγγραφή ροών χαρακτήρων από εξωτερικές πηγές. | Στις περιπτώσεις που θέλουμε να διαβάσουμε ροές χαρακτήρων (π.χ. αρχεία κειμένου), η Java παρέχει τις εξειδικευμένες κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/Reader.html|java.io.Reader]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html|java.io.Writer]] οι οποίες μετασχηματίζουν τη ροή χαρακτήρων σε ροή από bytes κατά την εγγραφή στην πηγή ή μετασχηματίζουν τη ροή από bytes σε ροή χαρακτήρων κατά την ανάγνωση από την πηγή. Οι κλάσεις τύπου [[https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html|java.io.Writer]] επιτρέπουν τη μορφοποιημένη εγγραφή πάνω στη ροή χαρακτήρων (λειτουργικότητα ανάλογη της [[http://www.cplusplus.com/reference/cstdio/printf/|printf]] στη γλώσσα C). |
| |
Οι κλάσεις στο πακέτο [[https://docs.oracle.com/javase/8/docs/api/java/io/package-frame.html|java.io]] για εγγραφή και ανάγνωση από απομακρυσμένες πηγές συνοψίζονται στις εξής: | Οι κλάσεις στο πακέτο [[https://docs.oracle.com/javase/8/docs/api/java/io/package-frame.html|java.io]] για εγγραφή και ανάγνωση από απομακρυσμένες πηγές συνοψίζονται στις εξής: |
| ^ Δυαδικά δεδομένα (ροές bytes) ^^ Δεδομένα κειμένου (ροές χαρακτήρων) ^^ | | ^ Δυαδικά δεδομένα (ροές bytes) ^^ Δεδομένα κειμένου (ροές χαρακτήρων) ^^ |
| ::: ^ Input ^ Output ^ Input ^ Output ^ | | ::: ^ Input ^ Output ^ Input ^ Output ^ |
^ Basic Class | [[https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html|InputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html|OutputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/Reader.html|Reader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html|Writer]] | | ^ Basic Class | [[https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html|InputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html|OutputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/Reader.html|Reader]], [[https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html|InputStreamReader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/Writer.html|Writer]], [[https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamWriter.html|InputStreamWriter]] | |
^ Arrays | [[https://docs.oracle.com/javase/8/docs/api/java/io/ByteArrayInputStream.html|ByteArrayInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/ByteArrayOutputStream.html|ByteArrayOutputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/CharArrayReader.html|CharArrayReader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/CharArrayWriter.html|CharArrayWriter]] | | ^ Arrays | [[https://docs.oracle.com/javase/8/docs/api/java/io/ByteArrayInputStream.html|ByteArrayInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/ByteArrayOutputStream.html|ByteArrayOutputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/CharArrayReader.html|CharArrayReader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/CharArrayWriter.html|CharArrayWriter]] | |
^ Files | [[https://docs.oracle.com/javase/8/docs/api/java/io/FileInputStream.html|FileInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html|FileOutputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/FileReader.html|FileReader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/FileWriter.html|FileWriter]] | | ^ Files | [[https://docs.oracle.com/javase/8/docs/api/java/io/FileInputStream.html|FileInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html|FileOutputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/FileReader.html|FileReader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/FileWriter.html|FileWriter]] | |
^ Pipes | [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedInputStream.html|PipedInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedOutputStream.html|PipedOutputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedReader.html|PipedReader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedWriter.html|PipedWriter]] | | ^ Pipes | [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedInputStream.html|PipedInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedOutputStream.html|PipedOutputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedReader.html|PipedReader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedWriter.html|PipedWriter]] | |
^ Strings | | | [[https://docs.oracle.com/javase/8/docs/api/java/io/StringReader.html|StringReader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/StringWriter.html|StringWriter]] | | ^ Strings | | | [[https://docs.oracle.com/javase/8/docs/api/java/io/StringReader.html|StringReader]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/StringWriter.html|StringWriter]] | |
^ Data (big-endian) | [[https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html|DataInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html|DataOutputStream]] | | | | ^ Basic Data (big-endian format) | [[https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html|DataInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html|DataOutputStream]] | | | |
^ Formatted Data | | [[https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html|PrintStream]] | | [[https://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html|PrintWriter]] | | ^ Formatted Character Data | | [[https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html|PrintStream]] | | [[https://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html|PrintWriter]] | |
^ Objects | [[https://docs.oracle.com/javase/8/docs/api/java/io/ObjectInputStream.html|ObjectInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html|ObjectOutputStream]] | | | | ^ Java Objects | [[https://docs.oracle.com/javase/8/docs/api/java/io/ObjectInputStream.html|ObjectInputStream]] | [[https://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html|ObjectOutputStream]] | | | |
| |
| * Οι κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/ByteArrayInputStream.html|ByteArrayInputStream]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/ByteArrayOutputStream.html|ByteArrayOutputStream]] διαβάζουν και γράφουν δυαδική πληροφορία πάνω σε ένα πίνακα από bytes. Αντίστοιχα οι κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/CharArrayReader.html|CharArrayReader]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/CharArrayWriter.html|CharArrayWriter]] διαβάζουν και γράφουν χαρακτήρες πάνω σε ένα πίνακα χαρακτήρων. |
| * Οι κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/FileInputStream.html|FileInputStream]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html|FileOutputStream]] διαβάζουν και γράφουν δυαδική πληροφορία σε ένα δυαδικό αρχείο. Αντίστοιχα οι κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/FileReader.html|FileReader]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/FileWriter.html|FileWriter]] διαβάζουν και γράφουν χαρακτήρες σε ένα αρχείο κειμένου (αρχείο που περιέχει αποκλειστικά πληροφορία χαρακτήρων). Κατά την ανάγνωση ή εγγραφή με χρήση των κλάσεων [[https://docs.oracle.com/javase/8/docs/api/java/io/FileReader.html|FileReader]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/FileWriter.html|FileWriter]] ΔΕΝ μπορείτε να προσδιορίσετε την κωδικοποίηση των χαρακτήρων που περιέχονται στο αρχείο. Οι κλάσεις αυτές δουλεύουν με την //default// κωδικοποίηση των χαρακτήρων στη Java που είναι UTF-16. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε τις κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamReader.html|InputStreamReader]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/InputStreamWriter.html|InputStreamWriter]], οι οποίες δέχονται ως ορίσματα ένα [[https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html|InputStream]] (**FileInputStream** στη συγκεκριμένη περίπτωση) και μία επιπλέον παράμετρο που αφορά την κωδικοποίηση των χαρακτήρων που περιέχει το αρχείο. |
| * Οι κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedInputStream.html|PipedInputStream]], [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedOutputStream.html|PipedOutputStream]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedReader.html|PipedReader]], [[https://docs.oracle.com/javase/8/docs/api/java/io/PipedWriter.html|PipedWriter]] χρησιμοποιούνται για την επικοινωνία μεταξύ νημάτων εντός της ίδιας διεργασίας (//inter-thread communication//). |
| * Οι κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html|DataInputStream]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/DataOutputStream.html|DataOutputStream]] χρησιμοποιούνται για την ανάγνωση και εγγραφή βασικών τύπων δεδομένων (//short, int, long, float, double, boolean// κλπ) πάνω από μία ροή δυαδικής πληροφορίας. Προϋπόθεση για την χρήση των παραπάνω κλάσεων είναι τα δεδομένα να γράφονται ή να διαβάζονται κατά [[https://www.youtube.com/watch?v=seZLUbgbB7Y|big-endian]]. |
| * Οι κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html|PrintStream]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html|PrintWriter]] χρησιμοποιούνται για την εγγραφή μορφοποιημένης πληροφορίας χαρακτήρων (σε αναλογία με την [[http://www.cplusplus.com/reference/cstdio/printf/|printf]] στη γλώσσα C). Και οι δύο κλάσεις έχουν ανάλογη λειτουργικότητα αν και η λογική με την οποία έχουν υλοποιηθεί είναι διαφορετική. Ενδεικτικά, δείτε το παρακάτω πρόγραμμα και εξετάστε τα αρχεία ''file1.txt'' και ''file2.txt'' με ένα //hex editor//. |
| |
| <code java PrintStreamVsPrintWriter.java> |
| import java.io.*; |
| |
| public class PrintStreamVsPrintWriter { |
| public static void main(String []args) { |
| try(PrintStream st = new PrintStream(new File("file1.txt")); |
| PrintWriter wr = new PrintWriter(new File("file2.txt")) |
| ) { |
| st.print("Πως είσαι;"); |
| st.print(1.2345); |
| wr.print("Πως είσαι;"); |
| wr.print(1.2345); |
| } |
| catch(IOException ex) { |
| } |
| } |
| } |
| </code> |
| |
| * Οι κλάσεις [[https://docs.oracle.com/javase/8/docs/api/java/io/ObjectInputStream.html|ObjectInputStream]] και [[https://docs.oracle.com/javase/8/docs/api/java/io/ObjectOutputStream.html|ObjectOutputStream]] υλοποιούν τη [[java:object_serialization|σειριοποίηση αντικειμένων]] ώστε αυτά να αποθηκευτούν σε αρχεία ή να αποσταλούν σε απομακρυσμένους προορισμούς (συνήθως μέσω sockets). Τα αντικείμενα, αφού ανακτηθούν στο προορισμό τους μπορούν να είναι λειτουργικά από το πρόγραμμα προορισμού. |
| |
| |
Στις επόμενες ενότητες θα δούμε παραδείγματα εκτύπωσης και διαβάσματος από την κονσόλα. | Στις επόμενες ενότητες θα δούμε παραδείγματα εκτύπωσης και διαβάσματος από την κονσόλα. |
| |
|Προηγούμενο: [[java:class_file | Η κλάση File ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:byte_streams | Ροές Δεδομένων ]]| | |Προηγούμενο: [[java:class_file | Η κλάση File ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:byte_streams | Ροές δυαδικών δεδομένων ]]| |
| |