Είσοδος & Έξοδος Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης Έκδοση: 2010.12.09
Ρεύµατα (Streams) 2 Ένας ορισµός του ρεύµατος Αφαιρετική έννοια για κάτι το οποίο παράγει (πηγή εισόδου) ή καταναλώνει (προορισµός εξόδου) δεδοµένα Είδη ρευµάτων byte, κυρίως για δυαδικά δεδοµένα χαρακτήρες, κυρίως για δεδοµένα κειµένου
Προκαθορισµένα Ρεύµατα 3 Προκαθορισµένα ρεύµατα System.in, System.out, System.err Πρόκειται για ρεύµατα δυαδικών δεδοµένων System.in Προκαθορισµένο ρεύµα εισόδου Συνήθως αντιστοιχεί στην είσοδο από το πληκτρολόγιο System.out Προκαθορισµένο ρεύµα φυσιολογικής εξόδου Συνήθως αντιστοιχεί στην έξοδο προς την οθόνη System.err Προκαθορισµένο ρεύµα εξόδου για σφάλµατα Συνήθως αντιστοιχεί στην έξοδο προς την οθόνη
Μορφοποιηµένη Έξοδος στην Οθόνη 4 Η κλάση PrintStream Τα αντικείµενα System.out και System.err είναι τύπου PrintStream, o οποίoς επιτρέπει τη µορφοποιηµένη έξοδο byte Υπάρχει αντίστοιχη κλάση PrintWriter για µορφοποιηµένη έξοδο χαρακτήρων print, println format ή printf (όπως η printf της C) UsingPrintf
Συµβολοσειρά Μορφοποίησης (1/3) 5 οµή συµβολοσειράς µορφοποίησης %[θέση$] [σηµαίες] [πλάτος] [.ακριβεια] τύπος Θέση Για επαναχρησιµοποίηση της ίδιας παραµέτρου σε διαφορετικά σηµεία, ενδεχοµένως µε διαφορετικό τύπο Για αλλαγή της σειράς εµφάνισης των παραµέτρων Πλάτος Ελάχιστο πλάτος εµφάνισης (δεξιά στοίχιση) Σηµαία: '-' Αριστερή στοίχιση µέσα στο ελάχιστο πλάτος
Συµβολοσειρά Μορφοποίησης (2/3) 6 ιάφορα %% (%) %n (ορθή αλλαγή γραµµής ανάλογα µε το λειτουργικό) Τύπος String %s, %S Ακρίβεια: µέγιστο πλάτος κειµένου (το κόβει αν είναι παραπάνω) Τύπος Character %c, %C Τύπος Boolean %b, %B
Συµβολοσειρά Μορφοποίησης (3/3) 7 Ακέραιος %d, %x, %X, %o ακρίβεια: δεν επιδέχεται Πραγµατικός %f, %e, %E Η printf λαµβάνει υπόψη τις τοπικές ρυθµίσεις του συστήµατος (Locale) ακρίβεια: αριθµός δεκαδικών (γίνεται στρογγυλοποίηση) Σηµαίες για αριθµούς '+': προσθέτει ένα + µπροστά από τους θετικούς ' ': προσθέτει ένα κενό µπροστά από θετικούς για αριστερή στοίχιση µε αρνητικούς '0': γεµίζει µε µηδενικά αντί κενών το ελάχιστο πλάτος ',': εµφανίζει τον διαχωριστή χιλιάδων
Είσοδος από το Πληκτρολόγιο 8 Η απευθείας χρήση του System.in είναι δύσκολη Χρησιµοποιείται η βοηθητική κλάση java.util.scanner Αρχικοποίηση της Scanner µε το System.in Scanner scanner = new Scanner(System.in); Μέθοδοι για ανάγνωση δεδοµένων nextbyte(), nextshort(), nextint(), nextlong() nextfloat(), nextdouble() nextboolean() nextline() για ανάγνωση συµβολοσειράς ή χαρακτήρα Λαµβάνει υπόψη τις τοπικές ρυθµίσεις uselocale() AddInt, AddDouble
Ρεύµατα Byte 9 Είσοδος και έξοδος πληροφορίας ανά 8 bit Χαµηλού επιπέδου είσοδος και έξοδος, στην οποία στηρίζονται οι υπόλοιπες κλάσεις εισόδου και εξόδου Αφηρηµένες κλάσεις InputStream, OutputStream Μέθοδοι.read(), διαβάζει το επόµενο byte και το επιστρέφει ως int, ή επιστρέφει -1 αν έφτασε το τέλος του ρεύµατος.write(int b), γράφει ένα byte (µέσω int).write(byte[] a), γράφει έναν πίνακα από byte Αρχεία στο δίσκο FileInputStream, FileOutputStream To µονοπάτι προς το αρχείο δίνεται ως παράµετρος στον κατασκευαστή io.copybytes
Ρεύµατα Χαρακτήρων (1/2) 10 Είσοδος και έξοδος χαρακτήρων Μετατροπή από/προς Unicode (UTF-8) αναπαράσταση χαρακτήρων µέσα στη Java (16 bit) προς/από το τοπικό σύνολο χαρακτήρων συστήµατος (8 bit) Αφηρηµένες κλάσεις Reader, Writer Μέθοδοι.read(), διαβάζει τον επόµενο χαρακτήρα και τον επιστρέφει ως int, ή -1 αν έφτασε στο τέλος.write(int b), γράφει ένα χαρακτήρα (µέσω int).write(string str1), γράφει µια συµβολοσειρά.write(char[] buf), γράφει πίνακα χαρακτήρων
Ρεύµατα Χαρακτήρων (2/2) 11 Αρχεία στο δίσκο FileReader, FileWriter To µονοπάτι προς το αρχείο δίνεται ως παράµετρος στον κατασκευαστή Γενικές κλάσεις µετατροπής χαρακτήρων - bytes InputStreamReader, OutputStreamWriter Χρησιµοποιούν ρεύµατα byte για είσοδο/έξοδo byte και αναλαµβάνουν την µετατροπή σε/από χαρακτήρες Τα αντικείµενα ρευµάτων byte δίνονται ως παράµετρος στον κατασκευαστή τους Π.χ. για ανάγνωση/εγγραφή χαρακτήρων πάνω από δικτυακά sockets io.copycharacters
Ενδιάµεση Μνήµη (1/2) 12 Είσοδος/έξοδος χωρίς ενδιάµεση µνήµη Το λειτουργικό σύστηµα πρέπει να διαχειριστεί την κάθε κλήση για είσοδο και έξοδο ξεχωριστά Σπατάλη πόρων Είσοδος/έξοδος µε ενδιάµεση µνήµη Χώρος στη µνήµη που πρέπει να γεµίσει για να κληθεί το λειτουργικό για είσοδο ή έξοδο Καλύτερη διαχείριση πόρων
Ενδιάµεση Μνήµη (2/2) 13 Κλάσεις για bytes BufferedInputStream, BufferedOutputStream Κλάσεις για χαρακτήρες BufferedReader, BufferedWriter Αρχικοποίηση Αντικείµενο κλάσης χωρίς ενδιάµεση µνήµη ως παράµετρος στον κατασκευαστή BufferedReader in = new BufferedReader(new FileReader("in.txt")); Επιβολή άµεσης εξόδου της ενδιάµεσης µνήµης.flush()
Είσοδος - Έξοδος Γραµµής Κειµένου 14 BufferedReader, BufferedReader f; f = new BufferedReader(new FileReader("a.txt")); readline() ιαβάζει γραµµή ανεξάρτητα από το λειτουργικό σύστηµα (είτε τελειώνει µε '\r' ή '\r\n' ή '\n') PrintWriter PrintWriter f = new PrintWriter(new BufferedWriter(new FileWriter("b.txt"))); print, println, format, printf Μορφοποιηµένη έξοδος χαρακτήρων io.copylines, io.countwords
Ρεύµατα εδοµένων 15 Είσοδος και έξοδος δυαδικών δεδοµένων Πρωτόγονοι τύποι και String ως δυαδικά δεδοµένα ιεπαφές DataInput, DataOutput Πιο δηµοφιλείς κλάσεις που τις υλοποιούν DataInputStream, DataOutputStream Μέθοδοι writeint(), writedouble(), writeutf() readint(), readdouble(), readutf() Η ανάγνωση γίνεται µέχρι να προκύψει EOFException io.data
Ρεύµατα Αντικειµένων (1/2) 16 Serializable Η κλάση, αντικείµενα της οποίας θέλουµε να στείλουµε (πάρουµε) σε (από) ένα ρεύµα αντικειµένων θα πρέπει Nα δηλώσει ότι υλοποιεί τη διεπαφή serializable Να περιέχει µόνο πρωτόγονους τύπους ή και κλάσεις, οι οποίες όµως επίσης υλοποιούν τη διεπαφή serializable, Η διεπαφή serializable δεν ορίζει µεθόδους, απλά δηλώνει σηµασιολογικά ότι επιτρέπεται το serialization
Ρεύµατα Αντικειµένων (2/2) 17 Κλάσεις ObjectInputStream, ObjectOutputStream Αρχικοποίηση Περιτύλιγµα ενός ρεύµατος byte new ObjectOutputStream(new FileOutputStream("a")); new ObjectInputStream(new FileInputStream("b")); Μέθοδοι.writeObject().readObject(), η οποία απαιτεί type casting io.persisenttime, io.flattentime, io.inflatetime io.student, io.secretary
Πολύπλοκα Αντικείµενα 18 Το serialization χρησιµοποιείται πολλές φορές για τη "βαθιά" αντιγραφή αντικειµένων io.complex, io.human, io.home
Πολλαπλές Εγγραφές 19 Έστω ότι γράφουµε πολλές φορές το ίδιο αντικείµενο στο ίδιο ρεύµα Object ob = new Object(); out.writeobject(ob); out.writeobject(ob); Στην πράξη το γράφουµε µόνο µία φορά και η δεύτερη είναι απλή αναφορά στο ίδιο αντικείµενο Στο παρακάτω παράδειγµα οι δύο µεταβλητές δείχνουν στο ίδιο αντικείµενο Object ob1 = in.readobject(); Object ob2 = in.readobject(); io.multipleobjects
Αρχεία Τυχαίας Προσπέλασης 20 Γιατί τα χρειαζόµαστε; Για εφαρµογές όπου διαβάζουµε ή γράφουµε συγκεκριµένες εγγραφές και όχι όλο το αρχείο Αρχικοποίηση RandomAccessFile r; r = new RandomAccessFile("random.dat", "r"); r = new RandomAccessFile("random.dat", "rw"); Μετακίνηση (σε bytes) από την αρχή του αρχείου long newpos = 100; r.seek(newpos);
Αρχεία Τυχαίας Προσπέλασης 21 Μέθοδοι για εγγραφή και ανάγνωση byte int read(), int read(byte[] b) write(int b), write(byte[] b) Υλοποιεί τη διεπαφή DataInput, DataOutput writeint(), writedouble(), writeutf() readint(), readdouble(), readutf() io.randomaccessdemo
Η Κλάση File 22 Αναπαριστά µια απόλυτη ή σχετική διεύθυνση ενός αρχείου ή φακέλου σε ένα σύστηµα αρχείων File f1 = new File("input.txt"); File f2 = new File("../examples"); Χρησιµότητα Όχι για άνοιγµα ή επεξεργασία αρχείων Για ανάκτηση πληροφοριών σχετικά µε τα αρχεία Για λειτουργίες σε αρχεία και φακέλους ιαγραφή και µετονοµασία αρχείων, δηµιουργία φακέλων Ανεξάρτητο από το λειτουργικό σύστηµα Περιέχει στοιχεία, όπως οι χαρακτήρες διαχωρισµού φακέλων και διαδροµών
Μέθοδοι ιαχείρισης ιευθύνσεων 23 Έστω εκτέλεση του File a = new File("../example/input.txt"); Στο φάκελο c:\java\example στα Windows /home/cafe/java/example στο Linux Μέθοδος a.tostring() a.getname() a.getparent() a.getabsolutepath() a.getcanonicalpath() input.txt..\example c:\java\example\..\ example\input.txt c:\java\example\ input.txt Windows..\example\input.txt../examples/input.txt input.txt../example Linux /home/cafe/java/example/../ example/input.txt /home/cafe/java/example/inp ut.txt
Μέθοδοι Πληροφόρησης 24.isAbsolute().exists().isFile() ή.isdirectory().lastmodified().length().list() Επιστρέφει τα περιεχόµενα καταλόγου File[] File.listRoots() Επιστρέφει όλους τους root φακέλους του συστήµατος io.filestuff
Μέθοδοι ιαχείρισης 25.delete() ιαγραφή αρχείου.mkdir() ηµιουργία καταλόγου.mkdirs() ηµιουργία καταλόγου και όλων όσων αναφέρονται στη διαδροµή και δεν υπάρχουν.renameto(file f) Μετονοµασία