Föreläsning 6. Designmönstret Decorator I/O-ramverket

Relevanta dokument
Inre klasser Anonyma klasser Kloning I/O-ramverket. anonyma klasser

Föreläsning 12. Inre klasser Anonyma klasser Kloning I/O-ramverket

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

Fördjupad Java. Undantagshantering. Fel

Föreläsning 12. Inre klasser Anonyma klasser Kloning I/O-ramverket

Språkkonventioner och redigering av tal.

F2 Java I/O - strömmar Meddelandesändning med TCP

Föreläsning 12. Inre klasser Anonyma klasser Kloning I/O-ramverket

Nätverksprogrammering. Tekniker för att skriva program som kommunicerar med varandra över ett nätverk. F1 Nätverk och strömmar.

Java Direkt, upplaga 5 Innehåll

F2 Java I/O - strömmar Meddelandesändning med TCP EDA095 Nätverksprogrammering

F1 Nätverk och strömmar

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Att skriva till och läsa från terminalfönstret

JAVAUTVECKLING LEKTION 7

Java Direkt, upplaga 7 Innehåll

Java Direkt, upplaga 6 Innehåll

Föreläsning 12. Inre klasser Anonyma klasser Kloning I/O-ramverket

Föreläsning 1 Nätverk och strömmar

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 7 Jonas Lindgren, Institutionen för Datavetenskap, LiU

OOP Objekt-orienterad programmering

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Klassen String Mer om fält Något om inläsning

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Översikt. Skriva och läsa data. Kontrollflöde. Två sorters loopar. For-loop. For-loop

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Föreläsning 14. Filhantering

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

Föreläsnings 9 - Exceptions, I/O

Surfning. Webbklienter och webbservrar. Specialskrivna webbservrar. Kommunikation med sockets

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Java Direkt, upplaga 8 Innehåll

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Föreläsning 11 Aktiva objekt och trådar, strömmar, kommunikation DAT043,

Objektorienterad programutveckling, fk

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Lösningar för tenta 2 DAT043,

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Objektorienterad Programmering (TDDC77)

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Ingenjörsfirman Stéen Java Sida 1 av 1

TENTAMEN OOP

Hämta data mha URLer Föreläsning 2b. Innehåll Klassen URL

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Classes och Interfaces, Objects och References, Initialization

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

F5 Kodkvalitet. Programutveckling sker i faser. Livscykel, vidareutveckling och återanvändning

DAT043 Objektorienterad Programmering

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Objektorienterad Programmering (TDDC77)

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Tentamen , Introduktion till Java, dtaa98, dtea53

Klass och metoddesign. Skapa en OO-design. Kodkonvention. Hur kan man jobba med kodkvalité? Implementation. Bra klasser är grunden

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

Lösningsförslag till tentamen

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Objektorienterad Programmering (TDDC77)

UML. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

2I1073 Föreläsning 3. Säkerhet. Kryptering

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Sammanfattning och repetition utgående från typiska tentamensuppgifter

1 Programmering i Java. Program element - Introduktion. Exempel. Exempel. Kapitel 3:

SMD 134 Objektorienterad programmering

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Objektorienterad programmering i Java

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Tentamensskrivning Nätverksprogrammering (EDA095 - FED) , kl 8-13

Transkript:

TDA550 Objektorienterad programmering, fortsättningskurs Föreläsning 6 Designmönstret Decorator I/O-ramverket Objektorienterad programmering fk 1 Föreläsning 6

