Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 11 : ΑΡΧΕΙΑ ΚΑΙ ΧΕΙΡΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ

Σχετικά έγγραφα
ΕΙΣΟ ΟΣ-ΕΞΟ ΟΣ Ε ΟΜΕΝΩΝ

ΕΙΣΟ ΟΣ-ΕΞΟ ΟΣ Ε ΟΜΕΝΩΝ

Οντοκεντρικός Προγραμματισμός ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

Αρχεία και Ρεύματα. Αρχεία

Οντοκεντρικός Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Προγραμματισμός Διαδικτύου

Τ.Ε.Ι. Μεσολογγίου, Τµήµα τηλεπικοινωνιακών Συστημάτων & Δικτύων

Προγραµµατισµός ΙΙ Java 2

Διαδικτυακές Εφαρμογές Ενότητα 4: Streams

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 12: Ροές και είσοδος/έξοδος αρχείων

Είσοδος & Έξοδος. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

10.1 Γενικά για τα streams

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αρχεία

Προγραµµατισµός ΙΙ Java 2

Στοιχεία εξεταζόµενου Αριθµός Απάντησης Βαθµολογία. Σύνολο (Θέµα 4 ο )

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #16

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

14. Δικτύωση με Java Δικτύωση με Java Sockets Δημιουργία της σύνδεσης Διευθυνσιοδότηση της σύνδεσης

Οντοκεντρικόσ Ρρογραμματιςμόσ

Εισαγωγή στον Προγραμματισμό

Συντακτικά λάθη, λάθη εκτέλεσης, Λογικά λάθη

Week 9: Input / Output

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

NATIONAL & KAPODISTRIAN UNIVERSITY OF ATHENS. Διαχείριση Δικτύων. Nikolas Bompetsis

Εργασία Μαθήματος Αξία: 40% του τελικού σας βαθμού Ανάθεση: Παράδοση:

ΕΞΑΙΡΕΣΕΙΣ. Εξαιρέσεις προκαλούνται. από το σύστηµα. από το πρόγραµµα

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Είσοδος Έξοδος (Input Output) Εξαιρέσεις (Exceptions)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

1 ΕΙΣΑΓΩΓΗ. Πρωταρχικοί Τύποι

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστραφής Προγραμματισμός

Εισαγωγή βιβλιοθηκών import java.applet.applet; import java.awt.graphics; ή import java.*.*

Αντικειµενοστρεφής Προγραµµατισµός

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 9 : ΕΞΑΙΡΕΣΕΙΣ ΚΑΙ Ο ΧΕΙΡΙΣΜΟΣ ΤΟΥΣ

Κατανεμημένα Συστήματα

Κλάσεις και Αντικείµενα

Προγραμματισμός ΙΙ (Java) 4. Διαχείριση εξαιρέσεων

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Λειτουργικά Συστήματα (Λ/Σ)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Streams Input / Output in C++ George Kastrinis

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

