Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Εισαγωγή στον Προγ/μό Υπολογιστών

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Εισαγωγή στον Προγ/μό Υπολογιστών"— Μεταγράφημα παρουσίασης:

1 Εισαγωγή στον Προγ/μό Υπολογιστών
Αρχεία Δεδομένων Διδάσκων: Μιχάλης Τίτσιας

2 Χρησιμοποιώντας Αρχεία Δεδομένων
Οι εφαρμογές που εμπλέκουν αναζήτηση και ταξινόμηση εργάζονται με συλλογές δεδομένων που είναι πολύ μεγάλες για να δημιουργηθούν με το χέρι. Για το λόγο αυτό θα θέλαμε να διαβάζουμε αυτόματα τα δεδομένα από αρχεία. Αρχείο είναι το γενικό όνομα για οποιαδήποτε συλλογή δεδομένων που εμπεριέχει διάφορους τύπους μόνιμων μέσων αποθήκευσης που είναι συνδεδεμένα σε έναν υπολογιστή. Στις περισσότερες περιπτώσεις, ένα αρχείο αποθηκεύεται σε έναν σκληρό δίσκο, αλλά μπορεί όμως να αποθηκευτεί και σε ένα αφαιρούμενο μεσό, όπως ένα CD. Τα αρχεία μπορεί να περιέχουν διαφόρων τύπων πληροφορίες. Όταν για παράδειγμα, μεταγλωττίζουμε ένα πρόγραμμα Java, ο μεταγλωττιστής αποθηκεύει την έξοδο του σε ένα σύνολο αρχείων τάξης (class files), καθένα από τα οποία περιέχει δυαδικά δεδομένα που σχετίζονται με μια τάξη. Ο πιο συχνός τύπος αρχείων, όμως, είναι το αρχείο κειμένου (text file), που περιέχουν χαρακτήρες κειμένου.

3 Αρχεία κειμένων vs. Συμβολοσειρών
Αν και τα αρχεία κειμένου και οι συμβολοσειρές περιέχουν και τα δύο χαρακτήρες, είναι σημαντικό να λάβουμε υπόψη μας τις ακόλουθες σημαντικές διαφορές ανάμεσα τους: Η πληροφορία που αποθηκεύεται σ’ένα αρχείο είναι μόνιμη. Η τιμή μιας μεταβλητής συμβολοσειράς υπάρχει όσο υπάρχει η μεταβλητή. Οι τοπικές μεταβλητές εξαφανίζονται όταν μια μέθοδος τελειώνει και οι μεταβλητές αντικειμένων εξαφανίζονται όταν εξαφανιστεί το αντικείμενο, πράγμα που συμβαίνει συνήθως όταν τελειώνει το πρόγραμμα. Η πληροφορία ενός αρχείου υπάρχει μέχρι την διαγραφή του. 1. Τα αρχεία συνήθως διαβάζονται σειριακά. Όταν διαβάζετε δεδομένα από αρχεία, συνήθως ξεκινάτε από την αρχή και διαβάζεται τους χαρακτήρες με την σειρά, είτε ξεχωριστά είτε σε ομάδες που συνήθως είναι ανεξάρτητες γραμμές. Αφού έχετε διαβάσει ένα σύνολο χαρακτήρων, στην συνέχεια μετακινήστε στο επόμενο σύνολο χαρακτήρων μέχρι να φτάσετε στο τέλος του αρχείου. 2.

4 Διαβάζοντας Αρχεία Κειμένου
Για να διαβάσουμε δεδομένα από ένα αρχείο κειμένου σ’ένα πρόγραμμα Java, πρέπει να ακολουθήσουμε τα εξής βήματα: Δημιουργία ενός νέου αντικειμένου τάξης BufferedReader συνδεδεμένο με τα δεδομένα του αρχείου. Η φάση αυτή ονομάζεται άνοιγμα του αρχείου. 1. Κλήση των μεθόδων που παρέχει η τάξη BufferedReader για να διαβάσουμε δεδομένα σειριακά. 2. Κλείσιμο της συσχέτισης ανάμεσα στον reader και το αρχείο καλώντας την μέθοδο close, ώστε να κλείσει το αρχείο. 3. Η τάξη BufferedReader της Java δίνει την δυνατότητα να διαβάσουμε δεδομένα από αρχεία με διάφορους τρόπους. Μπορούμε να διαβάσουμε μεμονωμένους χαρακτήρες με την μέθοδο read. Μπορούμε να διαβάσουμε γραμμές με την μέθοδο readLine. Μπορούμε να διαβάσουμε λεκτικές μονάδες μέσω της τάξης Scanner. Κάθε στρατηγική περιγράφεται παρακάτω.

