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

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

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

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

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

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

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

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

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

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

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

Fördjupad Java. Undantagshantering. Fel

F1 Nätverk och strömmar

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

Java Direkt, upplaga 5 Innehåll

Java Direkt, upplaga 7 Innehåll

Språkkonventioner och redigering av tal.

Java Direkt, upplaga 6 Innehåll

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

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

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

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

Kopiering av objekt i Java

OOP Objekt-orienterad programmering

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

Java Direkt, upplaga 8 Innehåll

JAVAUTVECKLING LEKTION 7

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

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

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

Classes och Interfaces, Objects och References, Initialization

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

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

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

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

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

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

Föreläsning 9. Generiska enheter Inre klasser Anonyma klasser Kloning

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

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

TENTAMEN OOP

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

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

DAT043 - Föreläsning 7

Objektorienterad Programmering (TDDC77)

Objektorienterad Programmering (TDDC77)

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

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

(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

Agenda. Objektorienterad programmering Föreläsning 13

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

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

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Ingenjörsfirman Stéen Java Sida 1 av 1

Tentamen , Introduktion till Java, dtaa98, dtea53

Repetition av OOP- och Javabegrepp

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

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Objektorienterad programmering i Java

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

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

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Repetition av OOP- och Javabegrepp

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

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Objektorienterad Programmering (TDDC77)

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

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

Lösningar för tenta 2 DAT043,

Objektorienterad programmering D2

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

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

Ett objekt... Exempel: Om ni tittar er runt i föreläsningssalen ser in många olika fysiska föremål:

PROGRAMMERINGSTEKNIK TIN212

TENTAMEN OOP

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

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

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

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

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

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

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

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

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

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Objektorienterad Programmering (TDDC77)

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

OOP Objekt-orienterad programmering

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

Objektorienterad Programmering (TDDC77)

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

Transkript:

Föreläsning 12 Inre klasser Anonyma klasser Kloning I/O-ramverket 1 Nästlade klasser En nästlad klass är en klass som är definierad i en annan klass. Det finns fyra olika slag av nästlade klasser: statiska medlemsklasser icke-statiska medlemsklasser lokala klasser anonyma klasser Nästlade klasser, förutom statiska medlemsklasser kallas också för inre klasser. Motiv för användning av nästlade klasser: ett sätt att logiskt gruppera klasser som endast används på ett ställe förstärker inkapsligen kan leda till kod som är lättare att läsa och underhålla. 2

Inre klasser En icke-statisk medlemsklass kallas för inre klass. En inre klass kan använda alla attribut och metoder i den omgivande klassen (även privata). Medlemmar i den omgivande klassen har åtkomst till alla medlemmar i den inre klassen (via instans av den inre klassen). Om den inre klassen deklareras som private så innebär det att det inte går att skaffa sig instanser av klassen utanför den omgivande klassen. En metod i den yttre klassen kan returnera en instans av den inre. Detta är användbart då den inre klassen implementerar ett gränssnitt (t.ex. i samband med händelsehantering och trådar). 4

Lokala klasser Inre klass som deklareras i ett block (d.v.s. inom { och }). Endast synlig i blocket analogt med en lokal variabel. Kan använda attribut och metoder i omgivande klass. Deklareras vanligtvis i metoder. Kan använda alla variabler och metodparametrar som är deklarerade final inom deklarationsblocket för den lokala klassen. 6

Metoden Clone En klass vars objekt skall gå att klona måste implementera gränssnittet Cloneable och överskugga metoden clone(). Det rekommenderas att överskuggade metoder av clone skall uppfylla följande villkor: x.clone()!= x x.clone().equals(x) x.clone().getclass() = x.getclass() 16

Djup kopiering (deep( copy) Grund kopiering är trivial, eftersom det bara är att nyttja metoden clone() i klassen Object. Grund kopiering fungerar då attributen för objektet som klonas utgörs av primitiva typer och icke-muterbara typer. För primitiva typer skapas kopior och för icke-muterbara typer spelar det ingen roll att de delas, eftersom de inte kan förändras. Om ett objekt har muterbara referenser måste man använda djup kopiering (deep copy) för att klona objektet. Djup kopiering innebär att man skapar kopior av de refererade objekten. Vilket kan vara mycket komplicerat. 20

Djup kopiering krångligare exempel I nedanstående scenario gör metoden clone() i klassen C1 ett anrop till super.clone(), d.v.s vi har endast en grund kopiering. v2 = v1.clone(); :C1 v1 :C1 :C2 :C2 :C2 v2 :C3 :C3 :C3 24

Djup kopiering krångligare exempel I nedanstående scenario skapar metoden clone() i klassen C1 en kopia av sin instansvariabel, vilken är en lista. Men clone() skapar inte kopior av elementen i listan. v2 = v1.clone(); :C1 v1 :C1 v2 :C2 :C2 :C2 :C3 :C3 :C3 25 Djup kopiering krångligare exempel I nedanstående scenario skapar metoden clone() i klassen C1 en djup kopia av sin instansvariabel (listan och elementen i listan) på ett korrekt sätt men clone() i klassen C2 gör en grund kopia. v2 = v1.clone(); v1 :C1 :C2 :C2 :C2 :C1 :C3 :C3 :C3 v2 :C2 :C2 :C2 26

Djup kopiering krångligare exempel I nedanstående scenario har vi en korrekt djup kopiering. Metoden clone() i klassen C1 skapar en kopia av listan och elementen i listan och clone() i klassen C2 gör en djup kopiering. v2 = v1.clone(); v1 :C1 :C2 :C2 :C2 :C3 :C3 :C3 v2 :C1 :C3 :C3 :C3 :C2 :C2 :C2 27

Problem vid kloning Det finns många problem med att implementer clone(): superklassen måste implementerar clone(). superklassens implementation måste vara korrekt. många klasser saknar implementation av clone() många klasser har felaktig implementation av clone() alla instansvariabler som är samlingar eller arrayer måste klonas element för element i cykliska strukturer och strukturer där objekt är delade, måste också motsvarande objekt vara delade i kopian... Original Copy Wrong 32

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 ett I/O-ramverk. 33 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. 34

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 (subklasser till OutputStream) 2. Inströmmar för godtycklig data (subklasser till InputStream) 3. Utströmmar för text (subklasser till Writer) 4. Inströmmar för text (subklasser till Reader) Strömmar för godtycklig data kallas byte-strömmar, eftersom man skickar en byte (8 bits) 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, dvs 16 bits) 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: All data, inklusive text, lagras och överförs i bytes. 35 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 klasserna 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. 36

Dataflödet för byte-inströmmar 37 Dataflödet för byte-utströmmar 38

Dataflödet för tecken-inströmmar 39 Dataflödet för tecken-utströmmar 40

read() och write() InputStream och Reader har bl.a. metoden public int read() throwsioexception OutputStream och Writer har bl.a. metoden public void write(int i) throws IOException Varför används inte byte read() och void write(byte b) för byte-strömmar respektive char read() och void write(char c) för char-strömmar? 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. 41

Metoder i InputStream De viktigaste metoderna är: public abstract int read() throwsioexception 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) throwsioexception 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() throwsioexception 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. 44

