| Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
java:file_io_intro [2020/03/06 16:59] gthanos [Είσοδος και Έξοδος του προγράμματος] |
java:file_io_intro [2021/03/29 06:28] |
| ====== Είσοδος και Έξοδος του προγράμματος ====== | |
| |
| Για την ανάγνωση και εγγραφή από εξωτερικές πηγές η 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. | |
| |
| Ανεξάρτητα από το πώς λειτουργούν εσωτερικά, όλα τα streams παρουσιάζουν το ίδιο απλό μοντέλο στα προγράμματα που τα χρησιμοποιούν: | |
| | |
| * Ένα stream είναι μια ακολουθία πληροφορίας (ροή από bytes). | |
| * Ένα πρόγραμμα χρησιμοποιεί ένα //input stream// για να διαβάσει δεδομένα από μια πηγή. | |
| * Ένα πρόγραμμα χρησιμοποιεί ένα //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 κατά την εγγραφή στην πηγή ή μετασχηματίζουν τη ροή από bytes σε ροή χαρακτήρων κατά την ανάγνωση από την πηγή. | |
| |
| Οι κλάσεις στο πακέτο [[https://docs.oracle.com/javase/8/docs/api/java/io/package-frame.html|java.io]] για εγγραφή και ανάγνωση από απομακρυσμένες πηγές συνοψίζονται στις εξής: | |
| |
| | ^ Δυαδικά δεδομένα (ροές bytes) ^^ Δεδομένα κειμένου (ροές χαρακτήρων) ^^ | |
| | ::: ^ 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/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]] | | |
| ^ 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]] | | |
| ^ 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]] | | | | |
| ^ 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]] | | |
| ^ 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]] χρησιμοποιούνται για την επικοινωνία μεταξύ νημάτων εντός της ίδιας διεργασίας. | |
| * Οι κλάσεις [[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 κλπ) πάνω από μία ροή δυαδικής πληροφορίας. Προϋπόθεση για την χρήση των παραπάνω κλάσεων είναι τα δεδομένα να έχουν γράφονται ή να διαβάζονται από τη ροή κατά big-endian. | |
| ===== Είσοδος και έξοδος από την κονσόλα ===== | |
| |
| Προκειμένου να διαβάσετε και να γράψετε από την κονσόλα η Java διαθέτει την κλάση [[http://docs.oracle.com/javase/7/docs/api/java/lang/System.html|System]], η οποία διαθέτει 3 στατικές μεταβλητές τύπου **Stream**. Συγκεκριμένα, διατίθενται τα streams (τύπου [[http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html|PrintStream]]) [[http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#out|System.out]] (STDOUT) και [[http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#err|System.err]] (STDERR) για γράψιμο στην κονσόλα, καθώς και το stream (τύπου [[http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html|InputStream]])[[http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#in|System.in]] (STDIN) για διάβασμα από την κονσόλα. | |
| |
| Στις επόμενες ενότητες θα δούμε παραδείγματα εκτύπωσης και διαβάσματος από την κονσόλα. | |
| |
| |Προηγούμενο: [[java:class_file | Η κλάση File ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:java:byte_streams | Ροές Δεδομένων ]]| | |
| |