5 Τυπικές Υποκλάσεις της Reader
Το πακέτο java.io ορίζει αρκετές υποκλάσεις της γενικής κλάσης Reader. Για να διαβάσουμε αρχεία κειμένων, πρέπει να χρησιμοποιήσουμε τις παρακάτω υποκλάσεις: Την κλάση FileReader, που επιτρέπει την δημιουργία απλών reader (αρκεί μόνο να της παρέχουμε το όνομα του αρχείου). Η τάξη BufferedReader, που κάνει όλες τις λειτουργίες πιο αποδοτικές και επιτρέπει το διάβασμα μεμονωμένων γραμμών. Το τυπικό ιδίωμα για το άνοιγμα ενός αρχείου κειμένου είναι η κλήση των κατασκευαστών για κάθε μία από αυτές τις κλάσεις σε μία μόνο πρόταση: BufferedReader rd = new BufferedReader( new FileReader( filename)); Ο κατασκευαστής της FileReader παίρνει το όνομα του αρχείου και δημιουργεί έναν απλό reader. Ο reader αυτός στην συνέχεια δίνεται ως όρισμα στον κατασκευαστή της BufferedReader.

6 Ανάγνωση Χαρακτήρων από Αρχείο
Αφού δημιουργήσετε το αντικείμενο της BufferedReader όπως φαίνεται στην προηγούμενη διαφάνεια, μπορείτε να διαβάσετε μεμονωμένους χαρακτήρες από το αρχείο καλώντας την μέθοδο read. Η μέθοδος read επιστρέφει τον επόμενο χαρακτήρα ενός αρχείου, όμως τον επιστρέφει ως ακέραιο (int). Αν υπάρχουν εναπομείναντες χαρακτήρες στο αρχείο, η κλήση της read επιστρέφει την τιμή σε Unicode του επόμενου. Αν δεν υπάρχουν άλλοι χαρακτήρες, τότε η read επιστρέφει -1. Το κομμάτι κώδικα που ακολουθεί, για παράδειγμα, μετρά τον αριθμό των γραμμάτων ενός BufferedReader με όνομα rd: int nLetters = 0; while (true) { int ch = rd.read(); if (ch == -1) break; if (Character.isLetter(ch)) nLetters++; }

7 Ανάγνωση Γραμμών από Αρχείο
Μπορείτε επίσης να διαβάσετε ολόκληρες γραμμές από ένα αρχείο καλώντας την μέθοδο readLine, που επιστρέφει την επόμενη γραμμή δεδομένων από το αρχείο σαν συμβολοσειρά (string) αφού αφαιρέσει οποιονδήποτε χαρακτήρα αλλαγής γραμμής. Αν δεν υπάρχουν άλλες γραμμές, η readLine επιστρέφει null. Το παρακάτω κομμάτι κώδικα χρησιμοποιεί την μέθοδο readLine για να βρει το μήκος της μεγαλύτερης γραμμής του reader rd: int maxLength = 0; while (true) { String line = rd.readLine(); if (line == null) break; maxLength = Math.max(maxLength, line.length()); } Η χρήση της μεθόδου readLine κάνει τα προγράμματα φορητά επειδή εξαλείφει την ανάγκη να σκεφτούμε τι χαρακτήρας αλλαγής γραμμής χρησιμοποιείται από το λειτουργικό σύστημα (Unix: \n, Windows: \r\n).

