Java IO Introduktion 1 Introduktion Input och output

  • Slides: 122
Download presentation
Java I/O Introduktion 1

Java I/O Introduktion 1

Introduktion • Input och output – Applikationer läser in data (input) – Applikationer skriver

Introduktion • Input och output – Applikationer läser in data (input) – Applikationer skriver data (output) • Data – – Förflyttas mellan olika källor eller system Överförs och behandlas som olika grundläggande typer Representerar information Kan transformeras i olika steg 2

Introduktion • Informationskällor – En fil (i minnet, på hårddisk, på diskett) – En

Introduktion • Informationskällor – En fil (i minnet, på hårddisk, på diskett) – En resurs i ett nätverk (nätverkskoppling, databasserver) – En datatyp i minnet (primitiv, objekt) • Typer av data vid överföring – Bytes – Text (characters) • Bytes utgör binära data och representerar – – Primitiva datatyper eller objekt Ljud Bilder och film Text med begränsade teckenuppsättningar 3

Introduktion • Överföring och transformering – Obuffrat eller buffrat – Klartext eller kryptering –

Introduktion • Överföring och transformering – Obuffrat eller buffrat – Klartext eller kryptering – Okomprimerat eller komprimerat • Teckenuppsättningar – – – ASCII-7 ASCII-8 ISO 8859 -1 (Latin 1) UTF-8 Unicode • Plattformsberoende tecken – Radbrytning, separationstecken i sökvägar m. m. 4

Introduktion Input och output i Java • Bygger på konceptet strömmar • Generella algoritmer

Introduktion Input och output i Java • Bygger på konceptet strömmar • Generella algoritmer för sekventiell läsning och skrivning Läsning Skrivning Öppna en ström Så länge mer information finns, läs från strömmen Så länge mer information finns, skriv till strömmen Stäng strömmen 5

Introduktion Indelning av strömmar • En ström är antingen – Byte-orienterad (byteströmmar) – Tecken-orienterad

Introduktion Indelning av strömmar • En ström är antingen – Byte-orienterad (byteströmmar) – Tecken-orienterad (teckenströmmar) • En ström har en riktning – Läsning (inströmmar) – Skrivning (utströmmar) 6

Introduktion Indelning av strömmar • Inströmmar – Ett program ska hämta/läsa information – En

Introduktion Indelning av strömmar • Inströmmar – Ett program ska hämta/läsa information – En ström öppnas över/mot en informationskälla – Data läses sekventiellt 7

Introduktion Indelning av strömmar • Utströmmar – Ett program ska sända/skriva information – En

Introduktion Indelning av strömmar • Utströmmar – Ett program ska sända/skriva information – En ström öppnas över/mot en informationskälla – Data läses sekventiellt 8

Introduktion Indelning av strömmar • Grundläggande strömmar – Gör grovjobbet – Kalls ibland fundamentala

Introduktion Indelning av strömmar • Grundläggande strömmar – Gör grovjobbet – Kalls ibland fundamentala eller underliggande • Filter – – Opererar på en underliggande ström Kan transformera data under läsning och skrivning Kan utöka med fler specifika metoder Vissa teckenströmmar kan också sägas höra hit 9

Introduktion Användning av strömmar • Allmänt gäller att – – En ström öppnas implicit

Introduktion Användning av strömmar • Allmänt gäller att – – En ström öppnas implicit när den skapas Metoder för att läsa Metoder för att skriva En ström bör stängas explicit • För vissa strömmar gäller att – De explicit måste tömmas vid skrivning 10

Introduktion Användning av strömmar • Ihopkoppling – – Strömmar kombineras till önskat resultat Först

Introduktion Användning av strömmar • Ihopkoppling – – Strömmar kombineras till önskat resultat Först finns en grundläggande ström Därefter kopplas en filterström ovanpå denna Därefter kopplas en till … och kanske en till … o s v 11

Introduktion API • Grundläggande klasser finns i paketet java. io • Andra klasser finner

Introduktion API • Grundläggande klasser finns i paketet java. io • Andra klasser finner man exempelvis i java. util. zip javax. crypto • Ett mer avancerat API finns i java. nio – samt olika underpaket till detta 12

Introduktion API • Två klasshierarkier • Baseras på den typ av data de opererar

Introduktion API • Två klasshierarkier • Baseras på den typ av data de opererar på – Teckenströmmar opererar på text – Byteströmmar opererar på bytes 13

Introduktion API • Hierarkierna speglar varandra • Abstrakta superklasser – Fundamentala metoder • Konkreta

Introduktion API • Hierarkierna speglar varandra • Abstrakta superklasser – Fundamentala metoder • Konkreta subklasser – Ärver och/eller överlagrar metoder – Utökar med fler metoder 14

Introduktion API • Polymorfism • Subklasser ”speglar” superklasser • Superklasser används polymorft genom subklasserna

Introduktion API • Polymorfism • Subklasser ”speglar” superklasser • Superklasser används polymorft genom subklasserna • Detaljer göms och abstraheras bort • Ibland är man omedveten om typen av ström • Enkel användning 15

Java I/O Byteströmmar 16

Java I/O Byteströmmar 16

Byteströmmar • Läser och skriver bytes • I java är varje byte 8 bitar

Byteströmmar • Läser och skriver bytes • I java är varje byte 8 bitar • Används i regel för binära data – Bilder – Ljud • Kan användas för text men – Kräver att programmeraren skriver tolkande kod – Begränsade till teckenuppsättningen ISO-Latin 1 17

Byteströmmar Inströmmar • Abstrakta superklassen java. io. Input. Stream • Konkreta subklasser – Läser

