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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Week 9: Input / Output

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

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

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

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

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

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

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

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

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

Βασικά Στοιχεία της Java

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

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

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

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

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

Mεταβλητές (variables) και Σταθερές (constants)

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

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

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

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

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

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

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

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

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

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

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

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

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

Βασικά της γλώσσας JAVA

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

Βασικά Στοιχεία της Java

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

Προγραµµατισµός JAVA. ρ Γεώργιος Μαυροµµάτης Πειραιάς 2004

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

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

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

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

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

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

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

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

ιαφάνειες παρουσίασης #6 (β)

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

Δοµές Δεδοµένων. 3η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες. Ε. Μαρκάκης

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

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

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

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

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

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

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

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

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

Αρχεία & Ρεύματα ΑΡΧΕΙΑ & ΡΕΥΜΑΤΑ. Γεώργιος Παπαϊωάννου ( ) gepap@aueb.gr

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

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

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

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

Προγραμματισμός Ι. Χαρακτήρες. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

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

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

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

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

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ

ΕΠΛ131 Αρχές Προγραμματισμού

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

Διάλεξη 20: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

Transcript:

Προγραµµατισµός ΙΙ Java 2 ιαχείριση Αρχείων Αρχεία Γιατί χρειαζόµαστε να γνωρίζουµε πως διαχειριζόµαστε αρχεία? Για να αποθηκεύουµε και να διαβάζουµε δεδοµένα από το δίσκο (τους λογικούς δίσκους πιο σωστά) Στην ενότητα αυτή θα µελετηθεί και η είσοδος δεδοµένων χρήστη από το πληκτρολόγιο 1

Τα Αρχεία ως Αντικείµενα Ένα αντικείµενο αρχείου, ονοµάζεται File και µπορεί να αντιπροσωπεύει ένα αρχείο (file) ή έναν κατάλογο (directory) File file1=new File( data.txt ); File file2=new File( C:\Java ); Για να διαβάσουµε το µονοπάτι του τρέχοντος καταλόγου System.getProperty( user.dir ); µε user.dir συµβολίζεται ο τρέχων φάκελος µε user.name συµβολίζεται ο τρέχων χρήστης περισσότερες επιλογές στο help->system->getproperty Χρήσιµες Μέθοδοι της File boolean isfile() είναι αρχείο? boolean isdirectory() είναι κατάλογος? Boolean exists() υπάρχει? long length() µέγεθος σε bytes String[] list() ονόµατα αρχείων καταλόγου boolean mkdir() δηµιουργία καταλόγου boolean delete() διαγραφή αρχείου/καταλόγου Παράδειγµα: έχω το αντικείµενο file1 και θέλω το µέγεθός του σε bytes long x = file1.length(); 2

Παράδειγµα Καταλόγων Παράδειγµα Καταλόγων Αποτέλεσµα εκτέλεσης: 3

Αρχεία και Ροές (Streams) Στη Java τα αρχεία (files) τα διαβάζουµε και τα γράφουµε µέσω ροών δεδοµένων (streams) Είδη ροών δεδοµένων εισόδου/εξόδου εδοµένων (µη προσηµασµένου byte: 0-255) Κλάσεις: FileInputStream, FileOutputStream εδοµένων (int, float, double, κλπ) Επιπρόσθετα Κλάσεις: DataInputStream, DataOutputStream Χαρακτήρων κειµένου (character) Κλάσεις: FileReader, FileWriter, κτλ Τρόποι υλοποίησης εισόδου/εξόδου Χωρίς ή Με ενδιάµεση µνήµη (buffer) [ενδείκνυται] Επιπρόσθετα Κλάσεις: BufferedInputStream, BufferedOutputStream, BufferedWriter, BufferedReader εδοµένα και Κείµενο Τα αρχεία κειµένου περιέχουν χαρακτήρες (char) κατανοητούς από τον άνθρωπο (ASCII) µπορούν να διαβαστούν και καταλάβουµε τι γράφουν µε έναν κλασσικό κειµενογράφο π.χ. Notepad ναι, θα µπορούσαµε να αποθηκεύσουµε τα δεδοµένα µας σε µορφή κειµένου αλλά θα ήταν δυσκολότερο να τα χειριστούµε (π.χ. µετατροπές από String σε αριθµούς κτλ) και θα καθυστερούσε η ανάγνωση κι εγγραφή τους στο δίσκο. παράδειγµα:.txt 4

