Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Είσοδος/Έξοδος σε αρχεία. Ρεύµατα - Streams

Σχετικά έγγραφα
Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

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

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

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

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

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

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

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιαχείριση Εξαιρέσεων. Εισαγωγή στη ιαχείριση Εξαιρέσεων

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

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

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

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συλλογές και Επαναλήπτες. Συλλογές - Collections

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

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

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

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

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

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

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

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

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

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

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

Εργαστήριο 9: Αρχεία

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

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

Επεξεργασία Αρχείων Κειµένου

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

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

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Λειτουργικό Σύστημα: διαχείριση πόρων. Τι είναι ένα αρχείο ; Διαχείριση αρχείων. Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Week 9: Input / Output

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

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

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

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

Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

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

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

HelloWorld. Παύλος Εφραιμίδης. Java Το πρόγραμμα HelloWorld 1

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

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

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

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

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

scanf() scanf() stdin scanf() printf() int float double %lf float

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

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

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

Streams Input / Output in C++ George Kastrinis

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αρχεία Επεξεργασία αλφαριθμητικών

Προγραμματισμός Η/Υ. Χειρισμός Αρχείων. ΤΕΙ Ιονίων Νήσων Τμήμα Τεχνολόγων Περιβάλλοντος Κατεύθυνση Τεχνολογιών Φυσικού Περιβάλλοντος

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

Λειτουργικό Σύστημα: διαχείριση πόρων. Διαχείριση αρχείων. Τι είναι ένα αρχείο ; Λειτουργικά Συστήματα (ΙΙ) (διαχείριση αρχείων)

Αρχεία Ένα αρχείο αποτελείται από μία σειρά ομοειδών δεδομένων που ονομάζονται λογικές εγγραφές (logical record)

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

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

ΕΠΕΞΕΡΓΑΣΙΑ ΑΡΧΕΙΩΝ Λέµε αρχείο

Προγραµµατιστικές Τεχνικές

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 5 - Editor

Μεθόδων Επίλυσης Προβλημάτων

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιεπαφές και Εσωτερικές κλάσεις Interfaces and Inner Classes. ιεπαφές - Interfaces

Εξαιρέσεις. try, catch, finally, throw, throws

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

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

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor

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

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

Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με τη Java

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Σύστηµα Αρχείων και Καταλόγων

File Handling & I/O ΓΛΩΣΣΙΚΉ ΤΕΧΝΟΛΟΓΊΑ

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αρχεία String processing Παράδειγμα

Μετατροπή χαρακτήρων ASCII σε ακέραιο αριθµό (atoi) & Άνοιγµα αρχείου µέσα από τo QtSPIM, διάβασµα, και αποθήκευση του περιεχοµένου του στη µνήµη

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

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

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

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

Java Μέρος Ι Αντικειμενοστρεφής Προγραμματισμός - 7

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

Κεφάλαιο VΙ: Προσπέλαση Αρχείων. 5.1 Αρχεία δεδομένων.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αρχεία Επεξεργασία αλφαριθμητικών

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

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

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

Transcript:

Προγραµµατισµός ΙΙ Ηγλώσσααντικειµενοστραφούς προγραµµατισµού Java ιδάσκων ηµήτριος Κατσαρός, Ph.D. @ Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας ιάλεξη 7η: 12/04/2006 & 13/04/2006 1 Είσοδος/Έξοδος σε αρχεία File I/O 2 Ρεύµατα - Streams Ένα ρεύµα (stream) είναι ένα αντικείµενο το οποίο επιτρέπει τη ροή δεδοµένων µεταξύ ενός προγράµµατος και κάποιας συσκευής εισόδου/εξόδου ή αρχείου Εάν τα δεδοµένα ρέουν προς το πρόγραµµα, τότε το ρεύµα λέγεται ρεύµα εισόδου (input stream) Εάν τα δεδοµέναρέουναπότοπρόγραµµα, τότε το ρεύµα λέγεται ρεύµα εξόδου(output stream) 3 1

Ρεύµατα - Streams Τα ρεύµατα εισόδου µπορεί να ρέουν από το πληκτρολόγιο ή από κάποιο αρχείο System.in είναι ένα ρεύµα εισόδου που συνδέεται στο πληκτρολόγιο Scanner keyboard = new Scanner(System.in); Τα ρεύµατα εξόδου µπορεί να ρέουν προς την οθόνη ή προς κάποιο αρχείο System.out είναι ένα ρεύµα εξόδουπουσυνδέεται στην οθόνη System.out.println("Output stream"); 4 Αρχεία κειµένου και υαδικά αρχεία Τα αρχεία που σχεδιάζονται για ανάγνωση από ανθρώπους, και µπορούν να διαβαστούν ή να γραφούν µεένανσυντάκτηκειµένου (editor) αποκαλούνται αρχεία κειµένου (text files) Τα αρχεία κειµένου αποκαλούνται επίσης ASCII αρχεία, επειδή τα δεδοµένα που περιέχουν είναι κωδικοποιηµένα µε ASCII σχήµα κωδικοποίησης Ένα πλεονέκτηµα τωναρχείωνκειµένου είναι ότι συνήθως είναι τα ίδια σε όλους τους υπολογιστές, και έτσι µπορούν να τα µετακινούµε από υπολογιστή σε υπολογιστή χωρίς προβλήµατα συµβατότητας 5 Αρχεία κειµένου και υαδικά αρχεία Τα αρχεία που σχεδιάζονται προς ανάγνωση από προγράµµατα και αποτελούνται από ακολουθίες δυαδικώνψηφίωναποκαλούνταιδυαδικά αρχεία (binary files) Ταδυαδικάαρχείασχεδιάζονταινααναγνωστούναπό τον ίδιο τύπο υπολογιστή και την ίδια γλώσσα προγραµµατισµού µε την οποία δηµιουργήθηκε το αρχείο Ένα πλεονέκτηµα των δυαδικών αρχείων είναι ότι παρέχουν πιο αποδοτικό τρόπο επεξεργασίας από ότι τα αρχεία κειµένου ιαφορετικά από ότι στα περισσότερα δυαδικά αρχεία, τα δυαδικά αρχεία στη Java έχουν επιπλέον το πλεονέκτηµα ότι είναι ανεξάρτητα από την πλατφόρµα όπου δηµιουργήθηκαν 6 2