S, (5, -3, 34, -23, 7) ( *, _

ΚΑΤΑΝΕΜΗΜΕΝΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΣΥΣΚΕΥΩΝ ΑΣΗΜΑΚΟΠΟΥΛΟΣ ΣΩΤΗΡΗΣ ΑΜ : 3021

ιαδικτυακές Εφαρµογές

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός

Μάθημα 2 [10/11/2015]

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

2. Προσδιοριστές, δεσμευμένες λέξεις και τύποι

ιαδικτυακές Εφαρµογές Πραγµατικού Χρόνου µε Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

Γενικά (για τις γραπτές εξετάσεις)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Προγραμματισμός ΙΙ (Java) 5. Διαχείριση αρχείων

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Χωρική Βάση δεδοµένων Autocad

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις Αρχεία String processing

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

ΑΝΑΚΕΦΑΛΑΙΩΣΗ. Τα βασικά για την γλώσσα Java

Βιβλιοθήκη stdio. Προγραμματισμός II 1

Εκτέλεση εξωτερικών προγραμμάτων και εντολών The Java Reflection - Αρχικοποίηση (Initialization)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Αντικείμενα στη Java. Παύλος Εφραιμίδης. Java Αντικείμενα στη Java 1

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Αντικείμενα (Objects) στην Java. Αντικείμενα στη Java. Δημιουργία Αντικειμένων. Δηλώσεις Μεταβλητών (2) Ο τελεστής new (1)

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΣΤΗ JAVA ΤΕΛΕΣΤΕΣ - ΜΕΤΑΒΛΗΤΕΣ

Εργαστήριο ΔΙΑΧΕΙΡΙΣΗ ΑΡΧΕΙΩΝ & ΚΑΤΑΛΟΓΩΝ ΣΤΟ UNIX. Εισαγωγή

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Διαχείριση Περιεχομένου Παγκόσμιου Ιστού και Γλωσσικά Εργαλεία ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ FILE & PROCESS HANDLING

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

Transcript:

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 11 : ΑΡΧΕΙΑ ΚΑΙ ΧΕΙΡΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ

Κατηγορίες Διαχείριση αρχείων Η κλάση File για τη διαχείριση αρχείων Δυαδικά ρεύματα Εγγραφή και ανάγνωση δυαδικών αρχείων Αρχεία Χαρακτήρων Εγγραφή και ανάγνωση σε/από αρχεία χαρακτήρων Serializable αρχεία Εγγραφή και ανάγνωση σε/από Serializable αρχεία

Διαχείριση Αρχείων Το πακέτο java.io περιέχει πολλές κλάσεις που βοηθούν τον προγραμματιστή σε διεργασίες σχετικές με την είσοδο/έξοδο (Ι/Ο). Οι λειτουργίες (Ι/Ο) στη Java γίνονται με τη χρήση ρευμάτων (streams) έτσι ώστε κάθε ρεύμα να προσφέρει σειριακή πρόσβαση στα δεδομένα. Τα ρεύματα χωρίζονται σε δύο βασικές κατηγορίες, σε δυαδικά ρεύματα (binary streams) και σε ρεύματα χαρακτήρων (character streams). Επίσης, ανάλογα με την κατεύθυνσή του ένα ρεύμα μπορεί να είναι ρεύμα εισόδου (input stream) ή ρεύμα εξόδου (output stream). Το πρώτο μπορεί να διαβάσει μία ακολουθία δεδομένων ενώ το δεύτερο να γράψει μία ακολουθία δεδομένων.

Οντότητες που μπορούν να χρησιμοποιηθούν ως ρεύματα εισόδου ή ως ρεύματα εξόδου Ένα αρχείο Ένας πίνακας χαρακτήρων ή πίνακας τύπου byte Ένα pipe, το οποίο αποτελεί μηχανισμό επικοινωνίας δεδομένων μεταξύ προγραμμάτων Μία δικτυακή σύνδεση

Η κλάση File Μία από τις βασικότερες κλάσεις του πακέτου java.io είναι η File που παρέχει έναν μηχανισμό που αναπαριστά το υποκείμενο σύστημα αρχείων (file system). Άρα αντικείμενα της κλάσης File δουλεύουν και σε Windows και σε Linux Ένα αντικείμενο τύπου File αναπαριστά τη διαδρομή (path) ενός αρχείου ή φακέλου στο υποκείμενο σύστημα. Η συγκεκριμένη κλάση δηλαδή μπορεί να χρησιμοποιηθεί από μία εφαρμογή για την διαχείριση των φυσικών αρχείων, όχι όμως των περιεχομένων τους. Η κλάση File παρέχει σταθερές και μεθόδους που βοηθούν τη διαχείριση αρχείων σε διαφορετικές πλατφόρμες, δίνοντας έναν κοινό μηχανισμό διαχείρισης για όλες τις πλατφόρμες. Τα διαφορετικά σύμβολα που χρησιμοποιούνται για την αναπαράσταση διαδρομών στο file system (π.χ. :, \, /) κάθε ενός εκ των δημοφιλέστερων λειτουργικών συστημάτων αποθηκεύεται στην κλάση με τη μορφή μιας σταθεράς.

Μέθοδοι της κλάσης File Πληροφορίες για αρχεία/φακέλους getname() getabsolutepath() getparent() list() lastmodified() isfile() getpath() Διαχείριση δικαιωμάτων setreadable(boolean), setwritable(boolean), setexecutable(boolean) SecurityException() αν το δικαίωμα δε μπορεί να αλλάξει canwrite(), canread(), canexecute(): getcanonicalpath() isabsolute() listfiles() length() isdirectory() Δημιουργία μετονομασία και διαγραφή αρχείων createnewfile() renameto(file) mkdir() delete()

Παράδειγμα χρήσης της κλάσης File (1/2) import java.io.file; import java.io.ioexception; public class DirectoryListing { public static void main(string[] args) { if(args.length == 0) System.err.println("Please specify a directory name"); else { File entry = new File(args[0]); listdirectory(entry);

Παράδειγμα χρήσης της κλάσης File (2/2) public static void listdirectory(file dir){ try { if(!dir.exists() dir.isfile()) System.out.println("Directory " + dir.getname() + " not found"); else { String[] structure = dir.list(); File curfile = null; for (String name : structure){ curfile = new File(dir.getPath(), name); System.out.println(curFile.getCanonicalPath()); catch(ioexception e){ e.printstacktrace();

Δυαδικά Ρεύματα (Byte Streams) (1/4) Οι αφηρημένες κλάσεις InputStream και OutputStream είναι οι βασικές που χειρίζονται την ανάγνωση και την εγγραφή bytes σε δυαδικά ρεύματα (binary ή byte streams), ορίζοντας τη βασική συμπεριφορά όλων των κλάσεων αυτών. Η κλάση InputStream αναπαριστά ένα δυαδικό ρεύμα εισόδου και βασική της μέθοδος είναι η read(), που υπάρχει σε 3 εκδόσεις. 1. int read() throws IOException 2. int read(byte[] b) throws IOException 3. int read(byte[] b, int off, int len) throws IOException Η μέθοδος αυτή διαβάζει bytes από ένα ρεύμα και τα επιστρέφει με τη μορφή int, με την τιμή του byte που διαβάστηκε να βρίσκεται στα 8 λιγότερο σημαντικά bits του int που επιστρέφεται. Όταν η read() φτάσει στο τέλος του ρεύματος θα επιστρέψει την τιμή -1.

Δυαδικά Ρεύματα (Byte Streams) (2/4) Η κλάση OutputStream με τη σειρά της αναπαριστά ένα δυαδικό ρεύμα εξόδου και βασική της μέθοδος είναι η write() που επίσης διατίθεται σε τρεις εκδόσεις. 1. void write(int b) throws IOException 2. void write(byte[] b) throws IOException 3. void write(byte[] b, int off, int len) throws IOException Η πρώτη έκδοση λαμβάνει ως παράμετρο ένα int του οποίου όμως διαβάζει τα 8 λιγότερο σημαντικά bits τα οποία και γράφει ως byte. Ένα ρεύμα θα πρέπει να κλείσει όταν δεν το χρειαζόμαστε άλλο και έτσι και οι δύο κλάσεις (InputStream, OutputStream)υποστηρίζουν τις μεθόδους close() και flush(). Η μεν πρώτη κλείνει το ρεύμα, ενώ η flush() αδειάζει όλα τα περιεχόμενά του. Κλείνοντας ένα ρεύμα με την close() ταυτόχρονα αδειάζει και το ρεύμα.

Δυαδικά Ρεύματα (Byte Streams) (3/4) Οι συμπαγείς κλάσεις που κληρονομούν από την InputStream είναι οι ακόλουθες: FileInputStream: Διαβάζει δεδομένα με τη μορφή bytes από ένα αρχείο. FilterInputStream: Προσφέρει εξειδικευμένες λειτουργίες για την ανάγνωση δεδομένων από ένα ρεύμα, συνήθως μέσω της υποκλάσης της BufferedInputStream. DataInputStream: Διαβάζει δυαδικές αναπαραστάσεις βασικών τύπων δεδομένων από ένα ρεύμα εισόδου. ObjectInputStream: Διαβάζει δυαδικές αναπαραστάσεις αντικειμένων Java και βασικών τύπων από ένα δυαδικό ρεύμα.

Δυαδικά Ρεύματα (Byte Streams) (4/4) Οι συμπαγείς κλάσεις που κληρονομούν από την OutputStream είναι οι εξής: FileOutputStream: Γράφει δεδομένα με τη μορφή bytes σε ένα αρχείο. FilterOutputStream: Προσφέρει εξειδικευμένες λειτουργίες για την εγγραφή δεδομένων από ένα ρεύμα, συνήθως μέσω της υποκλάσης της BufferedOutputStream. DataOutputStream: Γράφει δυαδικές αναπαραστάσεις βασικών τύπων δεδομένων σε ένα ρεύμα εξόδου. ObjectOutputStream: Γράφει δυαδικές αναπαραστάσεις αντικειμένων Java και βασικών τύπων σε ένα δυαδικό ρεύμα.

Διαδικασία εγγραφής σε binary αρχείο Για να γράψουμε δεδομένα βασικών τύπων σαν bytes σε ένα binary αρχείο εκτελούμε τη διαδικασία που αποτελείται από τα εξής βήματα: Δημιουργούμε ένα αντικείμενο τύπου FileOutputStream, π.χ. FileOutputStream outfile = new FileOutputStream("binary.dat"); Δημιουργούμε ένα αντικείμενο τύπου DataOutputStream και το συνδέουμε με το FileOutputStream του πρώτου βήματος: DataOutputStream outputstream = new DataOutputStream(outFile); Καλούμε τις κατάλληλες write ( ) μεθόδους της κλάσης DataOutputStream, ανάλογα με τον τύπο που θέλουμε να γράψουμε, π.χ. outputstream.writeint(3523); Κλείνουμε το ρεύμα όταν δεν το χρειαζόμαστε άλλο: outputstream.close();

Διαδικασία ανάγνωσης από binary αρχείο Για την ανάγνωση δεδομένων βασικών τύπων από ένα binary αρχείο χρησιμοποιούμε τα ίδια ακριβώς βήματα με τη διαφορά πως χρησιμοποιούμε τις αντίστοιχες κλάσεις ρευμάτων εισόδου, δηλαδή την κλάση FileInputStream αντί της FileOuputStream και την DataInputStream αντί της DataOutputStream και φυσικά χρησιμοποιούμε τις αντίστοιχες μεθόδους ανάγνωσης π.χ. readint(), readboolean() κλπ. Θα δούμε παραδείγματα κώδικα εγγραφής και ανάγνωσης σε/από binary αρχεία

Ανάγνωση και εγγραφή από/σε binary αρχείο- Παράδειγμα (1/2) import java.io.*; class ByteBinaryFiles public static void main(string[] args) { II Write a byte to disk try { FileOutputStrearn f =new FileOutputStream ("mytextfile.dat"); BufferedOutputStream b = new BufferedOutputStream(f); int data = 20; b.write(data); b.close(); catch(ioexception e) { Συνεχίζεται..

Ανάγνωση και εγγραφή από/σε binary αρχείο- Παράδειγμα (2/2) System.out.println(e.getMessage()); II Read the byte from disk try { FileinputStream f =new FileinputStream ("mytextfile.dat"); BufferedinputStream b = new BufferedinputStream(f); int data = b.read (); System.out.println(data); b.close(); catch(ioexception e) { System.out.println(e.getMessage());

Δυαδικά Αρχεία που δεν περιέχουν ΜΟΝΟ bytes δεδομένων Σε δυαδικά αρχεία μπορούμε να αποθηκεύσουμε διάφορους τύπους δεδομένων (π.χ. int, float, double, char) εκτός από bytes. Η διαδικασία είναι παρόμοια με την προηγούμενη μόνο που χρειάζεται να χρησιμοποιήσουμε επιπλέον τα αντικείμενα DataOutputStream και DataInputStream διότι έχουν τις κατάλληλες μεθόδους (π.χ. writeint, readint, writedouble, readdouble) Το τέλος του αρχείου μπορούμε να το εντοπίσουμε με τη χρήση της εξαίρεσης EOFException Στο παρακάτω παράδειγμα η ανάγνωση του δυαδικού αρχείου γίνεται σε loop και δεν σταματά μέχρι να φθάσουμε στο τέλος οπότε γίνεται throw το EOFException

Δυαδικά Αρχεία που δεν περιέχουν ΜΟΝΟ bytes δεδομένων- Παράδειγμα (1/2) import java.io.*; import java.util.random; class BinaryFilesNotOnlyByte { public static void main(string[] args) { Random generator = new Random() ; // Write a set of random numbers to disk try { FileOutputStream f = new FileOutputStream("myFile.dat"); BufferedOutputStream b =new BufferedOutputStream(f); DataOutputStream d =new DataOutputStream(b); for(int i=0; i<100; i++) { double datadouble =generator.nextdouble (); d.writedouble(datadouble); d.close(); catch(ioexception e){ System.out.println(e.getMessage());

Δυαδικά Αρχεία που δεν περιέχουν ΜΟΝΟ bytes δεδομένων- Παράδειγμα (2/2) II Read the saved set of numbers from disk try { FileinputStream f = new FileinputStream("myFil.e.dat"); BufferedinputStream b = new BufferedinputStream(f); DatainputStream d = new DatainputStream(b); II Nested try-catch detecting end of file try { int c = 1; for (;;) { II Infinite loop double datadouble; datadoubl.e = d.readdouble(); System.out.println(c + + datadouble); c++; catch (EOFException eof) { d.cl.ose(); catch(ioexception e) { System.out.println (e.getmessage());

Ρεύματα Χαρακτήρων (Character Streams) Για τα ρεύματα χαρακτήρων (character streams) οι αφηρημένες κλάσεις Reader και Writer ορίζουν τη βασική συμπεριφορά για την ανάγνωση και εγγραφή χαρακτήρων συγκεκριμένης κωδικοποίησης (encoding) από και προς ένα ρεύμα εισόδου ή εξόδου αντίστοιχα. Η εξ ορισμού κωδικοποίηση που χρησιμοποιείται είναι η Unicode. Παρέχουν αντίστοιχες μεθόδους με αυτές των κλάσεων που χειρίζονται τα binary streams, δηλαδή την read(), την write(), την flush() και την close(), ενώ η Reader υποστηρίζει μία επιπλέον μέθοδο, τη skip(long) που παραλείπει τόσους χαρακτήρες όσους ορίζει η παράμετρος τύπου long που λαμβάνει.

Ρεύματα Χαρακτήρων (Character Streams) Κληρονομικότητα της Reader Οι συμπαγείς κλάσεις που κληρονομούν από την Reader είναι οι εξής: BufferedReader: Κλάση που μπορεί να χρησιμοποιηθεί για την ανάγνωση χαρακτήρων από τον υποκείμενο reader (π.χ. InputStreamReader) κάνοντας χρήση buffer. Στο παράδειγμα που θα δείτε παρακάτω γίνεται χρήση ενός buffered reader. InputStreamReader: Διαβάζει χαρακτήρες από ένα δυαδικό ρεύμα εισόδου χρησιμοποιώντας την default κωδικοποίηση. FileReader: Διαβάζει χαρακτήρες από ένα αρχείο χρησιμοποιώντας την default κωδικοποίηση.

Ρεύματα Χαρακτήρων (Character Streams) Κληρονομικότητα της Writer Οι συμπαγείς κλάσεις που κληρονομούν από την Writer είναι οι: BufferedWriter: Κλάση που εκτελεί εγγραφή χαρακτήρων (π.χ. OutputStreamWriter) μέσω buffer. OutputStreamWriter: Γράφει χαρακτήρες σε ένα binary stream με default κωδικοποίηση. FileWriter: Γράφει χαρακτήρες σε ένα αρχείο χρησιμοποιώντας την default κωδικοποίηση. PrintWriter: Μία κλάση που επιτρέπει την εγγραφή βασικών τύπων αλλά και αντικειμένων υπό μορφή κειμένου σε ένα υποκείμενο ρεύμα εξόδου ή έναν writer. Η PrintWriter είναι χρήσιμη: Παρέχει 2 υπερφορτωμένες μεθόδους, τις print(x) και println(x) οι οποίες γράφουν με τη μορφή κειμένου στην έξοδο την παράμετρο X

Ρεύματα Χαρακτήρων (Character Streams) Παράδειγμα Writing import java.io.*; class WriteTextFile { public static void main(string[ ] args) { try { FileWriter f = new FileWriter("myTextFile.txt"); BufferedWriter b = new BufferedWriter(f); b.write("this file was written by my class."); b.close(); catch(ioexception e) { System.out.println (e.getmessage());

Ρεύματα Χαρακτήρων (Character Streams) Παράδειγμα Reading import java.io.*; class ReadTextFile { public static void main(string[ ] args) { try { FileReader f = new FileReader( mytextfile.txt"); BufferedReader b = new BufferedReader(f); String s = ""; while(s!= null) { s = b.readline(); System.out.println (s); b.close(); catch(ioexception e) { System.out.println(e.getMessage());

Μπορούμε να γράψουμε αντικείμενα σε αρχεία? Για να μπορεί ένα αντικείμενο μίας κλάσης να γράφεται σε αρχείο, πρέπει αυτή η κλάση να υλοποιεί το Interface Serializable Η διεπαφή αυτή υπάρχει στο πακέτο java.io και ο ρόλος της είναι απλά για να υποδεικνύει ότι ένα αντικείμενο που υλοποιεί τη διεπαφή αυτή μπορεί να εγγραφεί σε αρχείο. ΠΑΡΑΔΕΙΓΜΑ import java.io.serializable; public class Date implements Serializable { int day, month, year; public Date(int d, int m, int y) { day = d; month = m; year = y; public String tostring () { return day + "/" + month + "/" + year;

Serialization (1/4) Με τον όρο αυτόν αναφερόμαστε στη διαδικασία μετατροπής ενός αντικειμένου σε μία ακολουθία από bytes ώστε να μπορεί να γραφτεί σε ένα αρχείο ή μία δικτυακή σύνδεση. Η αντίστροφη διαδικασία, δηλαδή η επανασύνθεση του αντικειμένου ονομάζεται deserialization. Έτσι λοιπόν, στην περίπτωση που έχουμε ένα αρχείο, το deserialization περιλαμβάνει την επανασύνθεση του αντικειμένου από την ανάγνωση των δεδομένων του αρχείου, ενώ στην περίπτωση που έχουμε μία δικτυακή σύνδεση το deserialization θα αφορούσε στην επανασύνθεση του αντικειμένου διαβάζοντας τα δεδομένα που καταφθάνουν με τη μορφή bytes στο άλλο άκρο της σύνδεσης.

Serialization (2/4) Το serialization χρησιμοποιείται από όλα σχεδόν τα προγράμματα κατά την αποθήκευση δεδομένων στον σκληρό δίσκο. Η κατάσταση που βρίσκεται το πρόγραμμα μία δεδομένη χρονική στιγμή μπορεί να αποθηκευτεί και σε μεταγενέστερο χρόνο διαβάζοντας τα συγκεκριμένα δεδομένα από το αποθηκευτικό μέσο και επανασυνθέτοντας τα ίδια ακριβώς αντικείμενα να επανέλθει στην ίδια κατάσταση που βρισκόταν κατά τη στιγμή της αποθήκευσης. Οι κλάσεις ObjectOutputStream ΚΑΙ ObjectInputStream (τις είδαμε όταν μιλούσαμε για τα δυαδικά ρεύματα) παρέχουν τις απαραίτητες διευκολύνσεις στους προγραμματιστές που επιθυμούν να χρησιμοποιήσουν serialization στον κώδικά τους

Serialization (3/4) Η κλάση ObjectOutputStream παρέχει μεθόδους για την εγγραφή τόσο βασικών τύπων όσο και αντικειμένων με τη μορφή δυαδικής αναπαράστασης σε ένα ρεύμα εξόδου. Διαθέτει για κάθε βασικό τύπο μία μέθοδο της μορφής writex(x), π.χ. writeboolean(boolean), writechar(char) κλπ και για τα αντικείμενα τη μέθοδο writeobject(object). H ObjectInputStream παρέχει τις αντίστοιχες μεθόδους για ανάγνωση τόσο βασικών τύπων όσο και αντικειμένων με τη μορφή δυαδικής αναπαράστασης από ένα ρεύμα εισόδου. Οι μέθοδοι αυτές έχουν για τους βασικούς τύπους τη μορφή readx(), π.χ. readint(), readbyte() κλπ ενώ για τα αντικείμενα υπάρχει η μέθοδος readobject().

Serialization (4/4)

Διαδικασία εγγραφής δεδομένων σε αρχείο με Serialization Για την αποθήκευση δεδομένων σε ένα binary αρχείο συνεργάζονται οι κλάσεις FileOutputStream και ObjectOutputStream. Δημιουργούμε τα αντίστοιχα αντικείμενα και τα συνδέουμε μεταξύ τους σύμφωνα με τον παρακάτω κώδικα: FileOutputStream outfile = new FileOutputStream("data.dat"); ObjectOutputStream os = new ObjectOutputStream(outFile); Στη συνέχεια θα μπορούσαμε να καλέσουμε τις μεθόδους της ObjectOutputStream μέσω του os για να αποθηκεύσουμε δεδομένα στο αρχείο, είτε βασικούς τύπους είτε αντικείμενα, π.χ. os.writeboolean(true); os.writeobject(myobject);

Διαδικασία ανάγνωσης δεδομένων από αρχείο με Serialization Η διαδικασία ανάγνωσης δεδομένων είναι πανομοιότυπη, με τη διαφορά πως εδώ χρησιμοποιούνται οι κλάσεις FileInputStream και ObjectInputStream και οι μέθοδοι readx(), π.χ.: FileInputStream infile =new FileInputStream("data.dat"); ObjectInputStream is =new ObjectInputStream(inFile); boolean b = is.readboolean(); Για να μπορεί μια οποιαδήποτε δική μας κλάση να γίνει serialized, βασική προϋπόθεση είναι να υλοποιεί το interface Serializable. Έχοντας μία κλάση που υλοποιεί το Serializable interface, μπορεί να γίνει εύκολα serialized κάνοντας χρήση της μεθόδου writeobject() της ObjectOutputStream.

Παράδειγμα εγγραφής/ανάγνωσης σε αρχείο με Serialization import java.io.*; public class ObjectFileDemo { public static void main(string[ ] args) { try { ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream("TestObjectFile.dat")); Date d = new Date(3,2,2014); oos.writeobject(d); oos.close(); catch (IOException e) { System.out.println (e); try { ObjectinputStream oos = new ObjectinputStream ( new FileinputStream("TestObjectFile.dat")); Date d; d = (Date)oos.readObject(); System.out.println (d); oos.close(); catch (Exception e) { System.out.println(e);