Αρχεία Αρχεία και Ρεύματα sequential files(σειριακά αρχεία) direct access(απ'ευθείας πρόσβασης) Ρεύματα (I/O Streams) Ένα ρεύμα είναι μια σειριακή ροή δεδομένων από μία πηγή προς έναν προορισμό. Όταν ένα αρχείο ανοίγει, ένα αντικείμενο δημιουργείται και ένα ρεύμα εισόδου (input stream) συσχετίζεται με αυτό. Για να μεταφέρει δεδομένα ένα πρόγραμμα από ένα αρχείο προς την κεντρική μνήνη, πρέπει να δημιουργήσει ένα ρεύμα εισόδου (inputstream) και να διαβάσει τα δεδομένα. Για να μεταφέρει δεδομένα ένα πρόγραμμα από την κεντρική μνήμη προς ένα αρχείοπρέπει να δημιουργήσει ένα ρεύμα εξόδου (outputstream) και να γράψει τα δεδομένα του. VK 63
ΙΟ Streams Kλάσεις Ανάγνωση Eγγραφή byte(8bit) FileInputStream FileOutputStream char (16bit) FileReader FileWriter int c; int c=70; FileInputStream in = null; FileOutputStream out = null; try { FileReader try { FileWriter in= newfileinputstream("αρχείοa" ); out= newfileoutputstream("αρχείοe"); while ((c = in.read())!=-1) { Κάνε ότι απαιτείται } out.write(c); } finally } finally { if (in!= null) in.close(); } { if (out!= null) out.close(); } Το c=-1 σηματοδοτεί το τέλος του αρχείου VK 64
Βuffered I/O ρεύματα εισόδου Στα προηγούμενα παραδείγματα έγινε χρήση unbuffered I/O ρευμάτων. Τα buffered I/O ρεύματα εισόδου, διαβάζουν δεδομένα από μια περιοχή μνήμης γνωστή ως buffer, ενώ η φυσική API είσοδος, καλείται μόνο όταν το buffer είναι άδειο. Ομοίως, τα buffered I/O ρεύματα εξόδου, γράφουν δεδομένα σε ένα buffer, και η φυσική έξοδος API, καλείται μόνο όταν το buffer είναι πλήρες. Ένα πρόγραμμα μπορεί να μετατρέψει ένα unbuffered I/O ρεύμα, μέσα σε ένα buffered I/O ρεύμα χρησιμοποιώντας το ιδίωμα, όπου το unbuffered I/O ρεύμα περνά στον δομητή του buffered I/O ρεύματος. VK 65
Filtered & BufferedKλάσεις Eνα φίλτρο, φιλτράρει δεδομένα όπως αυτά διαβάζονται ή γράφονται στο ρεύμα. Στην περίπτωση αυτή το ρεύμαφίλτρο, παρέχει επιπλέον λειτουργίες όπως είναι το buffering,η καταμέτρηση γραμμών ή η ομαδοποίηση δεδομένων. FilterInputStream FilterOutputStream BufferedInputStream BufferedOutputStream DataInputStream DataOutputStream BufferedReader InputStreamReader FileReader BufferedWriter OutputStreamWriter FileWriter BufferedReader in = null; String line; try { in= newbufferedreader (newfilereader("αρχείοa")); while ((line = in.readline())!= null) { Κάνε ότι απαιτείται } } finally { if (in!= null) in.close(); } Διαβάζει γραμμές μέχρι το line=null. out= newbufferedwriter (newfilewriter("αρχείοe")); out.write(line); out.newline(); VK 66
Flushing Buffered Streams Συχνά έχει νόημα να γραφτεί ένας bufferσε κρίσιμα σημεία, χωρίς να περιμένουμε για να γεμίσει. Αυτό είναι γνωστό ως flushing the buffer. Μερικές buffered κλάσεις εξόδου, υποστηρίζουν autoflush, που καθορίζεται από μια προαιρετική παράμετρο στο δομητή. Όταν είναι ενεργοποιημένο, ορισμένα γεγονότα, προκαλούν«flush» του buffer. Για παράδειγμα, ένα αντικείμενο autoflush PrintWriter, «εκκενώνει» τον bufferσεκάθεκλήσητουprintlnήτουformat. Stringline=..; PrintWriter out= new PrintWriter(new FileWriter("ΑρχείοE")); out.println(line); VK 67
DataStreams Τα data streams υποστηρίζουν binary I/O για δεδομένα, με τιμές των βασικών τύπων (boolean, char, byte, short, int, long, float, και double) αλλά και με String τιμές. Φροντίζουν στην ουσία για την μετατροπή των δεδoμένων που βρίσκονται σε μορφή Bytes σε δεδομένα που αντιστοιχούν στους βασικούς τύπους. Οι πιο γνωστές υλοποιήσεις είναι η DataInputStream και η DataOutputStream Ενα DataΙnputStream / DataOutputStream μπορεί να δημιουργηθεί μόνο σαν «περιτύλιγμα/wrapper» ενός υπάρχοντος byte stream object, έτσι τα DataStreams παρέχουν ένα buffered file output byte stream. Μέσω της FileInputStream δημιουργείται ένα ρεύμα εισόδου. Η έξοδος του ρεύματος αυτού διοχετεύεται σε έναν buffer (για να αυξήσει την ταχύτητα ροής των δεδομένων καθώς αυτά, δεν τοποθετούνται στο ρεύμα ένα ένα, αλλά κατά ομάδες) που δημιουργείται μέσω της BufferedInputStream. Στη συνέχεια τα δεδομένα του buffer διοχετεύονται σε ένα ρεύμα φίλτρο μετατροπής που δημιουργείται μέσω της DataInputStream. in = new DataInputStream(new BufferedInputStream(new FileInputStream("ΑρχείοE" ))); price = in.readdouble(); unit = in.readint(); desc = in.readutf(); //String τιμές σε φόρμα UTF-8 Χρησιμοποιείται ΕΟF exception αντί για τιμή επιστροφής, δηλ. διαβάζει while (true) out.writedouble(19.99); VK 68