8 Χειρισμός Εξαιρέσεων Δυστυχώς,η διαδικασία ανάγνωσης δεδομένων από αρχείο δεν είναι τόσο απλή όσο δείχνουν οι παραπάνω διαφάνειες. Ότα εργάζεστε με τάξεις του πακέτου java.io, πρέπει πάντα να αναφέρεται τι συμβαίνει αν μια λειτουργία αποτύχει. Στην περίπτωση ανοίγματος αρχείου, για παράδειγμα, πρέπει να ορίσετε τι θα κάνει το πρόγραμμα αν το αρχείο που προσπαθείτε να ανοίξετε δεν υπάρχει. Οι τάξεις της βιβλιοθήκης της Java συχνά σε τέτοιες περιπτώσεις απαντούν πετώντας μια εξαίρεση, που είναι μια από τις στρατηγικές που οι μέθοδοι της Java μπορούν να χρησιμοποιήσουν για να αναφέρουν μια απροσδόκητη κατάσταση. Αν ο κατασκευαστής της FileReader, για παράδειγμα, δεν βρίσκει το αρχείο, τότε πετά μια IOException ώστε να μας ενημερώσει για το γεγονός. Όταν η Java πετά μια εξαίρεση, τότε σταματά ό,τι κάνει και κοιτά το ιστορικό εκτέλεσης της για να δει αν κάποια μέθοδος έχει δηλώσει πως πιάνει “catching” αυτή την εξαίρεση μέσω μιας πρόταση try όπως φαίνεται στην επόμενη διαφάνεια.

9 Η Δήλωση (Statement) try
Η Java χρησιμοποιεί την πρόταση try για να δηλώσει ενδιαφέρον για το πιάσιμο μια εξαίρεσης. Στην απλούστερη μορφή της η σύνταξη της πρότασης try είναι try { code in which an exception might occur } catch (type identifier) { code to respond to the exception } Όπου type είναι το όνομα κάποιας τάξης εξαίρεσης και identifier είναι το όνομα της μεταβλητής που αποθηκεύει την εξαίρεση. Το εύρος των προτάσεων στις οποίες μπορεί να πιαστεί η εξαίρεση περιέχει όχι μόνο τις προτάσεις που βρίσκονται ρητά μέσα στο σώμα της try αλλά και οποιαδήποτε μέθοδο ή πρόταση (statement) κληθεί από εκεί. Αν η εξαίρεση συμβεί μέσα σε κάποια άλλη μέθοδο, τυχόν μεταγενέστερα πλαίσια της στοίβας (stack) αφαιρούνται μέχρι ο έλεγχος του προγράμματος να επιστρέψει στην ίδια την πρόταση try.

10 Η Δήλωση (Statement) try
Ο σχεδιασμός του πακέτου java.io μας αναγκάζει να χρησιμοποιήσουμε προτάσεις try για να πιάσουμε εξαιρέσεις που μπορεί να συμβούν. Για παράδειγμα, αν ανοίξετε ένα αρχείο χωρίς έλεγχο εξαιρέσεων, ο compiler της Java θα αναφέρει ότι υπάρχει σφάλμα στο πρόγραμμα. Το πρόγραμμα ReverseFile στις επόμενες διαφάνειες δείχνει την χρήση της πρότασης try σε δύο διαφορετικές συνθήκες: Μέσα στην μέθοδο openFileReader, το πρόγραμμα χρησιμοποιεί μια πρόταση try για να ελέγξει αν υπάρχει το αρχείο. Αν δεν υπάρχει, η πρόταση catch τυπώνει ένα μήνυμα που εξηγεί στον χρήστη την αποτυχία και έπειτα ζητά από αυτόν ένα νέο όνομα αρχείου. Μέσα στην μέθοδο readLineArray, ο κώδικας χρησιμοποιεί μια πρόταση try για να δει εάν ένα σφάλμα I/O έχει συμβεί.