Γράφοντας σε ένα αρχείο κειµένου ΗκλάσηPrintWriter είναι µια κλάση ρεύµατος που µπορεί να χρησιµοποιηθεί για να γράψουµε σεένααρχείοκειµένου Κάθε αντικείµενο της κλάσης PrintWriter έχει τις µεθόδους print και println Αυτές είναι παρόµοιες µετιςαντίστοιχεςµεθόδους του αντικειµένου System.out, αλλά χρησιµοποιούνται για έξοδο σε αρχείο κειµένου, και όχι για έξοδο στην οθόνη 7 Γράφοντας σε ένα αρχείο κειµένου Όλες οι κλάσεις για I/O σε αρχείο που περιγράφουµε παρακάτω περιέχονται στο package java.io, καιέτσιένα πρόγραµµα πουχρησιµοποιεί την PrintWriter πρέπει να ξεκινά µε ένα σύνολο δηλώσεων import: import java.io.printwriter; import java.io.fileoutputstream; import java.io.filenotfoundexception; ΗκλάσηPrintWriter δεν έχει constructor που δέχεται ως όρισµα τοόνοµα κάποιου αρχείου ως όρισµά του Χρησιµοποιεί µια άλλη κλάση, την FileOutputStream, για να µετατρέψει το όνοµα ενός αρχείου σε αντικείµενοτοοποίοµπορεί να χρησιµοποιηθεί ως όρισµα στονconstructor PrintWriter 8 Γράφοντας σε ένα αρχείο κειµένου Ένα ρεύµα της κλάσης PrintWriter δηµιουργείται και συνδέεται σε ένα αρχείο κειµένου για εγγραφή ως εξής: PrintWriter outputstreamname; outputstreamname = new PrintWriter(new FileOutputStream(FileName)); ΗκλάσηFileOutputStream δέχεται ως όρισµαέναstring που αναπαριστά το όνοµααρχείου ΗκλάσηPrintWriter δέχεται ως όρισµα το ανώνυµο αντικείµενο τύπου FileOutputStream 9 3

Γράφοντας σε ένα αρχείο κειµένου Αυτό παράγει ένα αντικείµενο της κλάσης PrintWriter το οποίο συνδέεται µε τοαρχείο FileName Η διαδικασία σύνδεσης ενός ρεύµατος σε ένα αρχείο αποκαλείται άνοιγµα τουαρχείου(opening the file) Εάντοαρχείουπάρχειήδη, τότε η παραπάνω διαδικασία έχει ως αποτέλεσµα ναχαθούντα προηγούµενα δεδοµένα του αρχείου Εάντοαρχείοδενυπάρχει, τότε δηµιουργείται ένα νέο, κενό αρχείο µε όνοµα FileName Μετά από αυτό, οι µέθοδοι print και println µπορούν να χρησιµοποιηθούν για να γράψουµε στοαρχείο 10 Γράφοντας σε ένα αρχείο κειµένου Όταν ένα αρχείο κειµένου ανοίγει µε τον τρόπο αυτό, µπορεί να πεταχτεί µια εξαίρεση FileNotFoundException Αυτό πρακτικά σηµαίνει ότι το αρχείο δεν µπόρεσε να δηµιουργηθεί Αυτός ο τύπος της εξαίρεσης µπορεί επίσης να πεταχτεί όταν ένα πρόγραµµα επιχειρεί να ανοίξει ένα αρχείο για ανάγνωση όταν το αρχείο αυτό δεν υπάρχει Εποµένως είναι απαραίτητο να περικλείουµεαυτόντον κώδικα σε µπλοκ διαχείρισης εξαιρέσεων Το αρχείο θα µπορούσε να ανοιχτεί µέσα στο µπλοκ try Το µπλοκ catch θα µπορούσε να πιάσει και να διαχειριστεί µια πιθανή εξαίρεση Η µεταβλητή που αναφέρεται στο αντικείµενο PrintWriter θα πρέπει να δηλώνεται εκτός του µπλοκ (και να αρχικοποιείται σε null) έτσι ώστε να µην είναι τοπική στο µπλοκ 11 Γράφοντας σε ένα αρχείο κειµένου Όταν τερµατίζεται ένα πρόγραµµαπουγράφεισε αρχείο, θα πρέπει πάντα να κλείνει το ρεύµαπου είναι συνδεδεµένο στο αρχείο outputstreamname.close(); Αυτό επιτρέπει στο σύστηµα νααπελευθερώσειτους πόρους που χρησιµοποιούνται για να συνδεθεί το ρεύµα στοαρχείο Εάν το πρόγραµµα δεν κλείσει το αρχείο πριν τερµατιστεί, η Java θα το κλείσει αυτόµατα, αλλά είναι ασφαλέστερο να το κλείνουµερητά 12 4