εδοµένα και Κείµενο Τα αρχεία δεδοµένων περιέχουν δεδοµένα µε συγκεκριµένη µορφή που έχει καθορίσει ο προγραµµατιστής της εφαρµογής αν δοκιµάσουµε να τα ανοίξουµε µε έναν απλό κειµενογράφο θα δούµε ανακατωµένους χαρακτήρες (αλαµπουρνέζικα) που αντιστοιχούν στα διαφορετικά bytes δεδοµένων που είναι αποθηκευµένα. τα χρησιµοποιούµε για να διαβάζουµε και να γράφουµε εύκολα και γρήγορα δεδοµένα που αντιστοιχούν απευθείας στα δεδοµένα των µεταβλητών µας µέσα στο πρόγραµµα παραδείγµατα:.dat,.doc,.gif,.tif,.wav κτλ. ή άλλες αυτοσχέδιες µορφές (δικές µας) Ανάγνωση εδοµένων Εισαγωγή των κλάσεων του πακέτου io import java.io.*; ηµιουργία αντικειµένου ροής εισόδου FileInputStream myfile = new FileInputStream( όνοµα αρχείου ); Εντολή ανάγνωσης data=myfile.read(); Οµοίως για άλλους τύπους δεδοµένων data = file.readboolean(), readfloat(), Εντολή για κλείσιµο του αρχείου myfile.close(); 5