11 Το πρόγραμμα ReverseFile
import acm.program.*; import acm.util.*; import java.io.*; import java.util.*; /** This program prints the lines from a file in reverse order */ public class ReverseFile extends ConsoleProgram { public void run() { println("This program reverses the lines in a file."); BufferedReader rd = openFileReader("Enter input file: "); String[] lines = readLineArray(rd); for (int i = lines.length - 1; i >= 0; i--) { println(lines[i]); } /* * Implementation note: The readLineArray method on the next slide * uses an ArrayList internally because doing so makes it possible * for the list of lines to grow dynamically. The code converts * the ArrayList to an array before returning it to the client. */ page 1 of 3 skip code

12 Το πρόγραμμα ReverseFile
/* * Requests the name of an input file from the user and then opens * that file to obtain a BufferedReader. If the file does not * exist, the user is given a chance to reenter the file name. */ private BufferedReader openFileReader(String prompt) { BufferedReader rd = null; while (rd == null) { try { String name = readLine(prompt); rd = new BufferedReader(new FileReader(name)); } catch (IOException ex) { println("Can't open that file."); } return rd; /* * Reads all available lines from the specified reader and returns * an array containing those lines. This method closes the reader * at the end of the file. */ private String[] readLineArray(BufferedReader rd) { ArrayList<String> lineList = new ArrayList<String>(); try { while (true) { String line = rd.readLine(); if (line == null) break; lineList.add(line); } rd.close(); } catch (IOException ex) { throw new ErrorException(ex); String[] result = new String[lineList.size()]; for (int i = 0; i < result.length; i++) { result[i] = lineList.get(i); return result; page 3 of 3

13 Το πρόγραμμα ReverseFile
/* * Reads all available lines from the specified reader and returns * an array containing those lines. This method closes the reader * at the end of the file. */ private String[] readLineArray(BufferedReader rd) { ArrayList<String> lineList = new ArrayList<String>(); try { while (true) { String line = rd.readLine(); if (line == null) break; lineList.add(line); } rd.close(); } catch (IOException ex) { throw new ErrorException(ex); String[] result = new String[lineList.size()]; for (int i = 0; i < result.length; i++) { result[i] = lineList.get(i); return result; import acm.program.*; import acm.util.*; import java.io.*; import java.util.*; /** This program prints the lines from a file in reverse order */ public class ReverseFile extends ConsoleProgram { public void run() { println("This program reverses the lines in a file."); BufferedReader rd = openFileReader("Enter input file: "); String[] lines = readLineArray(rd); for (int i = lines.length - 1; i >= 0; i--) { println(lines[i]); } /* * Implementation note: The readLineArray method on the next slide * uses an ArrayList internally because doing so makes it possible * for the list of lines to grow dynamically. The code converts * the ArrayList to an array before returning it to the client. */ page 2 of 3 skip code

14 Χρησιμοποιώντας της Τάξη Scanner
Είναι επίσης δυνατόν να χωρίσουμε ένα αρχείο σε λεκτικές μονάδες μέσω της τάξης Scanner του πακέτου java.util (ένα μεγάλο πλεονέκτημα της Scanner είναι ότι χειρίζεται τις εξαιρέσεις εσωτερικά, οπότε δεν είναι αναγκαίο να γράφουμε συνέχεια try/catch). Οι πιο χρήσιμες μέθοδοι της τάξης Scanner φαίνονται στον παρακάτω πίνακα : new Scanner(reader) Δημιουργεί νέο αντικείμενο της Scanner από τον reader. next() Επιστρέφει την επόμενη λεκτική μονάδα ως string. nextInt() Επιστρέφει τον επόμενο ακέραιο (int). nextDouble() Επίστρεφει τον επόμενο αριθμό double. nextBoolean() Επιστρέφει την επόμενη Boolean τιμή (true ή false). hasNext() Επιστρέφει true αν δεν υπάρχουν άλλες λεκτικές μονάδες. hasNextInt() Επιστρέφει true αν η επόμενη λεκτική μονάδα είναι int. hasNextDouble() Επιστρέφει true αν η επόμενη λεκτική μονάδα είναι αριθμός hasNextBoolean() Επιστρέφει true αν η επόμενη λεκτική μονάδα είναι boolean close() Κλείνει το scanner και τον reader που χρησιμοποιεί.

15 Εγγραφή Αρχείων Το πακέτο java.io δίνει την δυνατότητα δημιουργίας νέων αρχείων χρησιμοποιώντας της κατάλληλες υποκλάσεις της γενικής κλάσης Writer. Όταν γράφετε δεδομένα σε ένα αρχείο, η πιο κλασική προσέγγιση είναι να δημιουργήσετε έναν PrintWriter ως εξής: PrintWriter wr = new PrintWriter( new FileWriter( filename)); Όπως στο παράδειγμα του reader, ο φωλιασμένος αυτός κατασκευαστής δημιουργεί έναν FileWriter για το όνομα αρχείου που του δόθηκε στην συνέχεια περνά το αποτέλεσμα στον κατασκευαστή του PrintWriter. Αφού αποκτήσετε ένα αντικείμενο PrintWriter, μπορείτε να γράψετε δεδομένα μέσω του writer χρησιμοποιώντας τις μεθόδους println και print που χρησιμοποιείται και στα προγράμματα κονσόλας.

16 Διάβασμα για το σπίτι Ενότητα 12.4 από «Η Τέχνη και Επιστήμη της JAVA: Μια εισαγωγή στην Επιστήμη των Υπολογιστών», E. Roberts


Κατέβασμα ppt "Εισαγωγή στον Προγ/μό Υπολογιστών"

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google