Γράφοντας σε ένα αρχείο κειµένου Τα ρεύµατα εξόδου που συνδέονται σε αρχεία είναι συνήθως buffered Αντί να γράφουµε άµεσα (physically) στοαρχείοτο συντοµότερο δυνατό, τα δεδοµένα αποθηκεύονται προσωρινά σε µια τοποθεσία, τον επονοµαζόµενο buffer Όταν συσσωρευτούν αρκετά δεδοµένα, ήόταν ενεργοποιηθεί η µέθοδος flush, τα δεδοµένα στον buffer γράφονται όλα στο αρχείο Αυτό είναι πιο αποδοτικό, αφού οι άµεσες (χωρίς buffer) εγγραφές σε αρχείο είναι πιο αργές 13 Γράφοντας σε ένα αρχείο κειµένου Η µέθοδος close ενεργοποιεί τη µέθοδο flush, καιέτσιυπάρχειεγγύησηότιόλατα δεδοµένα θα εγγραφούν στο αρχείο πριν αυτό κλείσει Εάν ένα πρόγραµµα βασίζεταιστηjava για να κλείσει αυτόµατα το αρχείο, και το πρόγραµµα τερµατιστεί µη κανονικά, τότε όσα δεδοµένα εξόδου υπήρχαν στον buffer ίσως δεν εγγραφούν στο αρχείο Επίσης, εάν ένα πρόγραµµα γράφει σε ένα αρχείο και αργότερα ξανανοίξει για ανάγνωση το ίδιο αρχείο, θα πρέπει πρώτα να το έχει κλείσει Όσο συντοµότερα κλείσει ένα αρχείο αφού έχουµε γράψει σε αυτό, τόσο µικρότερηηπιθανότητανα δηµιουργηθεί κάποιο πρόβληµα 14 Ονόµατα αρχείων Οι κανόνες ονοµατολογία των αρχείων εξαρτώνται από το Λειτουργικό Σύστηµα, και όχι από τη Java Όταν το όνοµα ενός αρχείο δίνεται σε ένα java constructor για ένα ρεύµα, είναι απλά ένα string, και όχι ένας Java identifier (π.χ., "filename.txt") Τα επιθέµατα που χρησιµοποιούνται, όπως το.txt δεν έχουν ιδιαίτερη έννοια για ένα Java πρόγραµµα 15 5

Κάθε αρχείο έχει δυο ονόµατα Κάθε αρχείο εισόδου και αρχείο εξόδου που χρησιµοποιεί ένα πρόγραµµαέχειδυοονόµατα: 1. Το πραγµατικό όνοµα αρχείου που χρησιµοποιείται απότολειτουργικόσύστηµα 2. Το όνοµα τουρεύµατος που συνδέεται στο αρχείο Το πραγµατικό όνοµαχρησιµοποιείται για να γίνει η σύνδεση στο ρεύµα Το όνοµατουρεύµατος εξυπηρετεί ως προσωρινό όνοµαγιατοαρχείο, και είναι το όνοµαπουκυρίωςχρησιµοποιείται µέσα στο πρόγραµµα 16 IOException Όταν εκτελούµε I/O µε αρχεία υπάρχουν πολλές καταστάσεις στις οποίες µπορεί να πεταχτεί µια εξαίρεση, όπως η FileNotFoundException Πολλές από αυτές τις κλάσεις εξαιρέσεων είναι υποκλάσεις της κλάσης IOException ΗκλάσηIOException είναι η ριζική κλάση για µια ποικιλία κλάσεων εξαιρέσεων που σχετίζονται µετην είσοδο/έξοδο Αυτές οι κλάσεις εξαιρέσεων είναι όλες checked exceptions Εποµένως, πρέπει είτε να πιαστούν είτε να δηλωθούν σε µια δήλωση throws 17 Unchecked Exceptions Σε αντιδιαστολή, οι κλάσεις εξαιρέσεων NoSuchElementException, InputMismatchException, και IllegalStateException είναι όλες unchecked exceptions Οι unchecked exceptions δεν απαιτείται να πιαστούν ή να δηλωθούν µε µια δήλωση throws 18 6

Παγίδα : ένα µπλοκ try είναι µπλοκ Αφού η προσπάθεια ανοίγµατος ενός αρχείου, µπορεί να έχει ως αποτέλεσµα ναπεταχτείµια εξαίρεση, θα πρέπει να τοποθετείται µέσα σε ένα µπλοκ try Εάν η µεταβλητή για ένα αντικείµενο PrintWriter πρέπει να χρησιµοποιηθεί εκτός του µπλοκ αυτού, τότε η µεταβλητή πρέπει (προφανώς) να δηλωθεί εκτός του µπλοκ ιαφορετικά θα ήταν τοπική στο µπλοκ, και δεν θα µπορούσε να χρησιµοποιηθεί πουθενά αλλού Εάν δηλωνόταν µέσα στο µπλοκ και χρησιµοποιούνταν κάπου αλλού, ο compiler θα έδινε ένα µήνυµα λάθουςγια undefined identifier 19 Προσθήκη στο τέλος (append) ενός αρχείου κειµένου Γιαναδηµιουργήσουµεένααντικείµενο PrintWriter και να το συνδέσουµε σεένα αρχείο κειµένου για προσθήκη στο τέλος (appending), ένα δεύτερο όρισµα, που τίθεται στην τιµή true, πρέπει να χρησιµοποιηθεί στον constructor του αντικειµένου FileOutputStream outputstreamname = new PrintWriter(new FileOutputStream(FileName, true)); Μετά τη δήλωση αυτή, οι µέθοδοι print, println και/ή printf µπορεί να χρησιµοποιηθούν για να γράψουµεστοαρχείο Το νέο κείµενο θα γραφεί µετά το παλιό κείµενο στο αρχείο 20 Η µέθοδος tostring βοηθά στην έξοδο σε αρχείο κειµένου Εάν µια κλάση έχει κατάλληλη µέθοδο tostring(), και το anobject είναι ένα αντικείµενο της κλάσης αυτής, τότε το anobject µπορεί να χρησιµοποιηθεί ως όρισµα στο System.out.println, και θα παράξει κάποια έξοδο Το ίδιο ισχύει και µε τιςµεθόδους print και println της κλάσης PrintWriter outputstreamname.println(anobject); 21 7

