Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

DAIMI, AUIntroducerende Objektorienteret Programmering1 Persistens, I/O og strømme Input og output, datastrømme i Java, objekt serialisering.

Lignende præsentationer


Præsentationer af emnet: "DAIMI, AUIntroducerende Objektorienteret Programmering1 Persistens, I/O og strømme Input og output, datastrømme i Java, objekt serialisering."— Præsentationens transcript:

1 DAIMI, AUIntroducerende Objektorienteret Programmering1 Persistens, I/O og strømme Input og output, datastrømme i Java, objekt serialisering

2 DAIMI, AUIntroducerende Objektorienteret Programmering2 Persistens  At data er persistent betyder (i denne sammenhæng) at data overlever mellem programafviklinger.  Normalt dør alle objekter og variable når et program afsluttes: Deres tilstand glemmes.  I de mange sammenhænge er dette naturligvis uacceptabelt.

3 DAIMI, AUIntroducerende Objektorienteret Programmering3 Persistens i Java  Java indeholder en pakke, java.io, som indeholder klasser til at læse og skrive data, f.eks. fra et lagermedie såsom en filstruktur. Disse klasser er bygget med størst mulig fleksibilitet for øje.  Omkostningen ved denne fleksibilitet er stor kompleksitet, bla. er der over 48 forskellige klasser at vælge imellem, to basalt forskellige tilgange til persistens, samt fire (næsten) parallelle klassehierarkier.

4 DAIMI, AUIntroducerende Objektorienteret Programmering4 Princip i gennemgang  Vi vil atter ikke dvæle ved detaljer, men prøve at give et overblik og illustrere vha. små eksempler.

5 DAIMI, AUIntroducerende Objektorienteret Programmering5 To tilgangsvinkler  Java tilbyder to vidt forskellige tilgange til persistens  Den klassiske: Et programs tilstand opfattes som en samling bytes og/eller tegn, som programmøren skal skrive og læse fra filer på filsystemet.  Den objekt-orienterede: Et programs tilstand er repræsenteret ved objekter, som selv kan finde ud af at skrive og indlæse sig selv fra filsystemet.

6 DAIMI, AUIntroducerende Objektorienteret Programmering6 Den klassiske  Java tilbyder den klassiske type persistens, hvor programmøren selv håndterer det at skrive og læse data.  Java skelner (som stort set alle andre computerbaserede systemer) mellem binær- og tekstuel data.  Binær data:.class,.exe,.doc, …  Tekstuel data:.txt,.java,...

7 DAIMI, AUIntroducerende Objektorienteret Programmering7 IO hierarkier  De to typer håndteres af hver deres hierarkier af klasser.  Binære data Læsning: Sker vha. specialiseringer af InputStream Skrivning: Vha. specialiseringer af OutputStream  Tekstuel data Læsning: Specialiseringer af Reader Skrivning: Specialiseringer af Writer

8 DAIMI, AUIntroducerende Objektorienteret Programmering8 I/O og strømme  Al kommunikation med omverdenen fra et Java program (I/O = input/output) sker via strømme (streams).  En strøm flyder fra en kilde (source) og til et afløb (sink).   Således opfattes skærmen (System.out) som et afløb og keyboardet (System.in) en kilde: De aftager eller producerer data, i dette tilfælde tegn.

9 DAIMI, AUIntroducerende Objektorienteret Programmering9 Readers og Writers  En Reader (eller InputStream) modellerer en kilde (input)  En Writer (OutputStream) modellerer et afløb (output) Data-kilde Data-afløb ReaderWriter

10 DAIMI, AUIntroducerende Objektorienteret Programmering10 Fysiske og virtuelle strømme  Både binære og tekstuelle, såvel som input- og output-strømme deles i to kategorier:  Fysiske datastrømme: En fil, en streng, zip fil,… bruges som kilde eller afløb  Virtuelle datastrømme: Kilde/afløb er en anden fysisk eller virtuel datastrøm