Byteströmmar Inströmmar • Abstrakta superklassen java. io. Input. Stream • Konkreta subklasser – Läser från någon form av databank – Utför filterfunktioner (processande 18

Byteströmmar Inströmmar • Partiell hierarki Sequence. Input. Stream Data. Input. Stream Object. Input. Stream

Byteströmmar Inströmmar • Partiell hierarki Sequence. Input. Stream Data. Input. Stream Object. Input. Stream Buffered. Input. Stream Filter. Input. Stream Byte. Array. Input. Stream File. Input. Stream Pushback. Input. Stream Cipher. Input. Stream ZIPInput. Stream Piped. Input. Stream Superklass Filterström Databankström 19

Byteströmmar Grundläggande inströmmar Input. Stream • Fundamentala metoder för att läsa – Råa bytes

Byteströmmar Grundläggande inströmmar Input. Stream • Fundamentala metoder för att läsa – Råa bytes – Arrayer av råa bytes public abstract int read() throws IOException public int read(byte[] input, int offset, int length) throws IOException public long skip(long n) throws IOException public int available() throws IOException public void close() throws IOException 20

Byteströmmar Grundläggande inströmmar • Tillhandahåller dessutom metoder för – Markering av en position i

Byteströmmar Grundläggande inströmmar • Tillhandahåller dessutom metoder för – Markering av en position i strömmen – Hoppa över input – Återställa den aktuella positionen i strömmen • Vissa inströmmar stödjer alltid detta – Buffered. Input. Stream – Byte. Array. Input. Stream • Övriga måste kedjas till en buffrad ström först! 21

Byteströmmar Grundläggande inströmmar read() – Läsa en byte i taget är ofta ineffektivt i

Byteströmmar Grundläggande inströmmar read() – Läsa en byte i taget är ofta ineffektivt i nätverk – Exempelvis genererar varje TCP segment minst 40 bytes overhead i form av routing och felkorrigering – Att läsa 1 kb, 1 byte i taget, medför då totalt ca 40 kb read(byte[] input) read(byte[] input, int offset, int length) – – En enskild läsning av många bytes är oftast mer effektiv Ackumulerar bytes i en buffert Läser först när ett visst antal ackumulerats Att buffra 1 kb före läsning innebär totalt ca 1 kb + 40 b 22

Byteströmmar Grundläggande inströmmar • Övriga grundläggande inströmmar – Använder samma metoder – Läser från

Byteströmmar Grundläggande inströmmar • Övriga grundläggande inströmmar – Använder samma metoder – Läser från olika media – Byte. Array. Input. Stream läser data till en array av bytes – File. Input. Stream läser data från en binär fil – Piped. Input. Stream trådning av en inström och en utström – Telnet. Input. Stream läser data från en nätverkskoppling 23

Byteströmmar Filtrerande inströmmar • Utökar funktionalitet – – – Filter. Input. Stream superklass för

Byteströmmar Filtrerande inströmmar • Utökar funktionalitet – – – Filter. Input. Stream superklass för Data. Input. Stream konverterar till primitiva datatyper Buffered. Input. Stream buffrar data under läsning Pushback. Input. Stream trycka tillbaka, inspektera, ångra Cipher. Input. Stream dekrypterar data under läsning ZIPInput. Stream packar upp komprimerade data under läsning – Sequence. Input. Stream logisk sammanslagning av inströmmar – Object. Input. Stream läser in bytes som ett objekt 24

Byteströmmar Utströmmar • Abstrakta superklassen java. io. Output. Stream • Konkreta subklasser – Utför

Byteströmmar Utströmmar • Abstrakta superklassen java. io. Output. Stream • Konkreta subklasser – Utför filterfunktioner (processande) – Skriver till någon form av databank – Utför specialfunktioner som hantering av objekt 25

Byteströmmar Utströmmar • Partiell hierarki Data. Output. Stream Object. Output. Stream Buffered. Output. Stream

Byteströmmar Utströmmar • Partiell hierarki Data. Output. Stream Object. Output. Stream Buffered. Output. Stream Filter. Output. Stream Byte. Array. Output. Stream File. Output. Stream Print. Stream Cipher. Output. Stream ZIPOutput. Stream Piped. Output. Stream Superklass Filterström Databankström 26

Byteströmmar Grundläggande utströmmar Output. Stream • Fundamentala metoder för att skriva – Råa bytes

Byteströmmar Grundläggande utströmmar Output. Stream • Fundamentala metoder för att skriva – Råa bytes – Arrayer av råa bytes public abstract void write(int b) throws IOException public void write(byte[] data, int offset, int length) throws IOException public void flush() throws IOException public void close() throws IOException 27

Byteströmmar Grundläggande utströmmar write(int b) – Lika ineffektivt att skriva som att läsa en

Byteströmmar Grundläggande utströmmar write(int b) – Lika ineffektivt att skriva som att läsa en byte i taget – De buffrande metoderna kan därför användas write(byte[] data) write(byte[] data, int offset, int length) 28

Byteströmmar Grundläggande utströmmar • Övriga grundläggande utströmmar – Använder samma metoder – Skriver till

Byteströmmar Grundläggande utströmmar • Övriga grundläggande utströmmar – Använder samma metoder – Skriver till olika media – File. Output. Stream skriver data till en binär fil – Byte. Array. Output. Stream läser data till en utökningsbar array – Piped. Output. Stream trådning av en utström och en inström – Telnet. Output. Stream skriver data till en nätverkskoppling 29

Byteströmmar Filtrerande utströmmar • Utökar funktionalitet – – – Filter. Output. Stream superklass för

Byteströmmar Filtrerande utströmmar • Utökar funktionalitet – – – Filter. Output. Stream superklass för Data. Output. Stream skriver primitiva datatyper Buffered. Output. Stream buffrar data under skrivning Cipher. Output. Stream krypterar data under skrivning ZIPOutput. Stream komprimerar data under skrivning – Object. Output. Stream skriver ut ett objekt som bytes 30

Byteströmmar • Vissa klasser gör grovjobbet • Andra utökar funktionalitet • Men endast råa

Byteströmmar • Vissa klasser gör grovjobbet • Andra utökar funktionalitet • Men endast råa bytes hanteras • Vad innebär dessa bytes? – – – Bilder, ljud, video, objekt, text Upp till programmeraren att avgöra Ofta är det intuitivt Andra gånger krävs kod som tolkar dessa bytes Lyckligtvis finns andra alternativ för text 31

Java I/O Teckenströmmar 32

Java I/O Teckenströmmar 32

Teckenströmmar • Kallas ibland läsare (readers) och skrivare (writers) • Opererar på text/tecken (characters)

Teckenströmmar • Kallas ibland läsare (readers) och skrivare (writers) • Opererar på text/tecken (characters) • Kopplas ibland ihop med byte-orienterade strömmar – Utgör då en speciell form av filter – Konverterar mellan bytes och tecken 33

Teckenströmmar • Bygger på teckenuppsättningen Unicode • Varje tecken utgör två bytes, eller 16

Teckenströmmar • Bygger på teckenuppsättningen Unicode • Varje tecken utgör två bytes, eller 16 bitar • Godtyckliga tecken kan därför representeras • Kan därför hantera godtyckliga textformat – ASCII-7 – ASCII-8 – Latin-1 – UTF-8 34

Teckenströmmar Inströmmar • Abstrakta superklassen java. io. Reader • Konkreta subklasser – Läser från

Teckenströmmar Inströmmar • Abstrakta superklassen java. io. Reader • Konkreta subklasser – Läser från någon form av databank – Utför filterfunktioner (processande) 35

Teckenströmmar Inströmmar • Partiell hierarki Buffered. Reader Line. Number. Reader Char. Array. Reader Input.

Teckenströmmar Inströmmar • Partiell hierarki Buffered. Reader Line. Number. Reader Char. Array. Reader Input. Stream. Reader File. Reader Filter. Reader Pushback. Reader Piped. Reader String. Reader Superklass Filterström Databankström 36

Teckenströmmar Grundläggande inströmmar Reader • Speglar Input. Stream • Fundamentala metoder för att läsa

Teckenströmmar Grundläggande inströmmar Reader • Speglar Input. Stream • Fundamentala metoder för att läsa – Tecken (char) – Arrayer av tecken public abstract int read(char[] text, int offset, int length) throws IOException public int read(char[] text) throws IOException public long skip(long n) throws IOException public void close() throws IOException 37

Teckenströmmar Grundläggande inströmmar • Tillhandahåller dessutom metoder för – Markering av en position i

Teckenströmmar Grundläggande inströmmar • Tillhandahåller dessutom metoder för – Markering av en position i strömmen – Hoppa över input – Återställa den aktuella positionen i strömmen • Vissa inströmmar stödjer alltid detta • Övriga måste kedjas till en buffrad ström först! 38

Teckenströmmar Grundläggande inströmmar read() – Kan ibland vara ineffektivt att läsa ett tecken i

Teckenströmmar Grundläggande inströmmar read() – Kan ibland vara ineffektivt att läsa ett tecken i taget – De buffrande metoderna kan därför användas read(char[] text) read(char[] text, int offset, int length) 39

Teckenströmmar Grundläggande inströmmar • Övriga grundläggande inströmmar – Använder samma metoder – Läser från

Teckenströmmar Grundläggande inströmmar • Övriga grundläggande inströmmar – Använder samma metoder – Läser från olika media – – Char. Array. Reader läser tecken från en array File. Reader läser textfiler Piped. Reader som motsvarande byteström fast för tecken String. Reader läser från en sträng 40

Teckenströmmar Filtrerande inströmmar • Utökar funktionalitet – Input. Stream. Reader konverterar bytes till tecken

Teckenströmmar Filtrerande inströmmar • Utökar funktionalitet – Input. Stream. Reader konverterar bytes till tecken – Buffered. Reader buffrar data under läsning – Line. Buffered. Reader håller reda på radnummer – Filter. Reader superklass för vissa typer av filter – Pushback. Reader trycka tillbaka, inspektera, ångra 41

Teckenströmmar Utströmmar • Abstrakta superklassen java. io. Writer • Konkreta subklasser – Skriver till

Teckenströmmar Utströmmar • Abstrakta superklassen java. io. Writer • Konkreta subklasser – Skriver till någon form av databank – Utför filterfunktioner (processande) 42

Teckenströmmar Utströmmar • Partiell hierarki Buffered. Writer Char. Array. Writer Output. Stream. Reader Writer

Teckenströmmar Utströmmar • Partiell hierarki Buffered. Writer Char. Array. Writer Output. Stream. Reader Writer File. Writer Filter. Writer Piped. Writer String. Writer Print. Writer Superklass Filterström Databankström 43

Teckenströmmar Grundläggande utströmmar Writer • Speglar Output. Stream • Fundamentala metoder för att skriva

Teckenströmmar Grundläggande utströmmar Writer • Speglar Output. Stream • Fundamentala metoder för att skriva – Tecken (char) – Arrayer av tecken public abstract void write(char[] text, int offset, int length) throws IOException public void read(char[] text) throws IOException public abstract void flush() throws IOException public abstract void close() throws IOException 44

Teckenströmmar Grundläggande utströmmar write() – Kan ibland vara ineffektivt att skriva ett tecken i

Teckenströmmar Grundläggande utströmmar write() – Kan ibland vara ineffektivt att skriva ett tecken i taget – De buffrande metoderna kan därför användas write(char[] text) write(char[] text, int offset, int length) 45

Teckenströmmar Grundläggande utströmmar • Övriga grundläggande utströmmar – Använder samma metoder – Skriver till

Teckenströmmar Grundläggande utströmmar • Övriga grundläggande utströmmar – Använder samma metoder – Skriver till olika media – – Char. Array. Writer skriver tecken till en utökningsbar array File. Writer skriver till textfiler Piped. Writer som motsvarande byteström fast för tecken String. Writer skriver till en sträng 46

Teckenströmmar Filtrerande inströmmar • Utökar funktionalitet – Output. Stream. Reader konverterar tecken till bytes

Teckenströmmar Filtrerande inströmmar • Utökar funktionalitet – Output. Stream. Reader konverterar tecken till bytes – Buffered. Writer buffrar data under skrivning – Filter. Writer superklass för vissa typer av filter – Print. Writer skriver textrepresenationer av olika objekt 47

Java I/O Användning 48

Java I/O Användning 48

Användning Byteströmmar • Partiell hierarki Sequence. Input. Stream Data. Input. Stream Object. Input. Stream

Användning Byteströmmar • Partiell hierarki Sequence. Input. Stream Data. Input. Stream Object. Input. Stream Buffered. Input. Stream Filter. Input. Stream Byte. Array. Input. Stream File. Input. Stream Pushback. Input. Stream Cipher. Input. Stream ZIPInput. Stream Piped. Input. Stream Superklass Filterström Databankström 49

Användning Byteströmmar • Partiell hierarki Data. Output. Stream Object. Output. Stream Buffered. Output. Stream

Användning Byteströmmar • Partiell hierarki Data. Output. Stream Object. Output. Stream Buffered. Output. Stream Filter. Output. Stream Byte. Array. Output. Stream File. Output. Stream Print. Stream Cipher. Output. Stream ZIPOutput. Stream Piped. Output. Stream Superklass Filterström Databankström 50

Användning Teckenströmmar • Partiell hierarki Buffered. Reader Line. Number. Reader Char. Array. Reader Input.

Användning Teckenströmmar • Partiell hierarki Buffered. Reader Line. Number. Reader Char. Array. Reader Input. Stream. Reader File. Reader Filter. Reader Pushback. Reader Piped. Reader String. Reader Superklass Filterström Databankström 51

Användning Teckenströmmar • Partiell hierarki Buffered. Writer Char. Array. Writer Output. Stream. Reader Writer

Användning Teckenströmmar • Partiell hierarki Buffered. Writer Char. Array. Writer Output. Stream. Reader Writer File. Writer Filter. Writer Piped. Writer String. Writer Print. Writer Superklass Filterström Databankström 52

Användning • I/O kan vara tidsödande • Speciellt i nätverk • Stora filer? •

Användning • I/O kan vara tidsödande • Speciellt i nätverk • Stora filer? • Lämpligt att tråda I/O-operationer 53

Användning Grundläggande strömmar • Underliggande strömmar • Läser direkt från källan • Första länken

Användning Grundläggande strömmar • Underliggande strömmar • Läser direkt från källan • Första länken i en kedja 54

Användning Filter • Kopplas ihop med andra strömmar – – Opererar ovanpå andra strömmar

Användning Filter • Kopplas ihop med andra strömmar – – Opererar ovanpå andra strömmar Bildar olika lager Kan transformera data under läsning och skrivning Kan utöka med fler specifika metoder • Olika typer – Bytefilter – Teckenfilter 55

Användning Bytefilter • Arbetar med råa bytes • Utför någon form av bearbetning –

Användning Bytefilter • Arbetar med råa bytes • Utför någon form av bearbetning – Kompression/uppackning – Kryptering/dekryptering • Kopplas ihop med – En grundläggande byteström – Andra bytefilter 56

Användning Teckenfilter • Konverterar mellan bytes och tecken • Arbetar med text (characters) •

Användning Teckenfilter • Konverterar mellan bytes och tecken • Arbetar med text (characters) • Hanterar en mängd olika teckenuppsättningar • Kopplas ihop med – – En grundläggande byteström En grundläggande teckenström Bytefilter Andra teckenfilter 57

Användning Vad vill vi uppnå? • • Vilken typ av data? Vilken riktning? Vilken

Användning Vad vill vi uppnå? • • Vilken typ av data? Vilken riktning? Vilken källa? Vilka filter? 58

Användning Skapa • Importera java. io. *; • Skapa en grundläggande ström – Sker

Användning Skapa • Importera java. io. *; • Skapa en grundläggande ström – Sker genom konstruktorn – Sker genom anrop till andra klasser new • Öppna strömmen – Behövs inte, öppnas vid skapande • Koppla ihop med olika filter – Kedjning 59

Användning Kedjning • Strömmar organiseras till en kedja • Kopplingen sker genom konstruktorerna •

Användning Kedjning • Strömmar organiseras till en kedja • Kopplingen sker genom konstruktorerna • Varje ström utgör en länk i en kedja • Varje länk i kedjan – Erhåller data från föregående länk – Utför någon funktion – Skickar behandlade data till nästa länk • Man använder sista länken i kedjan • Detaljer om processen kan ofta ignoreras 60

Användning Kedjning • Metaforer – Linnestugan – Tvättstugan • Sekventiell ihopkoppling • Parallella processer

Användning Kedjning • Metaforer – Linnestugan – Tvättstugan • Sekventiell ihopkoppling • Parallella processer 61

Användning Använd strömmen • Obuffrade data – En byte/ett tecken i taget – En

Användning Använd strömmen • Obuffrade data – En byte/ett tecken i taget – En array av bytes/tecken i taget – Direkt till underliggande ström • Buffrade data – En buffert med bytes/tecken – Vid skrivning måste bufferten tömmas! – Först då skickas data till underliggande ström • Stäng strömmen flush() close() 62

Användning Kedjning • Exempel – – – – En komprimerad, krypterad textfil ankommer från

Användning Kedjning • Exempel – – – – En komprimerad, krypterad textfil ankommer från ett lokalt nätverkskort Det presenteras för en underliggande ström En annan ström buffrar data för att snabba upp hela processen En särskild ström dekrypterar data Ytterligare en ström packar upp komprimerade data Konverterar av data till text Texten läses in till applikationen och processas 63

Användning Kedjning Buffrad text Tecken Input. Stream. Reader Buffrad data ZIPInput. Stream Buffrad, komrimerad

Användning Kedjning Buffrad text Tecken Input. Stream. Reader Buffrad data ZIPInput. Stream Buffrad, komrimerad data Cipher. Input. Stream Buffrad, komrimerad, krypterad data Bytes Buffered. Input. Stream Rå komrimerad, krypterad data Telnet. Input. Stream Rå komrimerad, krypterad data Nätverk 64

Användning Kedjning • Teknik 1 – Behålla referenserna till varje ström File. Input. Stream

Användning Kedjning • Teknik 1 – Behålla referenserna till varje ström File. Input. Stream fis = new File. Input. Stream(”data. txt”); Buffered. Input. Stream bis = new Buffered. Input. Stream(fis); • Svagheter – Det är nu möjligt att använda read() hos båda strömmarna för att läsa data från data. txt – Men, blandade anrop till olika strömmar anslutna/kopplade till samma källa kan bryta olika implicita kontrakt hos strömmarna. – Därför, använd endast det sista filtret i kedjan för att läsa och skriva ifrån! 65

Användning Kedjning • Teknik 2 – Explicit skriva kod som omöjliggör att bryta kontrakten

Användning Kedjning • Teknik 2 – Explicit skriva kod som omöjliggör att bryta kontrakten – Medvetet tappa referensen till den underliggande strömmen – Då kan vi inte oavsiktligt korrumpera bufferten Input. Stream in = new File. Input. Stream(”data. txt”); in = new Buffered. Input. Stream(in); • Svagheter – Det fungerar därför att det inte är nödvändigt att skilja mellan metoderna hos Input. Stream och Buffered. Input. Stream – Men om vis skulle vilja utnyttja utökade metoder? – Vi kan just nu bara använda metoder hos Input. Stream 66

Användning Kedjning • Teknik 3 – Konstruera en ström direkt innanför en annan –

Användning Kedjning • Teknik 3 – Konstruera en ström direkt innanför en annan – Ett kedjeanrop via konstruktorerna Buffered. Input. Stream bis = new Buffered. Input. Stream( new File. Input. Stream(”data. txt”)); • Denna teknik – Vi kan inte av misstag läsa från File. Input. Stream – Vi kan använda alla metoder hos Buffered. Input. Stream – Bör användas! 67

Java I/O Exempel 68

Java I/O Exempel 68

Binära data Skriva data till fil • Vi vill skriva 5 nummer till en

Binära data Skriva data till fil • Vi vill skriva 5 nummer till en binär fil – Vilka strömmar behöver vi? En byteström som skriver till en fil En byteström som skriver primitiva datatyper • Hur ska dessa kopplas ihop? Data. Output. Stream File. Output. Stream fil 1 2 3 4 5 69

Binära data Skriva data till fil • Skriva 5 nummer till en existerande binär

Binära data Skriva data till fil • Skriva 5 nummer till en existerande binär fil try { final int NO_OF_ITEMS = 5; Data. Output. Stream dos = new Data. Output. Stream( new File. Output. Stream(”file. dat”)); dos. write. Int(NO_OF_ITEMS); //indikerar antal skrivna for (int i = 1; i <= NO_OF_ITEMS; i++) { dos. write. Int(i); } dos. flush(); dos. close(); } catch (IOException ioe) { System. out. println(”IOException: ” + ioe. get. Message()); } 70

Binära data Läsa data från fil • Vi vill nu läsa in data från

Binära data Läsa data från fil • Vi vill nu läsa in data från vår fil – Vilka strömmar behöver vi? En byteström som läser från en fil En byteström som tolkar primitiva datatyper • Hur ska dessa kopplas ihop? Data. Input. Stream File. Input. Stream fil 1 2 3 4 5 71

Binära data Läsa data från fil • Läsa in numren från vår binära fil

Binära data Läsa data från fil • Läsa in numren från vår binära fil try { Data. Input. Stream dis = new Data. Input. Stream( new File. Input. Stream(”file. dat”)); int items = dis. read. Int(); //indikerar antal skrivna for (int i = 1; i <= items; i++) { int n = dis. read. Int(); System. out. print(n + ” ”); } System. out. println(); dis. close(); } catch (IOException ioe) { System. out. println(”IOException: ” + ioe. get. Message()); } 72

Binära data • Resultat 1 2 3 4 5 • För att lägga till

Binära data • Resultat 1 2 3 4 5 • För att lägga till data till existerande fil Data. Output. Stream dis = new Data. Output. Stream( new File. Output. Stream(”file. dat”, true)); 73

Text Skriva text till fil, exempel 1 • Skriva 5 nummer till en existerande

Text Skriva text till fil, exempel 1 • Skriva 5 nummer till en existerande textfil final int NO_OF_ITEMS = 5; Print. Writer pw = new Print. Writer( new File. Output. Stream(”file. txt”)); for (int i = 1; i <= NO_OF_ITEMS; i++) { pw. print(” ”); pw. print(i); } pw. flush(); pw. close(); 74

Text Läsa text från fil, exempel 1 • Läsa in numren från vår textfil

Text Läsa text från fil, exempel 1 • Läsa in numren från vår textfil try { Buffered. Input. Stream bis = new Buffered. Input. Stream( new File. Input. Stream(”file. txt”)); int c = bis. read(); while (c != -1) { System. out. print((char) c); //explicit typomvandling c = bis. read(); } System. out. println(); bis. close(); } catch (IOException ioe) { System. out. println(”IOException: ” + ioe. get. Message()); } 75

Text • Resultat 1 2 3 4 5 • För att lägga till data

Text • Resultat 1 2 3 4 5 • För att lägga till data till existerande fil Print. Writer pw = new Print. Writer( new File. Output. Stream(”file. txt”, true)); 76

Text Skriva text till fil, exempel 2 • Skriva 5 nummer till en existerande

Text Skriva text till fil, exempel 2 • Skriva 5 nummer till en existerande textfil final int NO_OF_ITEMS = 5; Print. Writer pw = new Print. Writer( new Buffered. Writer( new File. Writer(”file. txt”))); for (int i = 1; i <= NO_OF_ITEMS; i++) { pw. print(” ”); pw. print(i); } pw. flush(); pw. close(); 77

Text Läsa text från fil, exempel 2 • Läsa in numren från vår textfil

Text Läsa text från fil, exempel 2 • Läsa in numren från vår textfil try { Buffered. Reader br = new Buffered. Reader( new File. Reader(”file. txt”)); String line = br. read. Line(); String text = ””; while (line != null) { text += line; line = br. read. Line(); } br. close(); System. out. println(text); } catch (IOException ioe) { System. out. println(”IOException: ” + ioe. get. Message()); } 78

Text Skriva binära data till fil, exempel 3 • Vi återanvänder exemplet för binära

Text Skriva binära data till fil, exempel 3 • Vi återanvänder exemplet för binära filer • Visar att vi kan konvertera dessa till text – Vilka strömmar behöver vi? En byteström som skriver till en fil En byteström som skriver primitiva datatyper • Hur ska dessa kopplas ihop? Data. Output. Stream File. Output. Stream fil int i = 42; 79

Text Skriva binära data till fil, exempel 3 • Skriva 5 nummer till en

Text Skriva binära data till fil, exempel 3 • Skriva 5 nummer till en existerande binär fil try { final int NO_OF_ITEMS = 5; Data. Output. Stream dos = new Data. Output. Stream( new File. Output. Stream(”file. dat”)); dos. write. Int(NO_OF_ITEMS); //indikerar antal skrivna for (int i = 1; i <= NO_OF_ITEMS; i++) { dos. write. Int(i); } dos. flush(); dos. close(); } catch (IOException ioe) { System. out. println(”IOException: ” + ioe. get. Message()); } 80

Text Konvertera data, exempel 3 • Vi vill nu läsa in data från vår

Text Konvertera data, exempel 3 • Vi vill nu läsa in data från vår fil och konvertera till tecken – Vilka strömmar behöver vi? En byteström som läser från en fil En byteström som konverterar från bytes till tecken En byteström som buffrar • Hur ska dessa kopplas ihop? fil Buffered. Reader int i = 42; Input. Stream. Reader File. Input. Stream 81

Text Konvertera data, exempel 3 • Läsa in från binär fil och konvertera till

Text Konvertera data, exempel 3 • Läsa in från binär fil och konvertera till text try { Buffered. Reader br = new Buffered. Reader( new Input. Stream. Reader( new File. Input. Stream(”file. dat”))); String line = br. read. Line(); String text = ””; while (line != null) { text += line; line = br. read. Line(); } br. close(); System. out. println(text); } catch (IOException ioe) { System. out. println(”IOException: ” + ioe. get. Message()); } 82

Standardströmmar • System. out • System. err • System. in • java. io. File.

Standardströmmar • System. out • System. err • System. in • java. io. File. Descriptor – Har egenskaper som representerar dessa strömmar 83

Standardströmmar Skriva till en standardström • Skriva text till out try { Print. Writer

Standardströmmar Skriva till en standardström • Skriva text till out try { Print. Writer pw = new Print. Writer( new File. Output. Stream(File. Descriptor. out)); pw. print(”Skriver en sträng: ” + ”text”); pw. print(”Skriver ett tal: ” + 42); pw. print(”Skriver ett flyttal: ” + 3. 14 f); pw. flush(); pw. close(); } catch (IOException ioe) { System. out. println(”IOException: ” + ioe. get. Message()); } 84

Standardströmmar • Resultat Skriver en text: text Skriver ett tal: 42 Skriver ett flyttal:

Standardströmmar • Resultat Skriver en text: text Skriver ett tal: 42 Skriver ett flyttal: 3. 14 85

Java I/O Filer och andra objekt 86

Java I/O Filer och andra objekt 86

Filobjektet java. io. File • En abstrakt representation av – En fil – En

Filobjektet java. io. File • En abstrakt representation av – En fil – En katalog • Användargränssnitt och operativsystem använder systemberoende sökvägar till filnamn och kataloger • File utgör en systemoberoende abstrakt vy av hierarkiska sökvägar 87

Filobjektet • En abstrakt sökväg har två komponenter • Ett möjligt systemberoende prefix –

Filobjektet • En abstrakt sökväg har två komponenter • Ett möjligt systemberoende prefix – – Kan innehålla ett namn på en enhet ”/” för en katalog i UNIX, eller ”” för en katalog i Microsoft Windows, eller \” för en UNC-sökväg i Microsoft Windows File. path. Separator • En sekvens av inga eller flera namn – Varje namn, förutom det sista, indikerar en katalog – Sista namnet kan utgöra en katalog eller fil C: Mina dokumentJavaprojektfilhanteringdata. txt 88

Filobjektet • Konvertering från en abstrakt till fysisk sökväg – Systemberoende – Varje namn

Filobjektet • Konvertering från en abstrakt till fysisk sökväg – Systemberoende – Varje namn separeras med ett tecken – Tecknet utgör plattformens default-separator (”/”, ”” etc. ) File. separator 89

Filobjektet • En sökväg kan vara absolut eller relativ • En absolut sökväg är

Filobjektet • En sökväg kan vara absolut eller relativ • En absolut sökväg är komplett C: Mina dokumentJavaprojektfilhanteringdata. txt • En relativ sökväg – Tolkas i sammanhanget av en annan sökväg – Klasser i java. io översätter relativa sökvägar mot användarens nuvarande katalog – Utgörs oftast av katalogen från vilken Javas virtuella maskin startats. . data. txt 90

Filobjektet • Skapa en fil med absolut sökväg File f = new File(”C: \Mina

Filobjektet • Skapa en fil med absolut sökväg File f = new File(”C: \Mina dokument\ Javaprojekt\filhantering\data. txt”); • Skapa en fil med relativ sökväg, default-katalogen File f = new File(”data 2. txt”); • Skapa en fil med relativ sökväg, annan katalog String sep = File. separator; String file. Name = ”data 2. txt”; File f = new File(”. . ” + sep + file. Name); 91

Filobjektet • Radera en befintlig fil File f = new File(”data 2. txt”); f.

Filobjektet • Radera en befintlig fil File f = new File(”data 2. txt”); f. delete(); • Modifiera filen? – Immutable – Får göra detta via strömmar istället! 92

Properties • • java. util. Properties Representerar en persistent mängd av egenskaper Kan sparas

Properties • • java. util. Properties Representerar en persistent mängd av egenskaper Kan sparas till/skrivas från en ström Utgör par med nycklar och värden • Kan användas för konfiguration – – Inställningar lagras i en textfil Läses in i ett objekt av typen Properties Används i programmet Slipper kompilera om 93

Properties Ett exempel • Filen access. dat lagrad i conf • Lagrar inställningar för

Properties Ett exempel • Filen access. dat lagrad i conf • Lagrar inställningar för en databasuppkoppling driver. Class = sun. jdbc. odbc. Jdbc. Odbc. Driver driver. Type = jdbc: odbc: driver = Driver={Microsoft Access Driver (*. mdb)}; data. Source = DBQ=F: \Donald\java\musicorganiser\data\music. mdb 94

Properties Ett exempel • Vi läser in filen och hämtar värden try { String

Properties Ett exempel • Vi läser in filen och hämtar värden try { String s = File. separator; File. Input. Stream stream = new File. Input. Stream(". . " + s "conf" + s + "access. dat"); Properties properties = new Properties(); properties. load(stream); String driver. Class = properties. get. Property("driver. Class"); String driver. Type = properties. get. Property("driver. Type"); String driver = properties. get. Property("driver"); String data. Source = properties. get. Property("data. Source"); } catch I(IOException ioe) { System. out. println(”IOException: ” + ioe. get. Message()); } 95

Stream. Tokenizer • java. io. Stream. Tokenizer • Opererar på en inström – Bryter

Stream. Tokenizer • java. io. Stream. Tokenizer • Opererar på en inström – Bryter ner innehållet från den till delar (tokens) – Varje del kan inspekteras och läsas för sig • Processen kontrolleras mot – Olika flaggor – Flaggornas tillstånd • Identifierar – – Identifierare Tal Strängar Kommentarer 96

Stream. Tokenizer Metoder och flaggor Metod Ansvar next. Token() Läser nästa token och returnerar

Stream. Tokenizer Metoder och flaggor Metod Ansvar next. Token() Läser nästa token och returnerar dess typ TT_EOF Slutet på filen TT_EOL Slutet på en rad TT_NUMBER Ett nummer har lästs Lagrat i nval TT_WORD Ett ord har lästs Lagrat i sval lineno() Returnerar numret för aktuell rad to. String() En strängrepresentation av nuvarande token 97

Stream. Tokenizer Ett exempel • Filen ”hello. java” ska tolkas class Hello { public

Stream. Tokenizer Ett exempel • Filen ”hello. java” ska tolkas class Hello { public static void main(String[] args) { System. out. println(”Hello world”); } } 98

Stream. Tokenizer Ett exempel • Vi skapar strömmen som ska läsa från filen Stream.

Stream. Tokenizer Ett exempel • Vi skapar strömmen som ska läsa från filen Stream. Tokenizer st = new Stream. Tokenizer( new Buffered. Reader(new Input. Stream. Reader( new File. Input. Stream(”hello. java”))); 99

Stream. Tokenizer Ett exempel st. next. Token(); while(st. ttype != Stream. Tokenzier. TT_EOF) {

Stream. Tokenizer Ett exempel st. next. Token(); while(st. ttype != Stream. Tokenzier. TT_EOF) { switch (st. ttype) { case Stream. Tokenizer. TT_NUMBER: System. out. println(”Nummer: ” + st. nval); break; case Stream. Tokenizer. TT_WORD: System. out. println(”Ord: ” + st. sval); break; case Stream. Tokenizer. TT_EOL: System. out. println(”EOL: ”); break; case ’”’ : case ’’’: System. out. println(”Sträng: ” + st. sval); break; default: System. out. println(”Tecken: ” + (char) st. ttype); break; } st. next. Token(); } st. close(); 100

Stream. Tokenizer Ett exempel • Resultatet Ord Ord Tecken Tecken Ord Tecken Sträng o

Stream. Tokenizer Ett exempel • Resultatet Ord Ord Tecken Tecken Ord Tecken Sträng o s v : : : : : class Hello { public static void main ( String args [ ] ) { System. out. println ( Hello world 101

Objekt Serialisering • En teknik för att bestämma – Hur objekt skrivs ut till

Objekt Serialisering • En teknik för att bestämma – Hur objekt skrivs ut till en ström (serialisera) – Hur motsvarande objekt ska läsas in från en ström (de-serialisera) • Interface java. io. Serializable • Interface java. io. Externalizable 102

Objekt Serialisering • Vilka typer kan serialiseras? • De som implementerar antingen – java.

Objekt Serialisering • Vilka typer kan serialiseras? • De som implementerar antingen – java. io. Serializable – java. io. Externalizable • Många av javas klasser är serialiserbara – Primitiva datatyper, genom Data. Input. Stream och Data. Output. Stream eller Object. Input. Stream och Object. Outputstream – String, File, Date, Properties – Vector om alla ingående objekt är serialiserbara! 103

Objekt Serialisering java. io. Serializable • • Finns inga metoder! Används endast för att

Objekt Serialisering java. io. Serializable • • Finns inga metoder! Används endast för att identifiera att något är serialiserbart! Objektens grafer/tillstånd läses och skrivs automatiskt Superklasser/subklasser? • Om man vill definiera ett annat beteende – Implementera två specifika metoder – Variablerna kanske ska krypteras/dekrypteras? 104

Objekt Serialisering java. io. Externalizable • Används endast om – En klass explicit måste

Objekt Serialisering java. io. Externalizable • Används endast om – En klass explicit måste koordinera med sin superklass • Används inte under kursen 105

Objekt Serialisering • Default-mekanismen för de-serialisering – – Skapar ett nytt objekt (objektgraf) Analogt

Objekt Serialisering • Default-mekanismen för de-serialisering – – Skapar ett nytt objekt (objektgraf) Analogt med att anropa en konstruktor Återskapar varje fält och värde Identiska med hur de såg ut när de skrevs ut • Ett objekt är serialiserbart om, och endast om – Alla ingående fält är serialiserbara eller – Deklarerade transient eller static • Annars kastas ett undantag 106

Objekt Serialisering • Strömmar som kan läsa/skriva objekt Object. Input. Stream Object. Output. Stream

Objekt Serialisering • Strömmar som kan läsa/skriva objekt Object. Input. Stream Object. Output. Stream • Spara ner objekt på fil File. Input. Stream File. Output. Stream • Andra användningsområden – Skicka objekt mellan datorer med hjälp av sockets – Läs gärna kursen Internetprogrammering 1 107

Objekt Serialisering Object. Output. Stream • Metoder för att – Serialisera olika primitiva datatyper

Objekt Serialisering Object. Output. Stream • Metoder för att – Serialisera olika primitiva datatyper – Serialisera ett godtyckligt objekt Object. Input. Stream • Metoder för att – De-serialisera olika primitiva datatyper – De-serialisera ett godtyckligt objekt 108

Objekt Skriva ut ett objekt till fil, exempel 1 • Vilka strömmar behöver vi?

Objekt Skriva ut ett objekt till fil, exempel 1 • Vilka strömmar behöver vi? En byteström som skriver till en fil En byteström som serialiserar objekt • Hur ska dessa kopplas ihop? Object. Output. Stream File. Output. Stream fil Date 109

Objekt Skriva ut ett objekt till fil, exempel 1 • Är det inte fantastiskt

Objekt Skriva ut ett objekt till fil, exempel 1 • Är det inte fantastiskt enkelt? try { File f = new File(”date 1. dat”); Date d = new java. util. Date(); Object. Output. Stream oos = new Object. Output. Stream( new File. Output. Stream(f)); oos. write. Object(d); oos. flush(); oos. close(); } catch (IOException ioe) { System. out. println(”IOException: ” + e. get. Message()); } 110

Objekt Läsa in ett objekt från fil, exempel 1 • Vilka strömmar behöver vi?

Objekt Läsa in ett objekt från fil, exempel 1 • Vilka strömmar behöver vi? En byteström som läser från en fil En byteström som de-serialiserar objekt • Hur ska dessa kopplas ihop? Object. Input. Stream File. Input. Stream fil Date 111

Objekt Läsa in ett objekt från fil, exempel 1 • Är det inte otroligt?

Objekt Läsa in ett objekt från fil, exempel 1 • Är det inte otroligt? try { Object. Input. Stream ois = new Object. Input. Stream( new File. Input. Stream(”date 1. dat”)); Date d = (java. util. Date) ois. read. Object(); ois. close(); } catch (IOException ioe) { System. out. println(”IOException: ” + e. get. Message()); } 112

Objekt Ett objekt av en egen klass • Nu ska vi skapa en egen

Objekt Ett objekt av en egen klass • Nu ska vi skapa en egen klass • Vi gör klassen serialiserbar • Skapar en instans • Skriver ut hela objektet till fil • Läser in objektet från fil igen 113

Objekt Vår klass • Vi kanske har en gästbok? import java. io. *; Import

Objekt Vår klass • Vi kanske har en gästbok? import java. io. *; Import java. util. Date; public class Guest implements Serializable { private String name; //implementerar serializable private String msg; //implementerar serializable private Date date; public Guest(String name, String msg) { this. name = name; this. msg = msg; date = new Date(); } //vi utelämnar metoder för att hämta name, msg och date } 114

Objekt Skriva ut ett objekt till fil, exempel 2 • Vilka strömmar behöver vi?

Objekt Skriva ut ett objekt till fil, exempel 2 • Vilka strömmar behöver vi? En byteström som skriver till en fil En byteström som serialiserar objekt • Hur ska dessa kopplas ihop? Object. Output. Stream File. Output. Stream fil Guest 115

Objekt Skriva ut ett objekt till fil, exempel 2 • Inte mycket svårare? try

Objekt Skriva ut ett objekt till fil, exempel 2 • Inte mycket svårare? try { //vi bortser från kollen hur många gäster som finns File f = new File(”guest 1. g”); //vi utgår ifrån att värden hämtas från t ex en servlet Guest g = new Guest(name, msg); Object. Output. Stream oos = new Object. Output. Stream( new File. Output. Stream(f)); oos. write. Object(g); oos. flush(); oos. close(); } catch (IOException ioe) { System. out. println(”IOException: ” + e. get. Message()); } 116

Objekt Läsa in ett objekt från fil, exempel 2 • Vilka strömmar behöver vi?

Objekt Läsa in ett objekt från fil, exempel 2 • Vilka strömmar behöver vi? En byteström som läser från en fil En byteström som de-serialiserar objekt • Hur ska dessa kopplas ihop? Object. Input. Stream File. Input. Stream fil Guest 117

Objekt Läsa in ett objekt från fil, exempel 2 • Inte mycket svårare? try

Objekt Läsa in ett objekt från fil, exempel 2 • Inte mycket svårare? try { Object. Input. Stream ois = new Object. Input. Stream( new File. Input. Stream(”guest 1. g”)); Guest g = (Guest) ois. read. Object(); ois. close(); } catch (IOException ioe) { System. out. println(”IOException: ” + e. get. Message()); } 118

Objekt Specialiserad serialisering • Serialiserbara klasser som kräver särskild hantering – Under processen serialisering

Objekt Specialiserad serialisering • Serialiserbara klasser som kräver särskild hantering – Under processen serialisering – Under processen de-serialization • Implementerar följande metoder private void read. Object(java. io. Object. Input. Stream ois) throws IOException, Class. Not. Found. Exception; private void write. Object(java. io. Object. Output. Stream oos) throws IOException; private void read. Object. No. Data() throws Object. Stream. Exception; 119

Java Servlets Vad kommer ni i kontakt med? • Specifika metoder anropas • Argument

Java Servlets Vad kommer ni i kontakt med? • Specifika metoder anropas • Argument skickas med – Objekt som representerar en förfrågan – Objekt som representerar en respons • Separation av kod – – – Innebär att läsa in en statisk HTML-fil som sträng Lägga till innehåll i denna sträng Skicka tillbaka den till klienten Detta sker via en utström Utströmmen finns hos respons-objektet 120

Länkar Java. Script • SUN: s hemsida för Java http: //java. sun. com/ •

Länkar Java. Script • SUN: s hemsida för Java http: //java. sun. com/ • Sida med länkar till all dokumentation http: //java. sun. com/docs/index. html • Java Tutorial http: //java. sun. com/docs/books/tutorial/ • Dokumentation för Java 2 SDK 1. 4. 2 http: //java. sun. com/j 2 se/1. 4. 2/docs/api/index. html • Lektion om Java I/O i Java Tutorial http: //java. sun. com/docs/books/tutorial/essential/io/ • Lektion om serialisering i Java Tutorial http: //java. sun. com/docs/books/tutorial/essential/io/serialization. html 121

Länkar Java. Script • Encodings http: //java. sun. com/j 2 se/1. 4. 2/docs/tooldocs/windows/native 2

Länkar Java. Script • Encodings http: //java. sun. com/j 2 se/1. 4. 2/docs/tooldocs/windows/native 2 ascii. html • Forum http: //forum. java. sun. com/ 122