Μέθοδοι της κλάσης PrintWriter (1/3) 22 Μέθοδοι της κλάσης PrintWriter (2/3) 23 Μέθοδοι της κλάσης PrintWriter (3/3) 24 8

ιαβάζοντας από ένα αρχείο κειµένου µε τη Scanner ΗκλάσηScanner µπορεί να χρησιµοποιηθεί για να διαβάσουµε από το πληκτρολόγιο καθώς επίσης και για να διαβάσουµε από ένα αρχείο κειµένου Απλά αντικαθιστούµε τοόρισµα System.in (στον constructor της Scanner) µε ένακατάλληλορεύµα που είναι συνδεδεµένο σε ένα αρχείο κειµένου Scanner StreamObject = new Scanner(new FileInputStream(FileName)); Οι µέθοδοι της κλάσης Scanner για ανάγνωση συµπεριφέρονται µε τον ίδιο τρόπο ανεξάρτητα εάν διαβάζουν απότοπληκτρολόγιοήαπόένααρχείοκειµένου Για παράδειγµα, οι µέθοδοι nextint και nextline 25 ιαβάζοντας από ένα αρχείο κειµένου µε τη Scanner (1/4) 26 ιαβάζοντας από ένα αρχείο κειµένου µε τη Scanner (2/4) 27 9

ιαβάζοντας από ένα αρχείο κειµένου µε τη Scanner (3/4) 28 ιαβάζοντας από ένα αρχείο κειµένου µε τη Scanner (4/4) 29 Ελέγχοντας για το τέλος αρχείου κειµένου µε τη Scanner Ένα πρόγραµµα που προσπαθεί να διαβάσει πέρα απότοτέλοςενόςαρχείουχρησιµοποιώντας µεθόδους της κλάσης Scanner θα έχει ως αποτέλεσµαναπεταχτείµια εξαίρεση Όµως, αντί να βασιζόµαστε στο µηχανισµό των εξαιρέσεωνγιανασηµατοδοτήσουν το τέλος αρχείου, ηκλάσηscanner παρέχει µεθόδους όπως την hasnextint και τη hasnextline Αυτές οι µέθοδοι µπορούν επίσης να χρησιµοποιηθούν για να ελέγξουν εάν το επόµενο token της εισόδου είναι στοιχείο εισόδου µε κατάλληλο τύπο 30 10

Ελέγχοντας για το τέλος αρχείου κειµένου µε τη hasnextline (1/4) 31 Ελέγχοντας για το τέλος αρχείου κειµένου µε τη hasnextline (2/4) 32 Ελέγχοντας για το τέλος αρχείου κειµένου µε τη hasnextline (3/4) 33 11

Ελέγχοντας για το τέλος αρχείου κειµένου µε τη hasnextline (4/4) 34 Ελέγχοντας για το τέλος αρχείου κειµένου µε τη hasnextint (1/2) 35 Ελέγχοντας για το τέλος αρχείου κειµένου µε τη hasnextint (2/2) 36 12

Μέθοδοι της κλάσης Scanner (1/11) 37 Μέθοδοι της κλάσης Scanner (2/11) 38 Μέθοδοι της κλάσης Scanner (3/11) 39 13

Μέθοδοι της κλάσης Scanner (4/11) 40 Μέθοδοι της κλάσης Scanner (5/11) 41 Μέθοδοι της κλάσης Scanner (6/11) 42 14

Μέθοδοι της κλάσης Scanner (7/11) 43 Μέθοδοι της κλάσης Scanner (8/11) 44 Μέθοδοι της κλάσης Scanner (9/11) 45 15

Μέθοδοι της κλάσης Scanner (10/11) 46 Μέθοδοι της κλάσης Scanner (11/11) 47 ιαβάζοντας από αρχείο κειµένου µε τη BufferedReader ΗκλάσηBufferedReader είναι ένα ρεύµα για ανάγνωση από αρχείο κειµένου Ένα αντικείµενο της κλάσης BufferedReader έχει τις µεθόδους read και readline Ένα πρόγραµµα πουχρησιµοποιεί την BufferedReader, όπως και µε τηνprintwriter, χρειάζεται κάποιες δηλώσεις import: import java.io.bufferedreader; import java.io.filereader; import java.io.filenotfoundexception; import java.io.ioexception; 48 16

ιαβάζοντας από αρχείο κειµένου µε τη BufferedReader Όπως και οι κλάσεις PrintWriter και Scanner, η BufferedReader δεν έχει constructor που δέχεται ως όρισµα τοόνοµα ενόςαρχείου Χρειάζεται µια άλλη κλάση, την FileReader, για να µετατρέψει το όνοµα αρχείου σε ένα αντικείµενοτοοποίο µπορεί να χρησιµοποιηθεί ως όρισµα στονconstructor της BufferedReader Ένα ρεύµα της κλάσης BufferedReader δηµιουργείται και συνδέεται µε ένα αρχείο κειµένου ως εξής: BufferedReader readerobject; readerobject = new BufferedReader(new FileReader(FileName)); Αυτό ανοίγει το αρχείο για διάβασµα 49 ιαβάζοντας από αρχείο κειµένου Μετά από αυτές τις δηλώσεις, οι µέθοδοι read και readline µπορούν να χρησιµοποιηθούν, για ανάγνωση από το αρχείο Η µέθοδος readline είναι η ίδια µέθοδος που χρησιµοποιείται για ανάγνωση από το πληκτρολόγιο, αλλάστηνπερίπτωσηαυτήθαδιαβάζειαπόαρχείο Η µέθοδος read διαβάζει έναν µόνο χαρακτήρα, και επιστρέφει µια τιµή (τύπου int) που αντιστοιχεί στον χαρακτήρα που διαβάστηκε Αφού η µέθοδος read δεν επιστρέφει τον χαρακτήρα ακριβώς, πρέπει να χρησιµοποιηθεί type cast: char next = (char)(readerobject.read()); 50 ιαβάζοντας από αρχείο κειµένου µε τη BufferedReader (1/3) 51 17