11 DAIMI, AUIntroducerende Objektorienteret Programmering11 “Rørlægning” i Java  Virtuelle strømme bevirker at vi kan lave filtre, dvs. lade datastrømmen løbe igennem en række virtuelle strømme som bearbejder data undervejs på forskellig vis.  Dette er analogt til f.eks. hvordan et renseanlæg til en swimming pool virker på badevandet: filtreringKalkspaltningVarmelegmeKlorering

12 DAIMI, AUIntroducerende Objektorienteret Programmering12 Writer eksempel public static void putQuoteIn( String filename ) throws FileNotFoundException, IOException { // Skab en output writer på den givne fil FileWriter fw = new FileWriter( filename ); // Og skab et filter foran filwriteren som kan formattere tekst PrintWriter pw = new PrintWriter( fw ); pw.println( "Keep it simple, as simple as possible," ); pw.println( " but no simpler." ); pw.println( " - Albert Einstein" ); // Når man lukker en reader/writer lukker den automatisk alle // ned ad strømmen. pw.close(); } Fysisk datawriter Virtuel datawriter

13 DAIMI, AUIntroducerende Objektorienteret Programmering13 Writer eksempel Strengen: “Keep it simple…” PrintWriter FileWriter filen: “quote.txt” println write

14 DAIMI, AUIntroducerende Objektorienteret Programmering14 Reader eksempel: ‘type” public static void typeOnScreen( File f ) throws FileNotFoundException, IOException { FileReader fr = new FileReader( f ); BufferedReader br = new BufferedReader( fr ); String line; while ( (line = br.readLine()) != null ) { System.out.println( line ); } br.close(); }

15 DAIMI, AUIntroducerende Objektorienteret Programmering15 Reader eksempel: “grep” public static void grepOnScreen( String target, File f ) throws FileNotFoundException, IOException { FileReader fr = new FileReader( f ); GrepReader br = new GrepReader( target, fr ); String line; while ( (line = br.readLine()) != null ) { System.out.println( line ); } br.close(); }

16 DAIMI, AUIntroducerende Objektorienteret Programmering16 GrepReader class GrepReader extends BufferedReader { String pattern; public GrepReader( String target, Reader inputReader ) { super( inputReader ); pattern = target; } public String readLine() throws IOException { String line; return line; } do { } while ((line != null) && line.indexOf(pattern) == -1); line = super.readLine();

17 DAIMI, AUIntroducerende Objektorienteret Programmering17 Den objektorienterede  Antag vi har en vektor af objekter, som vi vil kunne læse ind og ud af en fil.  Kræver at myType kan konvertere en tekstpræsentation til den indre repræsentation. Skrivning: Vector v = ….; Enumeration e = v.elements(); while ( e.hasMoreElements() ) { myType m = (myType) e.nextElement(); stream.println( m ); } Læsning: ???

18 DAIMI, AUIntroducerende Objektorienteret Programmering18 Objekt serialisering  Problemet med at konvertere til og fra et objekts interne repræsentation (int, char, andre objekter, i computerens lager) til en ekstern repræsentation (bytes i en fil) hedder objekt serialisering.  Problemstillingen kompliceres af at eet objekt jo ofte refererer til et eller flere andre: f.eks. vektor eksemplet fra før.

19 DAIMI, AUIntroducerende Objektorienteret Programmering19 Interface Serializable  Java er elegant på dette punkt. Det eneste man skal gøre er, at erklære at ens klasse implementerer interfacet Serializable. Derefter kan objekter af klassen læses og skrives vha. virtuelle datastrømme: ObjectInputStream hhv. ObjectOutputStream, som igen kan bruge binære datastrømme som afløb.  public class myType implements Serializable {  …  }

20 DAIMI, AUIntroducerende Objektorienteret Programmering20 Eksempel: stringVectorOut // Skab først nogle objekter som skal 'streames' ud på en fil Vector v = new Vector(); v.addElement( "Hello World!" ); v.addElement( "Object persistence is easy in Java!" ); v.addElement( "Isn't IOOP just a great course?" ); FileOutputStream fo = new FileOutputStream( "svo.dat" ); ObjectOutputStream oo = new ObjectOutputStream( fo ); oo.writeObject( v ); oo.flush(); oo.close();

21 DAIMI, AUIntroducerende Objektorienteret Programmering21 Eksempel: stringVectorIn // Skab en input strøm svarende til filen svo.dat FileInputStream fi = new FileInputStream( "svo.dat" ); ObjectInputStream io = new ObjectInputStream( fi ); Vector v = (Vector) io.readObject(); io.close(); // Udskriv hvad vi fik ud. System.out.println("Vector read, now lets see whats in it: " ); Enumeration e = v.elements(); while ( e.hasMoreElements() ) { String s = (String) e.nextElement(); System.out.println( "Element is: \""+s+"\"" ); }

22 DAIMI, AUIntroducerende Objektorienteret Programmering22 Serialisering  Smart; men hvad sker der egentlig?  Ikke alene vektor ‘v’ selv bliver serialiseret, men også alle objekter, som v refererer til! "Hello World!" "Object persistence is easy in Java!" "Isn't IOOP just a great course?" v:

23 DAIMI, AUIntroducerende Objektorienteret Programmering23 Transitiv lukning  Man kalder dette den transitive lukning af objektgrafen; dvs. hvis vi serialiserer objektet O bliver alle objekter som O referer til, direkte eller indirekte, også serialiseret.  Transitive regel:  A = B og B = C  A = C  Analogt, hvis relationen  betyder ‘afhængig af’:  A  B og B  C  A  C  Transitive lukning af  :  TL(O) = { objekter o’ | O  o’ }

24 DAIMI, AUIntroducerende Objektorienteret Programmering24 Serialiseringskrav  For at Java kan serialiserer et objekt, O, kræves naturligvis at alle objekter som O transitivt refererer til, implementerer Serializable.  Eller på matematisk:  o  TL(O) : o implementerer Serializable

25 DAIMI, AUIntroducerende Objektorienteret Programmering25 Smart, men farligt  Objekt serialisering er smart, men der er nogle faldgruber  1) Hvad med en reference til en AWT-dialog? Ja, så kommer hele AWT hierarkiet med, og det fylder! Java har løsningen via en modification som hedder transient.  2) Hvis en klasses definition ændres, kan I ikke længere læse de gamle filer. Slemt...

