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



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

Εργαστήριο Java. Αντικείµενο: Δίκτυα. Χειρισµός URLs. Άσκηση 1. Lab11. Πακέτο java.net

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ημιουργία Γραφικού Περιβάλλοντος

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

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

Week 10: Graphical User Interfaces

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING

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

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

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

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

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

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

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΕΙΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ιανουάριος 2008 Οι απαντήσεις να είναι καθαρογραμμένες με ευδιάκριτους όλους του χαρακτήρες.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΓΡΑΦΙΚΕΣ ΔΙΕΠΑΦΕΣ ΧΡΗΣΤΗ- SWING (1)

Week 9: Input / Output

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

Εργαστήριο 7 - Άσκηση - Ανάλυση

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

ΚΕΡΑΜΟΠΟΥΛΟΣ ΕΥΚΛΕΙΔΗΣ

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

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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 12 : ΒΑΣΙΚΑ ΣΤΟΙΧΕΙΑ GUI AWT ΚΑΙ

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

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (java threads)

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Graphical User Interfaces (GUI) SWING

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

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

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

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

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

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

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

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

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

(Διαφάνειες Νίκου Βιδάκη)

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

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

Wrapper Classes, Abstract Classes and Interfaces

6. Εξαιρέσεις στη γλώσσα Java

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

Ειδικά Θέματα Προγραμματισμού

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

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

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

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

ΜΑΘΗΜΑ: Διαδικτυακές Εφαρμογές

API: Applications Programming Interface

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

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

Σύνθεταγραφικάσ ε Java

Διάλεξη 18η: Διαχείρηση Αρχείων

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

Περιεχόμενα. Πρόλογος 15

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

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

Transcript:

Εργαστήριο Java Αντικείμενο: Αρχεία Πακέτο java.io Πακέτο java.io.zip Στην Java δεν υπάρχει η έννοια των εγγραφών μέσα σε ένα αρχείο. Ο προγραμματιστής πρέπει να κατασκευάσει το αρχείο κατάλληλα έτσι ώστε να μπορεί να ακολουθήσει η σωστή ανάγνωσή του. Lab10 Η επεξεργασία αρχείων στην Java είναι μια μόνο από τις δυνατότητες που παρέχουν τα streams τα οποία γενικά μπορούν να διαβάζουν και να γράφουν στην μνήμη, σε αρχεία και σε δικτυακές συνδέσεις. Η Java αντιμετωπίζει κάθε αρχείο ως μια σειριακή ροή (stream) από bytes. Το τέλος του αρχείου σε κάποιες περιπτώσεις σηματοδοτείται από ένα exception ενώ σε κάποιες άλλες από την τιμή που επιστρέφει μια μέθοδος του αντίστοιχου stream. H Java παρέχει πολλές κλάσεις για να γίνει είσοδος / έξοδος σε αρχεία σε επίπεδο byte, χαρακτήρα και αντικειμένων. Τα streams χωρίζονται γενικά σε Character streams (FileReader, FileWriter κ.α.) και Byte streams (FileInputStream, FileOutputStream, DataInputStream, DataOutputStream κ.α.). Οι υπερκλάσεις των Character streams είναι η κλάση Reader και Writer αντίστοιχα ενώ των Byte streams οι InputStream και OutputStream. Κλάσεις Περιγραφή του stream που δημιουργούν FileReader FileWriter stream χαρακτήρων. FileInputStream FileOutputStream stream bytes. DataInputStream DataOutputStream stream πρωτογενών τύπων δεδομένων ObjectInputStream ObjectOutputStream stream αντικειμένων. Επιτρέπουν την ανάγνωση / εγγραφή ολόκληρων αντικειμένων από / σε ένα αρχείο. BufferedInputStream BufferedOutputStream Κάθε ενέργεια εγγραφής δεν γίνεται απευθείας στο αρχείο αλλά κατευθύνεται σε ένα buffer μνήμης. Όταν αυτός ο χώρος γεμίσει γίνεται μια ενέργεια εγγραφής για όλα τα δεδομένα που περιέχει. Αντίστοιχα η ανάγνωση από το αρχείο συνεπάγεται και την ταυτόχρονη μεταφορά σε ένα buffer περισσότερων δεδομένων από ότι ζητήθηκαν με σκοπό να καλύψει μελλοντικές αναγνώσεις. Πρόκειται για μια τεχνική βελτίωσης της απόδοσης των ενεργειών εισόδου εξόδου. RandomAccessFile Χρησιμοποιείται η ίδια κλάση για ανάγνωση και εγγραφή δεδομένων σε αρχεία τυχαίας προσπέλασης. Η κλάση File Αντικείμενα της κλάσης File χρησιμοποιούνται για να λάβουμε πληροφορίες για ένα αρχείο ή ένα φάκελο. Δεν παρέχει δυνατότητες επεξεργασίας σε επίπεδο αρχείου. Χρήσιμες συναρτήσεις exists() επιστρέφει true αν υπάρχει το αρχείο ή ο κατάλογος. canread() επιστρέφει true αν επιτρέπεται η ανάγνωση length() επιστρέφει το μέγεθος σε bytes του αρχείου lastmodified() επιστρέφει την ημερομηνία τροποποίησης του αρχείου list() επιστρέφει ένα πίνακα λεκτικών με τα περιεχόμενα ενός φακέλου. 1