ιαβάζοντας από αρχείο κειµένου µε τη BufferedReader (2/3) 52 ιαβάζοντας από αρχείο κειµένου µε τη BufferedReader (3/3) 53 ιαβάζοντας από αρχείο κειµένου Ένα πρόγραµµα πουχρησιµοποιεί ένα αντικείµενο BufferedReader µε τον τρόπο αυτό µπορεί να πετάξει δυο τύπους εξαιρέσεων Απόπειρα ανοίγµατος του αρχείου µπορεί να πετάξει µια FileNotFoundException (µετην αναµενόµενη σηµασία) Ενεργοποίηση της readline µπορεί να πετάξει µια IOException Και τις δυο αυτές εξαιρέσεις πρέπει να τις χειριστούµε 54 18

Μέθοδοι της κλάσης BufferedReader (1/2) 55 Μέθοδοι της κλάσης BufferedReader (2/2) 56 ιαβάζοντας αριθµούς ιαφορετικά από την κλάση Scanner, η κλάση BufferedReader δεν έχει µεθόδους για να διαβάζει έναν αριθµό από το αρχείο κειµένου Αντί γι αυτό, ο αριθµός πρέπει να διαβαστεί ως αλφαριθµητικό, και µετά να µετατραπεί σε µια τιµή του κατάλληλου τύπου χρησιµοποιώντας µια από τις wrapper κλάσεις Γιαναδιαβάσουµε ένανµόνο αριθµό πουκαταλαµβάνει µια γραµµή από µόνος του, πρώτα χρησιµοποιούµε τηµέθοδο readline, και κατόπιν την Integer.parseInt, Double.parseDouble, κ.τ.λ., για να µετατρέψουµε τοαλφαριθµητικό σε αριθµό Εάνυπάρχουνπολλοίαριθµοί σε µια γραµµή, µπορούµε να χρησιµοποιήσουµε τη StringTokenizer γιανααποσυνθέσουµε το αλφαριθµητικό σε tokens, και κατόπιν να µετατρέψουµε τα tokens όπως περιγράψαµε πιοπάνω 57 19

Ελέγχοντας για το τέλος αρχείου κειµένου Η µέθοδος readline της κλάσης BufferedReader επιστρέφει null όταν προσπαθήσει να διαβάσει πέρα από το τέλος του αρχείου κειµένου Ένα πρόγραµµα µπορεί να ελέγξει για το τέλος αρχείου ελέγχοντας για null όταν χρησιµοποιεί τη readline Η µέθοδος read της κλάσης BufferedReader επιστρέφει -1 όταν προσπαθεί να διαβάσει πέρα από το τέλος του αρχείου κειµένου Ένα πρόγραµµα µπορεί να ελέγξει για το τέλος αρχείου ελέγχοντας για την τιµή -1 όταν χρησιµοποιεί τη read 58 Ονόµατα µονοπατιών Όταν το όνοµα ενός αρχείου πρέπει να χρησιµοποιηθεί ως όρισµα γιαναανοίξουµε το αρχείο, υποτίθεται ότι το αρχείο είναι στον ίδιο κατάλογο µε αυτόν στον οποίο εκτελείται το πρόγραµµα Εάνδενείναιστονίδιοκατάλογο, πρέπει να χρησιµοποιηθεί το πλήρες ή το σχετικό µονοπάτι 59 Ονόµατα µονοπατιών Το όνοµα µονοπατιού (path name) δεν δίνει απλώς το όνοµα τουαρχείου, αλλά και τον κατάλογο όπου βρίσκεται το αρχείο Το όνοµα πλήρους µονοπατιού (full path name) δίνει το πλήρες µονοπάτι, αρχίζοντας από τον ριζικό κατάλογο Το όνοµα σχετικούµονοπατιού (relative path name) δίνει το µονοπάτι για ένα αρχείο, αρχίζοντας από τον τρέχοντα κατάλογο όπου εκτελείται το πρόγραµµα 60 20

Ονόµατα µονοπατιών Οτρόποςµε τον οποίο καθορίζουµε ταονόµατα εξαρτάται από το λειτουργικό σύστηµα Ένα τυπικό όνοµα µονοπατιού σε UNIX που θα µπορούσαµε ναχρησιµοποιήσουµε ωςόρισµα είναι "/user/sallyz/data/data.txt" Ένα BufferedReader ρεύµα εισόδου συνδεδεµένο στο αρχείο αυτό δηµιουργείται ως εξής: BufferedReader inputstream = new BufferedReader(new FileReader("/user/sallyz/data/data.txt")); 61 Ονόµατα µονοπατιών Το λειτουργικό σύστηµα Windows καθορίζει τα ονόµατα µονοπατιών µε διαφορετικό τρόπο Ένα τυπικό όνοµα µονοπατιού στα Windows είναι το ακόλουθο: C:\dataFiles\goodData\data.txt Ένα ρεύµα εισόδου BufferedReader που συνδέεται µεαυτότοαρχείοδηµιουργείται ως εξής: BufferedReader inputstream = new BufferedReader(new FileReader ("C:\\dataFiles\\goodData\\data.txt")); Σηµειώστε ότι στα Windows πρέπει να χρησιµοποιηθεί το \\ αντί του \, αφού ένα µονό backslash συµβολίζει την αρχή ενός escape χαρακτήρα 62 Ονόµατα µονοπατιών Το διπλό backslash (\\) πρέπει να χρησιµοποιείται για το όνοµα ενόςµονοπατιού στα Windows που περικλείεται σε quoted string Αυτό το πρόβληµα δεν παρουσιάζεται όταν διαβάζουµε ονόµατα µονοπατιών από το πληκτρολόγιο Τα προβλήµατα µε τους χαρακτήρες escape µπορούν να αποφευχθούν εάν χρησιµοποιούµε τις συµβάσεις του UNIX όταν γράφουµε ονόµατα µονοπατιών Ένα πρόγραµµα σεjava θα δεχτεί το όνοµα ενός µονοπατιού είτε είναι γραµµένο σε µορφή Windows είτε σε µορφή Unix ανεξάρτητα από το λειτουργικό σύστηµα όπου εκτελείται 63 21