Ανάγνωση εδοµένων Παράδειγµα (δεδοµένα byte) Έστω πως έχουµε ένα αρχείο δεδοµένων µε όνοµα class.dat του οποίου τα bytes θέλουµε να τυπώσουµε στην οθόνη import java.io.*; public class ReadBytes { public static void main(string[] arguments) { try { FileInputStream file = new FileInputStream("class.dat"); boolean eof = false; int count = 0; συνεχίζεται... Ανάγνωση εδοµένων Παράδειγµα (δεδοµένα byte) Έτσι ανιχνεύουµε πως το αρχείο µας έφτασε στο τέλος while (!eof) { int input = file.read(); System.out.print(input + " "); if (input == -1) eof = true; else count++; file.close(); System.out.println("\nBytes read: " + count); catch (IOException e) { System.out.println("Error -- " + e.tostring()); 6

Ανάγνωση εδοµένων Απορία Γιατί ενώ η µέθοδος read() διαβάζει bytes θέλει να την ορίζουµε ως int και όχι byte? Απάντηση ιαβάζει τα δεδοµένα ως µη προσηµασµένα bytes στο διάστηµα [0-255] κι επιστρέφει ακέραιους. Στην περίπτωση που γίνει κάποιο σφάλµα κατά την είσοδο/έξοδο ή τελειώσει το αρχείο που µπορεί να διαβάζαµε επιστρέφει -1 για να µας ειδοποιήσει. ΠΡΟΣΟΧΗ! Ο τύπος byte της Java παίρνει προσηµασµένες τιµές στο διάστηµα [-128,128]. Τα δεδοµένα δεν είναι τέτοιου τύπου! Γι αυτό και χρησιµοποιούµε int αντί byte µια και δεν υποστηρίζεται διαφορετικά unsigned byte!!! Ανάγνωση εδοµένων Συµβουλευτείτε το JAVA API Help για να δείτε τι άλλες µέθοδοι υποστηρίζονται!!! Παράδειγµα: Παραλλαγές της read() όπως: Για ανάγνωση b.length δεδοµένων σε πίνακα b public int read(byte[] b) throws IOException public int read(byte[] b, int off, int len) throws IOException 7

Εγγραφή εδοµένων Εισαγωγή των κλάσεων του πακέτου io import java.io.*; ηµιουργία αντικειµένου ροής εξόδου FileOutputStream myfile = new FileOutputStream( όνοµα αρχείου ); Εντολή εγγραφής file.write(data); Οµοίως για άλλους τύπους δεδοµένων file.writeboolean(), writefloat(), Εντολή για κλείσιµο του αρχείου file.close(); Εγγραφή εδοµένων Παράδειγµα (δεδοµένα byte) Έστω πως θέλουµε να γράψουµε στο δίσκο µια σειρά από bytes που συνιστούν µια εικόνα µορφής gif import java.io.*; public class WriteBytes { public static void main(string[] arguments) { int[] data = { 71, 73, 70, 56, 57, 97, 15, 0, 15, 0, 128, 0, 0, 255, 255, 255, 0, 0, 0, 44, 0, 0, 0, 0, 15, 0, 15, 0, 0, 2, 33, 132, 127, 161, 200, 185, 205, 84, 128, 241, 81, 35, 175, 155, 26, 228, 254, 105, 33, 102, 121, 165, 201, 145, 169, 154, 142, 172, 116, 162, 240, 90, 197, 5, 0, 59 ; συνεχίζεται... 8

Εγγραφή εδοµένων Παράδειγµα (δεδοµένα byte) try { FileOutputStream file = new FileOutputStream("pic.gif"); for (int i = 0; i < data.length; i++) file.write(data[i]); file.close(); catch (IOException e) { System.out.println("Error -- " + e.tostring()); Εγγραφή / Ανάγνωση µε Buffer Για αποδοτικότερη (γρηγορότερη) είσοδο/έξοδο δεδοµένων χρησιµοποιούµε είσοδο/έξοδο µε ενδιάµεση µνήµη (buffer) Τα δεδοµένα της ροής δεδοµένων πριν διαβαστούν/γραφούν από/στο δίσκο διαβάζονται/γράφονται σε µια ενδιάµεση µνήµη, ώστε αν τα χρειαστούµε ξανά να µην τα διαβάζουµε/γράφουµε πάλι στο δίσκο Η ενδιάµεση αυτή µνήµη δεν είναι τίποτε άλλο από έναν πίνακα που βρίσκεται στην κλάση που θα χρησιµοποιήσουµε 9

Εγγραφή / Ανάγνωση µε Buffer Υλοποίηση Οµοίως µε πριν, µόνο που παρεµβάλουµε µια επιπλέον εντολή η οποία δηµιουργεί το αντικείµενο buffer!!! 1. FileInputStream myfile = new FileInputStream( όνοµα αρχείου ); 2. BufferedInputStream mybuf = new BufferedInputStream(myfile); Αντί να καλούµε myfile.read() Καλούµε mybuf.read() Και για κλείσιµο του αρχείου mybuf.close() Αντίστοιχα και µε την εγγραφή σε αρχεία Εγγραφή / Ανάγνωση µε Buffer Οι κλάσεις ενδιάµεσης µνήµης για εγγραφή/ανάγνωση αρχείων δεδοµένων του πακέτου io public BufferedInputStream(InputStream in) public BufferedInputStream(InputStream in, int size) public BufferedOutputStream(OutputStream in) public BufferedOutputStream(OutputStream in, int size) Όπου µε size µπορεί κανείς να ορίσει το µέγεθος του buffer σε αριθµό bytes Αν δεν ορίσει κανείς size τότε size=512 bytes 10

Εγγραφή / Ανάγνωση µε Buffer Παράδειγµα import java.io.*; public class BufferDemo { public static void main(string[] arguments) { int start = 0; int finish = 255; if (arguments.length > 1) { start = Integer.parseInt(arguments[0]); finish = Integer.parseInt(arguments[1]); else if (arguments.length > 0) start = Integer.parseInt(arguments[0]); ArgStream as = new ArgStream(start, finish); System.out.println("\nWriting: "); boolean success = as.writestream(); System.out.println("\nReading: "); boolean readsuccess = as.readstream(); Εγγραφή / Ανάγνωση µε Buffer Παράδειγµα class ArgStream { int start = 0; int finish = 255; ArgStream(int st, int fin) { start = st; finish = fin; συνεχίζεται η κλάση ArgStream... 11

Εγγραφή / Ανάγνωση µε Buffer Παράδειγµα boolean writestream() { try { FileOutputStream file = new FileOutputStream("numbers.dat"); BufferedOutputStream buff = new BufferedOutputStream(file); for (int out = start; out <= finish; out++) { buff.write(out); System.out.print(" " + out); buff.close(); return true; catch (IOException e) { System.out.println("Exception: " + e.getmessage()); return false; συνεχίζεται... Εγγραφή / Ανάγνωση µε Buffer Παράδειγµα Έτσι ανιχνεύουµε πως το αρχείο µας έφτασε στο τέλος boolean readstream() { try { FileInputStream file = new FileInputStream("numbers.dat"); BufferedInputStream buff = new BufferedInputStream(file); int in = 0; do { in = buff.read(); if (in!= -1) System.out.print(" " + in); while (in!= -1); buff.close(); return true; catch (IOException e) { System.out.println("Exception: " + e.getmessage()); return false; 12

Βίαιο Άδειασµα του Buffer Αν για κάποιο λόγο θέλουµε επιτόπου τα δεδοµένα του buffer να τα γράψουµε στο δίσκο χρησιµοποιούµε τη µέθοδο flush() Παράδειγµα: BufferedOutputStream mybuf = new BufferedOutputStream(myfile); mybuf.flush(); Άλλες Χρήσιµες Μέθοδοι Κάθε ροή έχει µια αρχή κι ένα τέλος Εµείς όταν διαβάζουµε ή γράφουµε σε µια ροή βρισκόµαστε κάθε φορά σε µια διαφορετική θέση (την τρέχουσα θέση) Ιδιότητες και µέθοδοι που µας βοηθούν να εντοπίζουµε και να τροποποιoύµε την τρέχουσα θέση µας σε µια ροή δεδοµένων ενός buffer, ανήκουν στις κλάσεις BufferedInputStream και BufferedOutputStream είναι: Ιδιότητες: buf (ο πίνακας), pos (τρέχουσα θέση) κ.α. Μέθοδοι: mark() σηµειώνει τρέχουσα θέση, reset() µας επαναφέρει στην προσηµειωµένη θέση, skip(long n) µεταφέρει την τρέχουσα θέση n bytes εµπρός 13

εδοµένα Άλλου Τύπου (όχι byte) Αν τα δεδοµένα που θέλουµε να διαβάσουµε/γράψουµε από/προς το δίσκο δεν είναι bytes αλλά είναι π.χ. Boolean, Byte, Double, Float, Int, Long, Short τότε Οµοίως µε πριν, µόνο που παρεµβάλουµε ακόµα µια επιπλέον εντολή η οποία δηµιουργεί το αντικείµενο που διαχειρίζεται αυτού του τύπου τα δεδοµένα εδοµένα Άλλου Τύπου (όχι byte) Ηπορεία είναι η εξής: 1. FileInputStream myfile = new FileInputStream( όνοµα αρχείου ); 2. BufferedInputStream mybuf = new BufferedInputStream(myfile); 3. DataInputStream data = new DataInputStream(mybuf); Θα µπορούσαµε να µην είχαµε παρεµβάλλει buffer Αντί να καλούµε mybuf.read() Καλούµε π.χ. data.readfloat() αν έχουµε δεδοµένα Float Και για κλείσιµο του αρχείου data.close() Αντίστοιχα και µε την εγγραφή σε αρχεία 14

εδοµένα Άλλου Τύπου (όχι byte) Παράδειγµα (εγγραφή δεδοµένων) import java.io.*; class WritePrimes { public static void main(string arguments[]) { int[] primes = new int[400]; int numprimes = 0; // candidate: the number that might be prime int candidate = 2; while (numprimes < 400) { if (isprime(candidate)) { primes[numprimes] = candidate; numprimes++; candidate++; συνεχίζεται εδοµένα Άλλου Τύπου (όχι byte) Παράδειγµα (εγγραφή δεδοµένων) try { // Write output to disk FileOutputStream file = new FileOutputStream("400primes.dat"); BufferedOutputStream buff = new BufferedOutputStream(file); DataOutputStream data = new DataOutputStream(buff); for (int i = 0; i < 400; i++) data.writeint(primes[i]); data.close(); catch (IOException e) { System.out.println("Error -- " + e.tostring()); συνεχίζεται 15

εδοµένα Άλλου Τύπου (όχι byte) Παράδειγµα (εγγραφή δεδοµένων) public static boolean isprime(int checknumber) { double root = Math.sqrt(checkNumber); for (int i = 2; i <= root; i++) { if (checknumber % i == 0) return false; return true; εδοµένα Άλλου Τύπου (όχι byte) Παράδειγµα (ανάγνωση δεδοµένων) import java.io.*; class ReadPrimes { public static void main(string arguments[]) { try { FileInputStream file = new FileInputStream("400primes.dat"); BufferedInputStream buff = new BufferedInputStream(file); DataInputStream data = new DataInputStream(buff); 16

εδοµένα Άλλου Τύπου (όχι byte) Παράδειγµα (εγγραφή δεδοµένων) Έτσι ανιχνεύουµε πως το αρχείο µας έφτασε στο τέλος (εδώ όχι in=-1) try { while (true) { int in = data.readint(); System.out.print(in + " "); catch (EOFException eof) { data.close(); catch (IOException e) { System.out.println("Error -- " + e.tostring()); Σύνοψη Μεθόδων 17

Σύνοψη Μεθόδων Σύνοψη Μεθόδων 18

Σύνοψη Μεθόδων Εγγραφή / Ανάγνωση Κειµένου Ηίδια φιλοσοφία ισχύει και για τα αρχεία κειµένου (χαρακτήρων) Μόνο τα ονόµατα των κλάσεων αλλάζουν που τώρα διαχειρίζονται ροές χαρακτήρων και όχι γενικά ροές δεδοµένων ηµιουργία ροής κειµένου FileReader textfile = new FileReader( όνοµα αρχείου ) BufferedReader textfile = new BufferedReader(textfile) Οµοίως για εγγραφή: FileWriter, BufferedWriter Ισχύουν οι µέθοδοι read(), write(), close() 19

Εγγραφή / Ανάγνωση Κειµένου Εγγραφή / Ανάγνωση Κειµένου * * Συµπλήρωση: FileWriter fout = new FileWriter(file, append) όπου append βάζουµε true αν θέλουµε να συνεχίσουµε να γράφουµε στο τέλος του αρχείου αντί από την αρχή (δείτε Java API Help για περισσότερα στοιχεία) 20

Εγγραφή / Ανάγνωση Κειµένου Παράδειγµα import java.io.*; class ReadText { public static void main(string arguments[]) { FileReader text = new FileReader("readme.txt"); int inbyte = text.read(); do { Έτσι ανιχνεύουµε πως το αρχείο µας έφτασε στο τέλος inbyte = text.read(); if (inbyte!= -1) System.out.print((char)inByte); while (inbyte!= -1); System.out.println(" "); text.close; Εγγραφή / Ανάγνωση Κειµένου Παράδειγµα import java.io.*; public class ReadSource { public static void main(string[] arguments) { try { FileReader file = new FileReader("ReadSource.java"); BufferedReader buff = new BufferedReader(file); συνεχίζεται... 21

Εγγραφή / Ανάγνωση Κειµένου Παράδειγµα Έτσι ανιχνεύουµε πως το αρχείο µας έφτασε στο τέλος boolean eof = false; while (!eof) { String line = buff.readline(); if (line == null) eof = true; else System.out.println(line); buff.close(); catch (IOException e) { System.out.println("Error -- " + e.tostring()); Εγγραφή / Ανάγνωση Κειµένου Σύνθετο παράδειγµα ιάβασµα αρχείου κειµένου και µετατροπή των χαρακτήρων του σε κεφαλαίους import java.io.*; public class AllCapsDemo { public static void main(string[] arguments) { AllCaps cap = new AllCaps(arguments[0]); cap.convert(); συνεχίζεται... 22

Εγγραφή / Ανάγνωση Κειµένου Σύνθετο παράδειγµα class AllCaps { String sourcename; AllCaps(String sourcearg) { sourcename = sourcearg; void convert() { try { // Create file objects File source = new File(sourceName); File temp = new File("cap" + sourcename + ".tmp"); συνεχίζεται... Εγγραφή / Ανάγνωση Κειµένου Σύνθετο παράδειγµα // Create input stream FileReader fr = new FileReader(source); BufferedReader in = new BufferedReader(fr); // Create output stream FileWriter fw = new FileWriter(temp); BufferedWriter out = new BufferedWriter(fw); συνεχίζεται... 23

Εγγραφή / Ανάγνωση Κειµένου Σύνθετο παράδειγµα boolean eof = false; int inchar = 0; do { Έτσι ανιχνεύουµε πως το αρχείο µας έφτασε στο τέλος inchar = in.read(); if (inchar!= -1) { char outchar = Character.toUpperCase( (char)inchar ); out.write(outchar); else eof = true; while (!eof); in.close(); out.close(); συνεχίζεται... Εγγραφή / Ανάγνωση Κειµένου Σύνθετο παράδειγµα boolean deleted = source.delete(); if (deleted) temp.renameto(source); catch (IOException e) { System.out.println("Error -- " + e.tostring()); catch (SecurityException se) { System.out.println("Error -- " + se.tostring()); 24

Ανάγνωση από Πληκτρολόγιο Ηανάγνωση χαρακτήρων από το πληκτρολόγιο πραγµατοποιείται µε χρήση ροών δεδοµένων όπως και στην περίπτωση των αρχείων Χρησιµοποιούνται οι κλάσεις BufferedReader για υλοποίηση του buffer InputStreamReader για τη διαχείριση της ροής δεδοµένων της τυπικής εισόδου (standard input) Ανάγνωση από Πληκτρολόγιο 25

Συµπεράσµατα Για να αναφερθούµε σε ένα αρχείο και να το µετονοµάσουµε, διαγράψουµε κτλ πρέπει να δηµιουργήσουµε ένα αντικείµενο της κλάσης File Για να γράψουµε δικά µας αρχεία ή για να διαβάσουµε αρχεία σε/από ένα λογικό δίσκο πρέπει να χρησιµοποιήσουµε ροές δεδοµένων Συµπεράσµατα ιαφορετικά αντικείµενα εξυπηρετούν ροές διαφορετικών τύπων δεδοµένων FileInputStream/FileOutputStream για ροές δεδοµένων byte DataInputStream/DataOutputStream για ροές δεδοµένων τύπων διαφορετικών από byte FileReader/FileWriter για ροές χαρακτήρων InputStreamReader για ανάγνωση της ροής της τυπικής εισόδου (System.in) Σε όλες τις παραπάνω περιπτώσεις προτείνεται η χρήση ενδιάµεσης µνήµης (buffer) 26

Συµπεράσµατα Μελετήθηκαν 2 είδη υλοποιήσεων του buffer, µε τις κλάσεις: Για τις ροές δεδοµένων: BufferedInputStream/BufferedOutputStream Για τις ροές χαρακτήρων (αρχεία ή πληκτρολόγιο) BufferedWriter/BufferedReader 27