Άσκηση 1 Να κατασκευάσετε εφαρμογή που να λαμβάνει ένα αρχείο κειμένου (source.txt) και να το αντιγράφει τα περιεχόμενά του σε ένα άλλο αρχείο με όνομα (target.txt) τοποθετώντας ένα επιπλέον κενό για κάθε κενό που συναντά. Επιπλέον να εμφανίζει το μέγεθος σε bytes του αρχείου source.txt. public class Lab10_01 { public static void main(string[] args) { File f1 = new File("source.txt"); File f2 = new File("target.txt"); System.out.println("File Size: " + f1.length()); FileReader fr = new FileReader(f1); FileWriter fw = new FileWriter(f2); int c; c=fr.read(); while (c!= -1){ char ch; ch=(char)c; if (ch==' ') fw.write((int)' '); fw.write(c); c=fr.read(); fr.close(); fw.close(); catch (IOException ex){ System.err.println("Πρόβλημα με τον χειρισμό του αρχείου"); Άσκηση 2 Να κατασκευάσετε εφαρμογή που να γράφει σε ένα αρχείο (apostasi.dat) την απόσταση στην οποία θα βρίσκεται από το σημείο έναρξης της κίνησης ένα ομαλά επιταχυνόμενο σώμα με επιτάχυνση 3 m/sec 2 για χρονικό διάστημα 100 δευτερολέπτων παρακολουθώντας την κίνηση κάθε ½ δευτερόλεπτο. public class Lab10_02a { public static void main(string[] args) throws IOException { File f1 = new File("apostasi.dat"); final double g=3; DataOutputStream dos = new DataOutputStream(new FileOutputStream(f1)); float t; double s; for (t=0.0f;t<=100.0;t+=0.5){ s=1.0/2.0*g*math.pow(t,2); dos.writefloat(t); dos.writedouble(s); dos.close(); Να διαβαστεί και να εμφανιστεί στην οθόνη το παραπάνω αρχείο. public class Lab10_02b { public static void main(string[] args) throws IOException { File f1 = new File("apostasi.dat"); //Απλό data input stream //DataInputStream dis = new DataInputStream(new FileInputStream(f1)); //buffered data input stream DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(f1))); float t; double s; 2

while (true){ t=dis.readfloat(); s=dis.readdouble(); System.out.println("Time: " + t + "sec. Distance: "+ s+"meters"); catch (EOFException ex){system.err.println("end of File reached"); dis.close(); Σειριακά αρχεία Interface Serializable Δεν περιέχει μεθόδους αλλά όσες κλάσεις το υλοποιούν μαρκάρονται (tagging interface) ότι είναι Serializable γεγονός που επιτρέπει στα αντικείμενά τους να γίνουν output από ένα ObjectOutputStream. Σε μια κλάση που υλοποιεί το Serializable ο προγραμματιστής πρέπει να διασφαλίσει ότι κάθε instance variable της κλάσης είναι τύπου Serializable αλλιώς πρέπει να δηλωθούν ως transient (εφήμερος) έτσι ώστε να αγνοηθούν κατά την διαδικασία του serialization. Όλοι οι πρωτογενείς τύποι είναι transient. Για τους άλλους τύπους πρέπει να ελεγχθεί ο ορισμός της κλάσης και πιθανώς η ορισμοί των υπερκλάσεων. Εγγραφή αντικειμένων Η εγγραφή και η ανάγνωση αντικειμένων είναι μια διαδικασία που ονομάζεται serialization. Η εγγραφή αντικειμένων γίνεται με την κλάση ObjectOutputStream και η ανάγνωση με την κλάση ObjectInputStream. Ένα πρόγραμμα ανοίγει ένα αρχείο δημιουργώντας ένα αντικείμενο της κλάσης FileInputStream ή της FileOutputStream. Η FileOutputStream παρέχει μεθόδους για το γράψιμο byte arrays και μεμονωμένων bytes σε αρχεία και όχι αντικείμενων. Γίνεται chaining of stream objects έτσι ώστε να μπορεί να εγγραφεί αντικείμενο. ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("Test.txt"))); Άσκηση 3 Να κατασκευάσετε εφαρμογή στην οποία ο χρήστης να εισάγει αντικείμενα μιας κλάσης που να περιέχει πληροφορίες για σπουδαστές (αριθμός μητρώου, όνομα, βαθμός) σε ένα αρχείο κάνοντας εγγραφή αντικειμένων με την κλάση ObjectOutputStream. Στην συνέχεια να κατασκευαστεί άλλη εφαρμογή που να διαβάζει και να εμφανίζει το αρχείο. Κλάση StudentRecord: Αντικείμενα αυτής της κλάσης πρόκειται να εισαχθούν στο αρχείο "students.dat" import java.io.serializable; public class StudentRecord implements Serializable { private int am; private String name; private double grade; public StudentRecord() {this(0,"",0.0); public StudentRecord(int a, String b, double c){setvalues(a,b,c); public void setvalues(int a, String b, double c){ am=a; name=b; grade=c; public int getam(){return am; public String getname(){return name; public double getgrade(){return grade; 3

Κλάση Lab10_03a: Υλοποιεί το ακόλουθο GUI μέσω του οποίου γίνεται η εγγραφή αντικειμένων "StudentRecord" στο αρχείο import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Lab10_03a extends JFrame { private ObjectOutputStream oos; private File f; private JLabel l1,l2,l3; private JTextField t1,t2,t3; private JButton b1,b2; public Lab10_03a() { super("σειριακό αρχείο"); Container c=getcontentpane(); c.setlayout(new GridLayout(4,2)); l1=new JLabel("Κωδικός"); l2=new JLabel("Όνομα"); l3=new JLabel("Βαθμός"); t1=new JTextField(10); t2=new JTextField(10); t3=new JTextField(10); b1=new JButton("Αποθήκευση εγγραφής"); b2=new JButton("Κλείσιμο αρχείου"); openfile(); b1.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){newrecord(); ); b2.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){ ); this.addwindowlistener(new WindowAdapter(){ public void windowclosing(windowevent e){ if (oos!=null) newrecord(); ); c.add(l1);c.add(t1); c.add(l2);c.add(t2); c.add(l3);c.add(t3); c.add(b1);c.add(b2); setsize(400,150); setvisible(true); public void openfile(){ f=new File("students.dat"); //chaining of stream objects oos=new ObjectOutputStream(new FileOutputStream(f)); catch (IOException ex){ JOptionPane.showMessageDialog(this,"Λάθος κατά το άνοιγμα", "Λάθος", JOptionPane.ERROR_MESSAGE); 4

public void closefile(){ // το κλείσιμο του stream γίνεται από το πλέον εξωτερικό αντικέιμενο stream. oos.close(); System.exit(0); catch (IOException ex){ JOptionPane.showMessageDialog(this,"Λάθος κατά το κλείσιμο", "Λάθος", JOptionPane.ERROR_MESSAGE); System.exit(1); catch (NullPointerException ex){ System.exit(2); public void newrecord(){ StudentRecord r; int am; String na; double gr; am=integer.parseint(t1.gettext()); na=t2.gettext(); gr=double.parsedouble(t3.gettext()); r=new StudentRecord(am, na, gr); oos.writeobject(r); catch (NumberFormatException ex){ JOptionPane.showMessageDialog(this,"Λάθος αριθμητικά δεδομένα", catch (IOException ex){ JOptionPane.showMessageDialog(this,"Πρόβλημα κατά την εγγραφή","λάθος",joptionpane.error_message); clearfields(); public void clearfields(){ t1.settext(""); t2.settext(""); t3.settext(""); public static void main(string []args){ Lab10_03a a=new Lab10_03a(); a.setdefaultcloseoperation(windowconstants.dispose_on_close); Κλάση Lab10_03b: Υλοποιεί το GUI μέσω του οποίου γίνεται η ανάγνωση αντικειμένων "StudentRecord" από το αρχείο import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Lab10_03b extends JFrame { private ObjectInputStream ois; private JLabel l1,l2,l3; private JTextField t1,t2,t3; private JButton b1,b2,b3; 5

public Lab10_03b() { super("σειριακό αρχείο ανάγνωση"); Container c=getcontentpane(); c.setlayout(new GridLayout(5,2)); l1=new JLabel("Κωδικός"); l2=new JLabel("Όνομα"); l3=new JLabel("Βαθμός"); t1=new JTextField(10); t2=new JTextField(10); t3=new JTextField(10); b1=new JButton("Επόμενη εγγραφή"); b2=new JButton("Κλείσιμο αρχείου"); b3=new JButton("Mέσος όρος βαθμών"); openfile(); b1.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){nextrecord(); ); b2.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){ ); b3.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){showaveragegrade(); ); this.addwindowlistener(new WindowAdapter(){ public void windowclosing(windowevent e){ ); c.add(l1);c.add(t1); c.add(l2);c.add(t2); c.add(l3);c.add(t3); c.add(b1);c.add(b2);c.add(b3); setsize(400,150); setvisible(true); public void openfile(){ File f=new File("students.dat"); //chaining of stream objects ois=new ObjectInputStream(new FileInputStream(f)); catch (IOException ex){ JOptionPane.showMessageDialog(this,"Λάθος κατά το άνοιγμα","λάθος",joptionpane.error_message); public void closefile(){ // το κλείσιμο του stream γίνεται από το πλέον εξωτερικό αντικείμενο stream. ois.close(); System.exit(0); catch (IOException ex){ OptionPane.showMessageDialog(this,"Λάθος κατά το κλείσιμο","λάθος",joptionpane.error_message); System.exit(1); catch (NullPointerException ex){system.exit(2); public void nextrecord(){ StudentRecord r; r=(studentrecord) ois.readobject(); t1.settext(string.valueof(r.getam())); t2.settext(r.getname()); t3.settext(string.valueof(r.getgrade())); catch (EOFException ex){ b1.setenabled(false); JOptionPane.showMessageDialog(this,"Δεν υπάρχουν άλλες εγγραφές","τέλος εγγραφών",joptionpane.error_message); catch (ClassNotFoundException ex){//πρέπει να δηλωθεί λόγω της readobject() JOptionPane.showMessageDialog(this,"Δεν δημιουργήθηκε το αντικείμενο","δεν υπάρχει η κλάση",joptionpane.error_message); 6

catch (IOException ex){ JOptionPane.showMessageDialog(this,"Πρόβλημα κατά την ανάγνωση","λάθος",joptionpane.error_message); System.err.println(ex.toString()); public void showaveragegrade(){ StudentRecord r; double sum=0.0; int i=0; ois.close(); openfile(); while (true){ r=(studentrecord)ois.readobject(); sum=sum+r.getgrade(); i++; catch (EOFException ex){b1.setenabled(false); catch (ClassNotFoundException ex){ JOptionPane.showMessageDialog(this,"Δεν δημιουργήθηκε το αντικείμενο","δεν υπάρχει η κλάση",joptionpane.error_message); catch (IOException ex){ JOptionPane.showMessageDialog(this,"Πρόβλημα κατά τον χειρισμό του αρχείου","λάθος",joptionpane.error_message); System.exit(1); JOptionPane.showMessageDialog(this,"Μέσος όρος" + sum/i, "Average", JOptionPane.INFORMATION_MESSAGE); public static void main(string []args){ Lab10_03b a=new Lab10_03b(); a.setdefaultcloseoperation(windowconstants.dispose_on_close); Τα δεδομένα που αποθηκεύονται σε ένα σειριακό αρχείο δεν μπορούν να τροποποιηθούν αν δεν αναγνωστούν όλα τα στοιχεία και εγγραφούν εκ νέου. Αρχεία τυχαίας προσπέλασης Η χρήση σειριακών αρχείων συνεπάγεται σοβαρούς περιορισμούς ταχύτητας καθώς δεν είναι δυνατή η απευθείας πρόσβαση στα δεδομένα αλλά πρέπει πρώτα να προηγηθεί "πέρασμα" από όλα εκείνα τα δεδομένα που προηγούνται σο αρχείο. Τα αρχεία τυχαίας προσπέλαση λύνουν το παραπάνω πρόβλημα. Η κλάση RandomAccessFile χρησιμοποιείται για εγγραφή αλλά και για ανάγνωση δεδομένων. Κατά την δημιουργία ενός αντικειμένου RandomAccessFile θα πρέπει να προσδιοριστεί το εάν πρόκειται να γίνεται ανάγνωση μόνο ή ανάγνωση και εγγραφή στο αντίστοιχο αντικείμενο. π.χ. new RandomAccessFile("test.txt", "r"); ή new RandomAccessFile("test.txt", "rw"); Από την στιγμή που το αρχείο έχει ανοιχθεί με την χρήση των μεθόδων read και write μπορούν να γίνουν ενέργειες εισόδου εξόδου πάνω στο αρχείο. Χρήσιμες συναρτήσεις int skipbytes(int) μετακινεί τον δείκτη του αρχείου για ένα αριθμό bytes προς τα εμπρός. void seek(long) Τοποθετεί τον δείκτη του αρχείου ακριβώς πριν από το συγκεκριμένο byte. long getfilepointer() επιστρέφει την τρέχουσα θέση σε bytes του δείκτη του αρχείου. 7

Άσκηση 4 Να κατασκευάσετε εφαρμογή στην οποία ο χρήστης να εισάγει δεδομένα που αφορούν στοιχεία υπαλλήλων (κωδικός, όνομα, μισθός) σε ένα αρχείο τυχαίας προσπέλασης. Στην συνέχεια να κατασκευαστεί άλλη εφαρμογή που να διαβάζει και να εμφανίζει το αρχείο. Κλάση Lab10_04a: Δημιουργεί αρχείο με 100 θέσεις και όνομα "RSALARIE.DAT" για διατήρηση στοιχείων υπαλλήλων. import javax.swing.*; public class Lab10_04a{ public static void main(string args[]){ RandomAccessFile file; file = new RandomAccessFile("RSALARIE.DAT", "rw"); StringBuffer buff=new StringBuffer(); for(int i=0;i<100;i++) { buff.setlength(15); file.writeint(0); file.writechars(buff.tostring()); file.writedouble(0.0); file.close(); catch (IOException e) { "Λάθος κατά το άνοιγμα του αρχείου ", Κλάση Lab10_04b: Υλοποιεί το GUI μέσω του οποίου γίνεται η εγγραφή δεδομένων από τον χρήστη προς το αρχείο τυχαίας προσπέλασης. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Lab10_04b extends JFrame { private JLabel codel, namel, salaryl; private JTextField codetf, nametf, salarytf; private JButton saveb, exitb; private RandomAccessFile file; public Lab10_04b(){ super("random File Write Example"); Container c= getcontentpane(); codel=new JLabel("Κωδικός"); namel=new JLabel("Όνομα"); salaryl=new JLabel("Μισθός"); codetf=new JTextField(); nametf=new JTextField(); salarytf=new JTextField(); saveb=new JButton("Αποθήκευση"); saveb.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){ int a; String b; double c; StringBuffer buff=null; 8

a=integer.parseint(codetf.gettext()); b=nametf.gettext(); buff= new StringBuffer(b); buff.setlength(15); c=double.parsedouble(salarytf.gettext()); file.seek((a-1)*(42)); file.writeint(a); file.writechars(buff.tostring()); file.writedouble(c); catch (NumberFormatException fex){ "Λάθος στις αριθμητικές τιμές", "Λάθος",JOptionPane.ERROR_MESSAGE); catch (IOException ioex){ "Λάθος κατά την εγγραφή στο αρχείο", "Λάθος",JOptionPane.ERROR_MESSAGE); clear(); );//τέλος Listener για πλήκτρο αποθήκευση addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we){ if (file!=null) ); exitb=new JButton("Έξοδος"); exitb.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){ ); c.setlayout(new GridLayout(4,2)); c.add(codel); c.add(codetf); c.add(namel); c.add(nametf); c.add(salaryl); c.add(salarytf); c.add(saveb); c.add(exitb); file = new RandomAccessFile("RSALARIE.DAT","rw"); catch (IOException e){ "Λάθος κατά το άνοιγμα του αρχείου ", setsize(600,100); setvisible(true); public void clear(){ codetf.settext(""); nametf.settext(""); salarytf.settext(""); private void closefile(){ file.close(); catch (IOException ex){ "Λάθος κατά το κλείσιμο του αρχείου ", System.exit(0); public static void main(string args[]){ Lab10_04b app= new Lab10_04b(); Κλάση Lab10_04c: Υλοποιεί το GUI μέσω του οποίου γίνεται η ανάγνωση δεδομένων από το αρχείο τυχαίας προσπέλασης. 9

import java.awt.*; import java.awt.event.*; import java.text.decimalformat; import javax.swing.*; public class Lab10_04c extends JFrame { private JLabel codel, namel, salaryl; private JTextField codetf, nametf, salarytf; private JButton nextb, exitb; private RandomAccessFile file; public Lab10_04c() { super("random File Read Example"); Container c= getcontentpane(); codel=new JLabel("Κωδικός"); namel=new JLabel("Όνομα"); salaryl=new JLabel("Μισθός"); codetf=new JTextField(); nametf=new JTextField(); salarytf=new JTextField(); nextb=new JButton("Επόμενο"); nextb.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){ DecimalFormat df=new DecimalFormat("0.00 Euro"); int a; char name[]=new char[15]; double c; do{ a=file.readint(); for (int i=0;i<name.length;i++){ name[i]=file.readchar(); c=file.readdouble(); while (a==0); codetf.settext(string.valueof(a)); nametf.settext(new String(name)); salarytf.settext(df.format(c)); catch (EOFException eofex){ "Τέλος δεδομένων","τέλος", JOptionPane.INFORMATION_MESSAGE); catch (IOException ioex){ "Λάθος κατά την ανάγνωση από το αρχείο", "Λάθος",JOptionPane.ERROR_MESSAGE); );//τέλος Listener για πλήκτρο next addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we){ if (file!=null) ); exitb=new JButton("Έξοδος"); exitb.addactionlistener(new ActionListener(){ public void actionperformed(actionevent e){ 10

); c.setlayout(new GridLayout(4,2)); c.add(codel); c.add(codetf); c.add(namel); c.add(nametf); c.add(salaryl); c.add(salarytf); c.add(nextb); c.add(exitb); file = new RandomAccessFile("RSALARIE.DAT", "rw"); catch (IOException e){ "Λάθος κατά το άνοιγμα του αρχείου ", setsize(600,100); setvisible(true); public void clear(){ codetf.settext(""); nametf.settext(""); salarytf.settext(""); private void closefile(){ file.close(); catch (IOException ex){ "Λάθος κατά το κλείσιμο του αρχείου ", System.exit(0); public static void main(string args[]) { Lab10_04c app= new Lab10_04c(); 11