Φωλιασµένες κλήσεις constructor Κάθε µια από τις κλάσεις για I/O στη Java υπηρετεί µόνο µια συνάρτηση, ήέναν περιορισµένο αριθµό συναρτήσεων Κανονικά δυο ή περισσότεροι constructors διαφορετικών κλάσεων συνδυάζονται για να αποκτηθεί πλήρης λειτουργικότητα Εποµένως, εκφράσεις µε δυοconstructors είναι συνηθισµένες όταν χειριζόµαστε κλάσεις I/O στη Java 64 Φωλιασµένες κλήσεις constructor new BufferedReader(new FileReader("stuff.txt")) Πάνω, το ανώνυµο αντικείµενο FileReader εγκαθιστά µια σύνδεση µε τοαρχείο stuff.txt Όµως, παρέχει µόνο απλοϊκές µεθόδους για είσοδο Ο constructor της BufferedReader δέχεται ως όρισµα το αντικείµενο FileReader και προσθέτει µια πλουσιότερη συλλογή µεθόδων για είσοδο Αυτό µετατρέπει το εσωτερικό αντικείµενο σε µια instance variable του εξωτερικού αντικειµένου 65 System.in, System.out, και System.err Τα standard ρεύµατα System.in, System.out, και System.err είναι αυτόµατα διαθέσιµα σεκάθε πρόγραµµα Java System.out χρησιµοποιείται για τη συνήθη έξοδο στην οθόνη System.err χρησιµοποιείται για την έξοδο των µηνυµάτων σφάλµατος στην οθόνη ΗκλάσηSystem παρέχει τρεις µεθόδους (setin, setout, και seterr) για ανακατεύθυνση αυτών των standard ρευµάτων: public static void setin(inputstream instream) public static void setout(printstream outstream) public static void seterr(printstream outstream) 66 22