Subklasser till InputStream FileInputStream ByteArrayInputStream PipedInputStream ObjectInputStream SequenceInputStream InputStream {abstract} FilterInputStream BufferedInputStream DataInputStream PushbackInputStream 45

Klassen BufferedInputStream Klassen BufferedInputStream är en dekorerande klass som används för att buffra data för effektivare läsning. Klassen 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 47 Klassen 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 icketom 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 upprepade anrop till grundströmmen och motsvarande systemresurser sparas. 48

Klassen OutputStream De viktigaste metoderna i OutputStream är: public abstract void write(int b) throws IOException Skriver ut de sista 8 bitarna 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 50

Subklasser till OutputStream FileOutputStream ByteArrayOutputStream PipedOutputStream OutputStream {abstract} ObjectOutputStream FilterOutputStream BufferedOutputStream DataOutputStream PrintStream 51

Klasserna DataInputStream och ObjektInputStream Klassen DataInputStream används för att läsa Javas primitiva datatyper och klassen ObjectInputStream används för att läsa objekt. <<interface>> ObjectInput readobject(): Object... InputStream {abstract} #read(): int +read(byte[]): int +close(): void... <<interface>> DataInput readboolean(): boolean readbyte(): byte readchar(): char readshort(): short readint(): int readlong(): long readfloat(): float readdouble(): double... Om det inte finns något att läsa kastar metoderna EOFException. readobject() kastar ClassNotFoundException om felaktigt objekt läses. ObjectInputStream FilterInputStream DataInputStream 54

