User Tools

Site Tools


java:file_io_intro

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:file_io_intro [2020/03/09 05:09] – [Είσοδος και έξοδος από την κονσόλα] gthanosjava:file_io_intro [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 6: Line 6:
    
   * Ένα 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 κατά την εγγραφή στην πηγή ή μετασχηματίζουν τη ροή από 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]] για εγγραφή και ανάγνωση από απομακρυσμένες πηγές συνοψίζονται στις εξής:
Line 25: Line 25:
  
   * Οι κλάσεις [[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/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/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/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/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//.+  * Οι κλάσεις [[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> <code java PrintStreamVsPrintWriter.java>
Line 49: Line 49:
 </code> </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). Τα αντικείμενα, αφού να ανακτυθούν στο προορισμό τους μπορούν να είναι λειτουργικά στο πρόγραμμα προορισμού.+  * Οι κλάσεις [[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/file_io_intro.1583730551.txt.gz · Last modified: 2020/03/09 05:09 (external edit)