System.in, System.out, και System.err Χρησιµοποιώντας αυτές τις µεθόδους, οποιοδήποτε από τα τρία standard ρεύµατα µπορούν να ανακατευθυνθούν Για παράδειγµα, αντί να εµφανίζονται στην οθόνη, τα µηνύµατα σφάλµατος θα µπορούσαν να ανακατευθυνθούν σε ένα αρχείο Γιαναανακατευθύνουµε έναstandard ρεύµα, δηµιουργούµε ένανέορεύµα Όπως και τα άλλα ρεύµατα που δηµιουργούνται σε ένα πρόγραµµα, ένα αντικείµενο ρεύµατος που χρησιµοποιήθηκε για ανακατεύθυνση πρέπει να κλείσει µετά το πέρας της I/O Σηµειώστε, ότι τα standard ρεύµατα δεν χρειάζεται να κλείσουν 67 System.in, System.out, και System.err Ανακατεύθυνση της System.err: public void getinput() {... PrintStream errstream = null; try { errstream = new PrintStream(new FileOuptputStream("errMessages.txt")); System.setErr(errStream);... //Set up input stream and read } 68 System.in, System.out, και System.err catch(filenotfoundexception e) { System.err.println("Input file not found"); } finally {... errstream.close(); } } 69 23

ΗκλάσηFile ΗκλάσηFile είναι σαν µια wrapper κλάση γιαταονόµατα αρχείων Ο constructor της κλάσης File δέχεται ως string όρισµα έναόνοµα, (γνωστό ως αφηρηµένο όνοµα, abstract name), και παράγει ένα αντικείµενο που αναπαριστά το αρχείο µε αυτότοόνοµα Το αντικείµενο File και οι µέθοδοι της κλάσης File µπορούν να χρησιµοποιηθούν για να αντλήσουµε πληροφορίες για το αρχείο και τις ιδιότητές του 70 Μέθοδοι της κλάσης File (1/5) 71 Μέθοδοι της κλάσης File (2/5) 72 24

Μέθοδοι της κλάσης File (3/5) 73 Μέθοδοι της κλάσης File (4/5) 74 Μέθοδοι της κλάσης File (5/5) 75 25

υαδικά αρχεία Τα δυαδικά αρχεία αποθηκεύουν δεδοµένα µε τον ίδιο τρόπο που η µνήµη του υπολογιστή αποθηκεύει τις τιµές των µεταβλητών εν χρειάζεται κάποια µετατροπή όταν η τιµή αποθηκεύεται ή ανακτάται από ένα δυαδικό αρχείο Τα δυαδικά αρχεία στη Java, διαφορετικά από τα δυαδικά αρχεία σε άλλες γλώσσες, είναι φορητά Ένα δυαδικό αρχείο που δηµιουργείται από ένα πρόγραµµα Java µπορεί να µετακινηθεί από υπολογιστή σε υπολογιστή Αυτά τα αρχεία µπορούν κατόπιν να διαβαστούν από ένα Java πρόγραµµα, αλλά µόνο από πρόγραµµα Java 76 Γράφοντας απλά δεδοµένα σε δυαδικό αρχείο Η κλάση ObjectOutputStream είναι ένα ρεύµα που µπορεί να χρησιµοποιηθεί για να γράψουµε σεένα δυαδικό αρχείο Ένα αντικείµενοαυτήςτηςκλάσηςέχειµεθόδους για να γράφουµε strings, τιµές primitive τύπων, και αντικείµενα σε ένα δυαδικό αρχείο Ένα πρόγραµµα που χρησιµοποιεί τη ObjectOutputStream πρέπει να κάνει import διάφορες κλάσεις από το package java.io: import java.io.objectoutputstream; import java.io.fileoutstream; import java.io.ioexception; 77 Άνοιγµα δυαδικού αρχείου για εγγραφή Ένα αντικείµενο ObjectOutputStream δηµιουργείται και συνδέεται σε ένα δυαδικό αρχείο ως εξής: ObjectOutputStream outputstreamname = new ObjectOutputStream(new FileOutputStream(FileName)); Ο constructor για τη FileOutputStream µπορεί να πετάξει µια FileNotFoundException Ο constructor για τη ObjectOutputStream µπορεί να πετάξει µια IOException Κάθε µια από αυτές τις εξαιρέσεις πρέπει να τη διαχειριστούµε 78 26

Άνοιγµα δυαδικού αρχείου για εγγραφή Μετά το άνοιγµα τουαρχείου, µέθοδοι της ObjectOutputStream µπορεί να χρησιµοποιηθούν για να γράψουµε στοαρχείο Οι µέθοδοι που χρησιµοποιούνται για να γράψουµε primitive τιµές περιλαµβάνουν τις writeint, writedouble, writechar, και writeboolean UTF είναι ένα σχήµα κωδικοποίησης που χρησιµοποιείται για να κωδικοποιούµε Unicode χαρακτήρες που ευνοεί το σύνολο χαρακτήρων ASCII Η µέθοδος writeutf µπορεί να χρησιµοποιηθεί για να γράψουµε τιµές τύπου String Το ρεύµα πρέπει πάντα να κλείνει µετά την εγγραφή 79 Μέθοδοι της ObjectOutputStream (1/5) 80 Μέθοδοι της ObjectOutputStream (2/5) 81 27

Μέθοδοι της ObjectOutputStream (3/5) 82 Μέθοδοι της ObjectOutputStream (4/5) 83 Μέθοδοι της ObjectOutputStream (5/5) 84 28

ιαβάζοντας απλά δεδοµένα από δυαδικό αρχείο Η κλάση ObjectInputStream είναι ένα ρεύµα που µπορεί να χρησιµοποιηθεί για να διαβάσουµε από δυαδικό αρχείο Κάθε αντικείµενο της κλάσης έχει µεθόδους για να διαβάζουµε strings, τιµές primitive τύπων, και αντικείµενο από ένα δυαδικό αρχείο Ένα πρόγραµµα που χρησιµοποιεί τη ObjectInputStream πρέπει να κάνει import διάφορες κλάσεις από το package java.io: import java.io.objectinputstream; import java.io.fileinputstream; import java.io.ioexception; 85 Ανοίγοντας ένα δυαδικό αρχείο για ανάγνωση Ένα αντικείµενο ObjectInputStream δηµιουργείται και συνδέεται σε ένα δυαδικό αρχείο ως εξής: ObjectInputStream instreamname = new ObjectInputStream(new FileInputStream(FileName)); Ο constructor της FileInputStream µπορεί να πετάξει FileNotFoundException Ο constructor της ObjectInputStream µπορεί να πετάξει IOException Πρέπει να τις χειριστούµε 86 Ανοίγοντας ένα δυαδικό αρχείο για ανάγνωση Μετά το άνοιγµα τουαρχείου, οι µέθοδοι της ObjectInputStream µπορούν να χρησιµοποιηθούν για την ανάγνωση Μέθοδοι για ανάγνωση primitive τιµών είναι οι readint, readdouble, readchar, και readboolean Η µέθοδος readutf διαβάζει τιµές τύπου String Εάν το αρχείο περιέχει πολλαπλούς τύπους, κάθε τύπος πρέπει να διαβαστεί ακριβώς µε τη σειρά που γράφτηκε Στο τέλος πρέπει να κλείνουµε τορεύµα 87 29

Μέθοδοι της ObjectInputStream (1/5) 88 Μέθοδοι της ObjectInputStream (2/5) 89 Μέθοδοι της ObjectInputStream (3/5) 90 30

Μέθοδοι της ObjectInputStream (4/5) 91 Μέθοδοι της ObjectInputStream (5/5) 92 Ελέγχοντας για το τέλος δυαδικού αρχείου Όλες οι µέθοδοι της ObjectInputStream που διαβάζουν από ένα δυαδικό αρχείο πετάνε EOFException εάνπροσπαθήσουννα διαβάσουν πέρα από το τέλος του Άρα µπορούµε να ελέγξουµε µε τον τρόπο αυτό για το τέλος αρχείου Σηµειώστε ότι διαφορετικές µέθοδοι ελέγχουν για το τέλος αρχείου µε διαφορετικό τρόπο Ελέγχοντας για το τέλος αρχείου µε το λάθος τρόπο µπορεί να προκαλέσει ατέρµονα βρόχο ή µη κανονικό τερµατισµό του προγράµµατος 93 31

υαδική I/O για αντικείµενα Μπορούµε ναγράψουµε και να διαβάσουµε αντικείµενα σε/από ένα δυαδικό αρχείο Κάνοντας χρήση της µεθόδου writeobject της κλάσης ObjectOutputStream γράφουµε ένα αντικείµενο σε ένα δυαδικό αρχείο Κάνοντας χρήση της µεθόδου readobject της κλάσης class ObjectInputStream διαβάζουµε ένααντικείµενο από ένα δυαδικό αρχείο Για να χρησιµοποιήσουµε την τιµή που επιστρέφεται από τη readobject ως αντικείµενο µιας κλάσης, πρέπει να εκτελέσουµε type cast: SomeClass someobject = (SomeClass)objectInputStream.readObject(); 94 υαδική I/O για αντικείµενα Είναικαλύτερανααποθηκεύουµε δεδοµένα ενός µόνο τύπου σε ένα αρχείο Εάν έχουµε ανάµειξη τύπων ίσως υπάρχει απώλεια δεδοµένων Επιπλέον, η κλάσητουαντικειµένου το οποίο γράφεταιήδιαβάζεταιπρέπειναυλοποιείτη διεπαφή (interface) Serializable To interface Serializable είναι εύκολο να το χρησιµοποιήσουµε και δεν απαιτεί γνώση της έννοιας των interfaces Μια κλάση που υλοποιεί το Serializable interface θα αποκαλείται serializable κλάση 95 Το interface Serializable Γιανακάνουµε µια κλάση serializable, απλά προσθέτουµε τοimplements Serializable στην κεφαλίδα του ορισµού τη κλάσης public class SomeClass implements Serializable Όταν µια serializable κλάση έχει instance variables πουείναιτύπουκλάσης, then all αυτές οικλάσειςπρέπειεπίσηςναείναιserializable Μια κλάση δεν είναι serializable εκτός και εάν όλες οι instance variables είναι επίσης serializable για όλα τα επίπεδα των instance variables µέσα στις κλάσεις 96 32

Πίνακες σε δυαδικά αρχεία Αφού ένας πίνακας είναι αντικείµενο, µπορούµε να γράψουµε και διαβάσουµε πίνακες σε δυαδικά αρχεδία µε τις readobject και writeobject Εάν το βασικός τύπος του πίνακε είναι κάποια κλάση, τότε πρέπει επίσης να είναι serializable (δείτε στην επόµενη διάλεξη), όπως κάθε άλλος τύπος κλάσης Αφού η readobject επιστρέφει την τιµή τηςως τύπου Object (όπως και για κάθε άλλο αντικείµενο), πρέπει να εκτελέσουµε type cast στον σωστό τύπο πίνακα: SomeClass[] someobject = (SomeClass[])objectInputStream.readObject(); 97 Τυχαία προσπέλαση σε δυαδικά αρχεία Τα ρεύµατα για σειριακή προσπέλαση σε αρχεία είναι εκείνα που χρησιµοποιούνται περισσότερο στη Java Όµως, µερικές εφαρµογές απαιτούν γρήγορη προσπέλαση σε εγγραφές σε πολύ µεγάλες βάσεις δεδοµένων Αυτές οι εφαρµογές χρειάζεται να έχουν τυχαία προσπέλαση σε συγκεκριµένα µέρη του αρχείου 98 Ανάγνωση και εγγραφή στο ίδιο αρχείο Η κλάση ρεύµατος RandomAccessFile, που βρίσκεται στο java.io package, παρέχει δυνατότητες ανάγνωσης και εγγραφής, τυχαίας προσπέλασης σε αρχεία στη Java Ένα αρχείο τυχαίας προσπέλασης αποτελείται από µια ακολουθία αριθµηµένων bytes Υπάρχει ένα είδος marker που ονοµάζεται file pointer που πάντα δείχνει σε κάποιο από αυτά τα bytes Όλες οι εγγραφές και αναγνώσεις αρχίζουν από τη θέση του file pointer Ο δείκτης αρχείου (file pointer) µπορεί να µετακινηθεί σε µια νέα θέση µε την µέθοδο seek 99 33

Ανάγνωση και εγγραφή στο ίδιο αρχείο Παρόλο που ένα αρχείο τυχαίας προσπέλασης είναι προσανατολισµένο σε byte, υπάρχουν µέθοδοι που επιτρέπουν ανάγνωση και εγγραφή primitive τύπων όπως και τιµών string από/προς ένα random access file Αυτές περιλαµβάνουν τις readint, readdouble, και readutf για είσοδο, και τις writeint, writedouble, και writeutf για έξοδο Όµως δεν έχουν τη µέθοδο writeobject και readobject 100 Ανοίγοντας ένα αρχείο Ο constructor της RandomAccessFile δέχεται ως πρώτο όρισµα είτεέναstring που είναι το όνοµα αρχείου είτε ένα αντικείµενο της κλάσης File Το δεύτερο όρισµα πρέπει να είναι κάποιο από τα παρακάτω: "rw", που δίνει τη δυνατότητα για ανάγνωση και εγγραφή του αρχείου "r", που δίνει τη δυνατότητα για ανάγνωση µόνο του αρχείου "rws" ή "rwd" (δες τον παρακάτω πίνακα µε τις µεθόδους της RandomAccessFile) 101 Παγίδα: Ένα αρχείο Τυχαίας Προσπέλασης (Random Access) δεν χρειάζεται να ανοίξει άδειο Εάντοαρχείουπάρχειήδη, τότε όταν το ανοίγουµε, το µήκος του δεν τίθεται ίσο µε 0, και ο δείκτης αρχείου (file pointer) θα τοποθετηθεί στην αρχή του αρχείου Αυτό εγγυάται ότι δεν θα χαθούν τα παλιά δεδοµένα, και ότι το file pointer τοποθετείται στην θέση που είναι πιο πιθανή για ανάγνωση (εγγραφή) Το µήκος του αρχείου µπορεί να αλλαχτεί µε τη µέθοδο setlength Ειδικότερα, η µέθοδος setlength µπορεί να χρησιµοποιηθεί για να εκκενώσουµε τοαρχείο 102 34

Μέθοδοι της RandomAccessFile (1/7) 103 Μέθοδοι της RandomAccessFile (2/7) 104 Μέθοδοι της RandomAccessFile (3/7) 105 35

Μέθοδοι της RandomAccessFile (4/7) 106 Μέθοδοι της RandomAccessFile (5/7) 107 Μέθοδοι της RandomAccessFile (6/7) 108 36

Μέθοδοι της RandomAccessFile (7/7) 109 37