Klasserna DataOutputStream och ObjektOutputStream Klassen DataOutputStream används för att skriva Javas primitiva datatyper och klassen ObjectOutputStream används för att skriva objekt. <<interface>> ObjectOutput writeobject(object): void... OutputStream {abstract} #write(int): void +write(byte[]): void +close(): void... <<interface>> DataOutput writeboolean(boolean): void writebyte(byte): void writechar(char): void writeshort(short): void writeint(int): void writelong(long): void writefloat(float): void writedouble(double): void... ObjectOutputStream FilterOutputStream DataOutputStream 55

In- och utmatning av objekt För att skriva respektive läsa objekt använder man sig av strömklasserna ObjectOutputStream respektive ObjectInputStream. 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änssnittet Serializable, vilket är enkelt då detta gränssnittet saknar metoder. Många av standardklasserna implementerar Serializable. 59

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. 66

Subklasser till Reader FileReader InputStreamReader CharArrayReader StringReader PipedReader Reader {abstract} LineNumberReader BufferedReader PushbackReader FilterReader {abstract} 67 Klasserna BufferedReader och LineNumberReader BufferedReader, 'speglar' BufferedInputStream BufferedReader har bl.a. dessutom metoden public String readline() throws IOException som returnerar nästa rad. LineNumberReader, är en subklass till BufferedReader. LineNumberReader har bl.a. metoden public int getlinenumber() throws IOException som returnerar aktuellt radnummer. 68

Klassen Writer Klassen Writer har en uppsättning metoder som motsvarar de som finns för klassen OutputStream. Varav de viktigaste är: public void write(int b) throws IOException Skriver ut de sista 16 bitarna 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 write(string str) throws IOException Skriver ut strängen str på strömmen. public abstract void flush() throws IOException Ser till att all data i strömmen skrivs ut. public abstract void close() throws IOException Stänger strömmen. Har bl.a subklassen BufferedWriter som är analoga med BufferedReader för klassen Reader. 69 Subklasser till Writer FileWriter OutputStreamWriter CharArrayWriter StringWriter PipedWriter Writer {abstract} BufferedWriter PrintWriter FilterWriter {abstract} 70

Klassen BufferedReader I klassen BufferedReaderfinns 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! 71 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(".txt")); Writer out = new BufferedWriter(new FileWriter(".txt"))); 72

Teckenkodning Internt i ett Java representeras tecken med Unicode, som kodas i 16 bits. 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 ASCII-kod, medan man t.ex. i Kina använder GB-2312. ASCII-koden 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. 73 Bekvämlighetsklassen PrintWriter Klass PrintWriter används för att skriva ut objekt och primitiva typer till en textström. PrintWriter innehåller bl.a. de överlagrade metoderna print och println för samtliga primitiva typer, samt för String och Object: PrintWriter pw = newprintwriter("values.txt"); pw.println(12.34); pw.print(456); pw.println("some words"); pw.print(new Rectangle(5, 10, 5, 15)); Anropar objektets tostring()-metod 74

Klassen Scanner För läsning finns ingen ström motsvarande PrintWriter som tillhandahåller metoder för att översätta strängar till numeriska värden. Istället används klassen Scanner. Klassen Scanner innehåller bl.a. följande konstruktorer och metoder: Scanner(Readable source) skapar en ny scanner som kopplas till source int nextint() returnerar nästa token som en int double nextdouble() returnerar nästa token som en double boolean nextboolean() returnerar nästa token som en boolean String next() returnerar nästa token som en String boolean hasnextint() returnerar värdet true om nästa token är en int, annars returneras false boolean hasnextdouble() returnerar värdet true om nästa token är en double, annars returneras false boolean hasnextboolean() returnerar värdet true om nästa token är en boolean, annars returneras false boolean hasnext() returnerar värdet true om det finns fler tokens, annars returneras false 75

Standardströmmar Varje Java-program har tre strömmar som automatiskt skapas och öppnas när programmet startar: System.in System.out System.err av typen InputStream av typen PrintStream av typen PrintStream System.in System.out System.err används för inläsning och är normalt kopplad till tangentbordet används för utmatning och är normalt kopplad till bildskärmen används för felrapportering och är normalt kopplad till bildskärmen 78

Klassen File Klassen File innehåller bl.a. följande metoder: getname() getpath() isdirectory() listfiles() delete() renameto(file dest) exists() canread() 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 ändrar namn på filen kontrollerar om en fil eller ett bibliotek finns kontrollerar om en fil eller ett bibliotek får läsas 80