26 DAIMI, AUIntroducerende Objektorienteret Programmering26 Filhåndtering  Filer kan opfattes som objekter via klassen File. Denne klasse stiller metoder til rådighed til at slette filer, test eksistensen af en fil, fortælle om det er en fil eller et katalog, liste indhold af kataloger, og meget andet.  Set eksemplerne på ugesedlen og check dokumentationen

27 DAIMI, AUIntroducerende Objektorienteret Programmering27 Undtagelseshåndtering  At læse og skrive filer er “beskidt arbejde” idet der kan opstå alle mulige fejlsituationer: Filen eksisterer ikke/allerede, disk fyldt,disk defekt, …  Dette dækkes af Java’s exception mekanisme, undtagelseshåndtering.  Vi vil ikke gå nærmere ind i dette her, men fodgængerreglen er at en metode, hvori en undtagelse kan opstå skal erklære en throws i metode-definitionen

28 DAIMI, AUIntroducerende Objektorienteret Programmering28 Eksempel public static void grepOnScreen( String target, File f ) throws FileNotFoundException, IOException { FileReader fr = new FileReader( f ); GrepReader br = new GrepReader( target, fr ); String line; while ( (line = br.readLine()) != null ) { System.out.println( line ); } br.close(); }


Download ppt "DAIMI, AUIntroducerende Objektorienteret Programmering1 Persistens, I/O og strømme Input og output, datastrømme i Java, objekt serialisering."

Lignende præsentationer


Annoncer fra Google