Designmönstret Decorator Decorator-mönstret används för att lägga till funktionalitet på individuella objekt utan att använda arv. Mönstret används ofta då arv skulle ge alldeles för många nivåer i arvshierarkin, eller då arv inte är möjligt. Rekommenderad struktur för Decorator-mönstret är enligt: Component {abstract operation() ConcreteComponent operation() Decorator {abstract operation() ConcreteDecoratorA addedstate operation() ConcreteDecoratorB operation() addedbehavior() Component: En klass som definierar gränssnittet för de objekt som dynamiskt kan ges ytterligare funktionalitet. ConcreteComponent: En klass som definierar objekt till vilka ytterligare funktionalitet kan ges. Decorator: Har en referens till ett Component-objekt och definierar ett gränssnitt som överensstämmer med gränssnittet för Component. ConcreteDecorator: Lägger till funktionalitet på objektet. Objektorienterad programmering fk 2 Föreläsning 6

Exempel på användning av Decorator Antag att vi har en smörgåsbutik. Kunden kan kombinera sin smörgås efter eget önskemål. Det finns ett antal brödsorter att välja mellan och ett antal olika pålägg. Vi startar med att skapa en abstrakt klass Sandwich enligt: public abstract class Sandwich { protected String name; public String getname() { return name; public abstract double getprice(); Sedan skapar vi en klass för var och en av de brödsorter vi har. Dessa klasser ärver klassen Sandwich. Säg att vi har baguetter och panini: public class Baguette extends Sandwich { public Baguette() { name = "Baguette"; public double getprice() { return 8.5; public class Panini extends Sandwich { public Panini(){ name = "Panini"; public double getprice() { return 10.5; Objektorienterad programmering fk 3 Föreläsning 6

Exempel på användning av Decorator Sedan inför vi vår Decorator-klass; SandwichDecorator vilken är en abstrakt klass som ärver från Sandwichklassen och som har en instansvariabel av klassen Sandwich: public abstract class SandwichDecorator extends Sandwich{ protected Sandwich sandwich; public abstract double getprice(); Sedan skapar vi några konkreta klasser, t.ex. för att lägga ost, skinka, salami eller tomater på smörgåsen: public class Cheese extends SandwichDecorator { public Cheese (Sandwich sandwich){ decoratedsandwich = sandwich; name = decoratedsandwich.name + " + Cheese"; public double getprice(){ return decoratedsandwich.getprice() + 5.5; public class Ham extends SandwichDecorator { public Ham (Sandwich sandwich){ decoratedsandwich = sandwich; name = decoratedsandwich.name + " + Ham"; public double getprice(){ return decoratedsandwich.getprice() + 7.5; Objektorienterad programmering fk 4 Föreläsning 6

Exempel på användning av Decorator public class Salami extends SandwichDecorator { public Salami (Sandwich sandwich) { decoratedsandwich = sandwich; name = decoratedsandwich.name + " + Salami"; public double getprice(){ return decoratedsandwich.getprice() + 8.5; public class Tomato extends SandwichDecorator { public Tomato (Sandwich sandwich) { decoratedsandwich = sandwich; name = decoratedsandwich.name + " + Tomato"; public double getprice(){ return decoratedsandwich.getprice() + 2.5; Sandwich {abstract getprice() Baguette getprice(() Panini getprice(() SandwichDecorator {abstract getprice() Salami Ham Cheese Tomato getprice() getprice() getprice() getprice() Objektorienterad programmering fk 5 Föreläsning 6

Exempel på användning av Decorator public class TestSandwich { public static void main (String[] args){ //lets create a baguette with cheese, ham and tomato Sandwich ourbaguette= new Baguette(); ourbaguette = new Cheese(ourBaguette); ourbaguette = new Ham(ourBaguette); ourbaguette = new Tomato(ourBaguette); System.out.println(ourBaguette.getName() + " = " + ourbaguette.getprice() + " kronor"); //lets create a panini with salami and tomato. Sandwich ourpanini = new Panini(); ourpanini = new Salami(ourPanini); ourpanini = new Tomato(ourPanini); System.out.println(ourPanini.getName() + " = " + ourpanini.getprice() + " kronor"); När programmet körs erhålls utskriften: Baguette + Cheese + Ham + Tomato = 24.0 kronor Panini + Salami + Tomato = 21.5 kronor Objektorienterad programmering fk 6 Föreläsning 6

I/O-ramverket i Java Utan att kunna läsa och skriva ut data skulle de flesta program vara ganska meningslösa. Den data som ett program kan vara beroende av kan t.ex. finnas i en fil hämtas via nätverket vara utdata från ett annat program. Ett program kan också behöva skicka data till dessa enheter. För att kunna hantera läsning och skrivning på ett likartat sätt, oavsett typ av enhet, tillhandahåller Java har ett I/Oramverk. Objektorienterad programmering fk 7 Föreläsning 6

Strömmar All läsning/skrivning sker i Java via strömmar. En ström abstraherar bort hårdvarudetaljerna i den fysiska enheten till vilken läsning/skrivning sker. Programmet vet egentligen inte vad som finns i andra ändan av strömmen. program read() write() datalagringsenhet/ eller dataöverföringsenhet Abstrahera bort hårdvarudetaljer genom att kommunicera med en ström program read() write() ström-objekt ström-objekt dold interaktion dold interaktion datalagringsenhet/ eller dataöverföringsenhet Notera: Inget strömobjekt i Java hanterar både read() och write(). Ett program som både läser och skriver data behöver således minst två strömmar. Objektorienterad programmering fk 8 Föreläsning 6

Grunderna för I/O-klassernas utformning I Java finns det ett antal klasser som bygger upp strömhanteringen. De flesta av dessa ligger i paketet java.io. Det finns fyra huvudtyper av strömmar i Java: 1. Utströmmar för godtycklig data (OutputStream) 2. Inströmmar för godtycklig data (InputStream) 3. Utströmmar för text (Writer) 4. Inströmmar för text (Reader) Strömmar för godtycklig data kallas byte-strömmar, eftersom man skickar en byte i taget. Kan användas för alla sorters data (objekt, bilder, ljud, komprimerade filer, osv). För textströmmar skickar man ett tecken (en char) i taget, varför dessa även kallas char-strömmar. De är speciellt anpassade för text (e-post, överföring av HTML-kod,.java-filer, osv). Påpekande: Data, inklusive text, lagras och överförs i bytes. Objektorienterad programmering fk 9 Föreläsning 6

Grunderna för I/O-klassernas utformning Javas I/O-ramverk har utformats på så sätt att varje klass har ett mycket begränsat ansvarsområde Basen utgörs av de fyra abstrakta toppklasserna OutputStream, InputStream, Writer och Reader. Var och en av dessa klasser har ett antal subklasser. Strukturen för hur man använder de fyra olika strömtyperna är liknande för samtliga strömtyper. Det finns olika klasser för att t.ex.: läsa från filer skriva till filer buffring av data filtrering av data Det finns två olika kategorier av strömklasser: konstruerande strömklasser, som används för att skapa nya strömmar. dekorerande strömklasser, som används för att ge existerande strömmar nya egenskaper. Objektorienterad programmering fk 10 Föreläsning 6

read() och write() InputStream och Reader har metoden (bland flera) public int read() throws IOException OutputStream och Writer har metoden (bland flera): public void write(int i) throws IOException Varför används inte byte read() och void write(byte b) respektive char read() och void write(char c) Vare sig det gäller läsning eller skrivning av bytes eller tecken, så behövs det ett extra värde för att markera slutet av en ström. I Java har man valt att markera slutet med heltalet -1. Normala bytes representeras som heltal från 0 till 255. Normala tecken representeras som heltal från 0 till 65535. Objektorienterad programmering fk 11 Föreläsning 6

Kontroll av slut i en byteström: InputStream in =...; int i = in.read(); byte b ; if (i!= -1) b = (byte) i; Kontroll av slut i en teckenström: Reader in =...; int i = in.read(); char c ; if (i!= -1) c = (char) i; testa om 'slut på strömmen' om inte 'slut på strömmen': typomvandla Objektorienterad programmering fk 12 Föreläsning 6

Metoder i InputStream I klassen InputStream definieras de mest grundläggande metoderna för läsning av byteströmmar. De viktigaste metoderna är: public abstract int read() throws IOException Läser en byte, returnerar den som en int (0-255). Returnerar -1 om strömmen är slut. Väntar till indata är tillgängliga. Den byte som returneras tas bort från strömmen. public int read(byte[] buf) throws IOException Läser in till ett byte-fält. Slutar läsa när strömmen är slut. Returnerar så många bytes som lästes. public void close() throws IOException Stänger strömmen. IOException kan t.ex. fås om man försöker läsa från en stängd ström. Man skall alltid stänga en ström när man läst eller skrivit färdigt, annars riskerar man att data kan gå förlorat. Det finns ingen open()-metod: strömmen öppnas då den skapas. 100110101 001011 100110101 001011 100110101001011... Objektorienterad programmering fk 13 Föreläsning 6

Subklasser till InputStream: FileInputStream Klassen FileInputStream används när man vill läsa bytes från en fil. Exempel: import java.io.*; public class CountBytes { public static void main(string[] args) throws IOException { InputStream in = new FileInputStream(args[0]); int total = 0; while (in.read()!= -1) total++; System.out.println(total + " antal bytes."); in.close(); Klassen FileInputStream har en konstruktor FileInputStream(String name) som då den skapas binds till filen name, enligt CountBytes read() in dold interaktion fysiska filen med namnet name Objektorienterad programmering fk 14 Föreläsning 6

Subklasser till InputStream: BufferedInputStream Klassen BufferedInputStream används för att buffra data för effektivare läsning. Klassen är en dekorerande klass. InputStream {abstract DataInput FileInputStream FilterInputStream BufferedInputStream DataInputStream BufferedInputStream har en konstruktor BufferedInputStream(InputStream in) som då den skapas binds till strömmen in, enligt read() BufferedInputStream read() (dolt) in read() (dolt) program fysisk fil Objektorienterad programmering fk 15 Föreläsning 6

BufferedInputStream När read() anropas på en ström av typen BufferedInputStream för första gången eller när bufferten är tom sker följande: read() i grundströmmen anropas bufferten fylls så långt det går den byte som ligger först i bufferten returneras och tas bort Anropas read() på en ström av typen BufferedInputStream med en icke-tom buffert sker följande: den byte som ligger först i bufferten returneras och tas bort Operationen close() i BufferedInputStream stänger även grundströmmen. Genom att använda BufferedInputStream undviks massor av anrop till grundströmmen och motsvarande systemresurser sparas. Objektorienterad programmering fk 16 Föreläsning 6

BufferedInputStream - exempel import java.io.*; public class EffektiveCountBytes { public static void main(string[] args) throws IOException { InputStream source = new FileInputStream(args[0]); InputStream in = new BufferedInputStream(source); int total = 0; while (in.read()!= -1) total++; System.out.println(total + " antal bytes."); in.close(); Objektorienterad programmering fk 17 Föreläsning 6

OutputStream De viktigaste metoderna i OutputStream är: public abstract void write(int b) throws IOException Skriver ut de sista 8 bit-arna i heltalet b som en byte. public void write(byte[] buf) throws IOException Skriver ut ett fält av byte på strömmen. public void flush() throws IOException Ser till att all data i strömmen skrivs ut. public void close() throws IOException Stänger strömmen. IOException kan t.ex. fås om man försöker skriva på en stängd ström. Det finns ingen open()-metod: strömmen öppnas då den skapas. FileOutputStream och BufferedOutputStream är analoga med FileInputStream och BufferedInputStream Objektorienterad programmering fk 18 Föreläsning 6

Klassen Reader De viktigaste metoderna i Reader är: public int read() throws IOException Läser ett tecken, returnerar den som en int (0-65535). Returnerar -1 om strömmen är slut. Väntar till indata är tillgängliga. Den char som returneras tas bort från strömmen public int read(char[] buf) throws IOException Läser in till ett char-fält. Slutar läsa när strömmen är slut. Returnerar så många char som lästes. public abstract void close() throws IOException Stänger strömmen. IOException kan t.ex. fås om man försöker läsa från en stängd ström. Det finns ingen open()-metod: strömmen öppnas då den skapas. 100110101 001011 Java i/o translation text file Java i/o... Objektorienterad programmering fk 19 Föreläsning 6

Klassen Reader De viktigaste subklasserna till i Reader är: BufferedReader, som 'speglar' BufferedInputStream BufferedReader har bl.a. dessutom metoden public String readline() throws IOException som returnerar nästa rad. LineNumberReader, som är en subklass till BufferedReader. Har bl.a. metoden public int getlinenumber() throws IOException som returnerar aktuellt radnummer. Objektorienterad programmering fk 20 Föreläsning 6

Klassen Writer Klassen Writer har en uppsättning metoder som motsvarar de som finns för klassen OutputStream. Varav de viktigaste är: public abstract void write(int b) throws IOException Skriver ut de sista 16 bit-arna i heltalet b som en char. public void write(char[] buf) throws IOException Skriver ut ett fält av char på strömmen. public void flush() throws IOException Ser till att all data i strömmen skrivs ut. public void close() throws IOException Stänger strömmen. Har bl.a subklassen BufferedWriter är analoga med BufferedReader för klassen Reader. Objektorienterad programmering fk 21 Föreläsning 6

Byte input stream dataflow source primary byte streams secondary byte streams InputStream BufferedInputStrea m PipedOutputStrea m FileInputStream ByteArrayInputStrea m PipedInputStrea m DataInputStrea m PushbackInputStrea m ObjectInputStrea m SequenceInputStrea m progra m Byte output steam dataflow secondary byte streams primary byte streams OutputStrea m target progra m BufferedOutputStrea m DataOutputStream FileOutputStrea m ByteArrayOutputStream ObjectOutputStream PipedOutputStream PipedInputStrea m Objektorienterad programmering fk 22 Föreläsning 6

Character input stream dataflow source primary char streams Reader secondary char streams BufferedReader FileReader text CharArrayReader LineNumberReader progra m StringReader PushbackReader PipedWriter PipedReader Character input stream dataflow secondary char streams primary char streams target Writer BufferedWriter FileWriter progra m PrintWriter CharArrayWriter StringWriter text PipedWriter PipedReade r Objektorienterad programmering fk 23 Föreläsning 6

Konverteringsklasser Filer är alltid byte-orienterade. Att läsa och skriva tecken till respektive från filer, innebär att konvertering mellan byte och Unicode måste göras. För detta används konverteringsklasser. Teckenkodning Internt i ett Java-program representeras tecken med Unicode, som kodas i 16 bit (för att klara de flesta tecken som används över världen). Externt på t.ex. textfiler används den teckenkodning som stöds av plattformen på vilket programmet körs. Således måste det ske en konvertering mellan Unicode och den plattformsberoende teckenkoden. Olika teckenkoder används runtom i världen. Vilken teckenkod som normalt används beror på plattformens geografiska placering. I Europa och USA används ASCIIkod, medan man t.ex. i Kina använder GB-2312. ASCIIkoden nyttjar en byte medan GB-2312 använder två bytes. Teckenströmmarna i Java konverterar mellan Unicode och den kod som används lokalt när läsning och skrivning görs. Om man vill använda en annan teckenkod än den som normalt används kan detta anges i konstruktorn till den teckenström man använder. Objektorienterad programmering fk 24 Föreläsning 6

Konverteringsklasser Konverteringsklasser mellan strömmar Klasserna InputStreamReader och OutputStreamReader används för att skapa en char-ström från en byte-ström respektive skapa en byte-ström från en char-ström. Reader in = new BufferedReader( new InputStreamReader(System.in)); Writer out = new BufferedWriter( new OutputStreamWriter(System.out)); Konverteringsklasser mellan strömmar och filer Klasserna FileReader och FileWriter används för att läsa från respektive skriva till filer. FileReader är en subklass till InputStreamReader och FileWriter är en subklass till OutputStreamWriter, vilket innebär att en översättning sker från bytes till char respektive från char till bytes. Reader in = new BufferedReader( new FileReader("some.txt")); Writer out = new BufferedWriter( new FileWriter("someOther.txt"))); Objektorienterad programmering fk 25 Föreläsning 6

Bekvämlighetsklassen PrintWriter Denna klass används för att skriva ut objekt och primitiva typer till en textström. Innehåller bl.a. de överlagrade metoderna print och println för samtliga primitiva typer, samt för String och Object: PrintWriter pw = new PrintWriter("some.txt"); pw.println(12.34); pw.print(456); pw.println("some words"); pw.print(new Rectangle(5, 10, 5, 15)); Objektorienterad programmering fk 26 Föreläsning 6

Standardströmmar Varje Java-program har tre strömmar som automatiskt skapas och öppnas när programmet startar. System.in System.out System.err InputStream PrintStream PrintStream System.in används för inläsning och är normalt kopplad till tangentbordet System.out används för utmatning och är normalt kopplad till bildskärmen System.err används för felrapportering och är normalt kopplad till bildskärmen Objektorienterad programmering fk 27 Föreläsning 6

Inläsning från tangentbordet I och med införandet av klassen Scanner i Java 5.0 har inläsning från System.in underlättats. Vi skall här se hur man tidigare var tvungen att göra (och även i vissa fall fortfarande måste göra). Data som skrivs på tangentbordet hamnar i strömmen System.in. För att kunna läsa tecken och inte bytes måste strömmen System.in först kopplas till ett objekt av klassen InputStreamReader. För att göra inläsningen mer effektiv och kunna läsa in hela rader istället för att läsa tecken för tecken måste strömmen kopplas till ett objekt av klassen BufferedReader. program read() BuffererReader read() (dolt) InputStreamReader System.in read() (dolt) I klassen BufferedReader finns bl.a. följande metoder String readline() läser en rad int read() läser ett tecken long skip(long n) läser förbi ett antal tecken Samtliga dessa metoder reser IOException! Objektorienterad programmering fk 28 Föreläsning 6

Inläsning av tal via tangentbordet(1) Tyvärr innehåller inte klassen BufferedReader några metoder för att omvandla talsträngar till numeriska tal. Vid läsning av ett tal per rad kan omvandling mellan String och tal göras med användning av metoder i aktuell omslagsklass. import java.io.*; public class Tal { public static void main (String[] arg) throws IOException { BufferedReader myin = new BufferedReader ( new InputStreamReader(System.in)); System.out.print("Skriv ett heltal: "); System.out.flush(); String textrad = myin.readline(); textrad = textrad.trim(); //Rensar bort blanktecken int heltal = Integer.parseInt(textRad); System.out.println("Talet är: " + heltal); System.out.print("Skriv ett reellt tal: "); System.out.flush(); textrad = myin.readline(); textrad = textrad.trim(); double reellt = Double.valueOf(textRad).doubleValue(); System.out.println("Talet är: " + reellt); Körningsexempel: Skriv ett heltal: 20 Talet är: 20 Skriv ett reellt tal: 12.45 Talet är: 12.45 Objektorienterad programmering fk 29 Föreläsning 6

Inläsning av tal via en byteström Klasserna DataInputStream och DataOutputStream används för att läsa respektive skriva Javas inbyggda primitiva typer. boolean readboolean() writeboolean(boolean v) char readchar() writechar(char v) byte readbyte() writebyte(byte v) short readshort() writeshort(short v) int readint() writeint(int v) long readlong() writelong(long v) float readfloat() writefloat(float v) double readdouble() writedouble(double v) Objektorienterad programmering fk 30 Föreläsning 6

Exempel: Skriv ett fält av reella tal till en fil import java.io.*; public class WriteDoubleArray { public static void main( String[] args ) throws IOException { double[] f = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9; DataOutputStream destination = new DataOutputStream( new FileOutputStream("data.txt")); destination.writeint(f.length); for (int i = 0; i < f.length; i++) destination.writedouble(f[i]); destination.close(); Exempel: Läs en fil av av reella tal till ett fält import java.io.*; public class ReadDoubleArray{ public static void main( String[] args ) throws IOException { DataInputStream source = new DataInputStream( new FileInputStream("data.txt")); int antal = source.readint(); double[] f = new double[antal]; for (int i = 0; i < antal ; i++) { f[i] = source.readdouble(); source.close(); Objektorienterad programmering fk 31 Föreläsning 6

In- och utmatning av objekt För att skriva respektive läsa objekt använder man sig av strömklasserna ObjectOutputStream respektive ObjectInputStream. Dessa klasser är dekorerande strömklasser som kopplas samman med en annan OutputStream- respektive InputStream-ström. I ObjectOutputStream finns metoden writeobject, som omvandlar ett godtyckligt objekt till ren data och skickar iväg det på utströmmen. I ObjectInputStream finns metoden readobject, som läser data och omvandlar den tillbaks till ett objekt igen. Det som krävs är att de objekt som skickas måste implementera gränssnittet Serializable. Innehåller objektet referenser till andra objekt måste också dessa objekt implementera gränsnittet Serializable. Att implementera gränssnittet Serializable är enkelt eftersom gränssnittet saknar metoder. Man behöver bara lägga till texten implements Serializable i klasshuvudet. Många av standardklasserna implementerar Serializable. Objektorienterad programmering fk 32 Föreläsning 6

Exempel: Antag att vi programmerar ett spel och har en klass Game för att hålla reda på den aktuella ställningen. public class Game implements Serializable {... Då kan vi enkelt skriva en metod för att spara ner spel på en disk : public static boolean savegame(game g, String filename) { try { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(fileName)); out.writeobject(g); out.close(); return true; catch (FileNotFoundException e) { return false; Objektorienterad programmering fk 33 Föreläsning 6

Exempel: Fortsättning Likaledes är det enkelt att ladda upp spelet från disken igen: public static Game loadgame(string filename) throws FileNotFoundException { ObjectInputStream in = new ObjectInputStream( new FileInputStream(fileName)); try { Object o = in.readobject(); in.close(); return (Game) o; catch (OptionalDataException e) { throw Lämpligt exception;... Fler exceptions att fånga och kasta något vettigt Objektorienterad programmering fk 34 Föreläsning 6

Klassen File Klassen File ger en plattformsoberoende och abstrakt representation av filer och mappars fullständiga adresser (pathnames). import java.io.file; public class DirectoryTest { public static void main(string[] args) { File thefile = new File(args[0]); System.out.println("Undermapp till " + thefile.getparent()); if (thefile.isdirectory()) { System.out.println("Ett bibliotek!"); File[] content = thefile.listfiles(); for (int i = 0; i < content.length; i++) System.out.println(content[i].getName()); else System.out.println("Inget bibliotek!"); Klassen innehåller bl.a. följande metoderna: getname() getpath() isdirectory() listfiles() delete() returnerar namnet på filen returnerar adressen som en sträng returnerar true om filen är ett bibliotek returnerar en lista av filerna i biblioteket tar bort filen renameto(file dest) ändrar namn på filen Objektorienterad programmering fk 35 Föreläsning 6

Klasser som handhar byte-strömmar Objekt ByteArrayInputStream InputStream {abstract FileInputStream FilterInputStream ObjectInputStream PipedInputStream SequenceInputStream DataInputStream BufferedInputStream LineNumberInputStream PushBackInputStream StringBufferInputStream (deprecated) ByteArrayOutputStream OutputStream {abstract FileOutputStream FilterOutputStream ObjectOutputStream PipedOutputStream BufferedOutputStream DataOutputStream PrintStream <<interface>> InputData RandomAccessFile <<interface>> OutputData Objektorienterad programmering fk 36 Föreläsning 6

Klasser som handhar tecken-strömmar Objekt CharArrayReader InputStreamReader FileReader FilterReader {abstract PushBackReader Reader {abstract StringReader PipedReader BufferedReader LineNumberReader BufferedWriter CharArrayWriter Writer {abstract OutputStreamWriter FilterWrite {abstract FileWriter PipedWriter StringWriter PrintWriter StreamTokenizer Objektorienterad programmering fk 37 Föreläsning 6