Input/output • Externa data kan tillhandahållas på många sätt i Java : – Via GUI Filer och IO – Läsas och skrivas direkt till och från tangentbord och bildskärm – Läsas och skrivas till och från filer – Läsas och skrivas till och från databaser – … • Java API tillhandahåller paketet java.io – Klasser som stöder input/output” – Klasser för att hantera när I/O-operationer går fel • Typfel • En fil som inte går att hitta/öppna • … Filer • Filer kan användas för att lagra data permanent mellan programkörningar eller för utbyte av information mellan program. • Textfiler läsbara även för oss (med tex en texteditor) till skillnad från binära filer som lagrar datat mer som i datorns minne. Skriva och läsa textfiler • Strömmarna betraktas som innehållande värden av typen char • Klasser som hanterar textfiler kallas readers och writers • Tre viktiga åtgärder – Öppna filen – Skriv/läs data – Stäng filen • Samtliga dessa kan misslyckas – Man måste förutse undantag! 155 Öppna/Skriva/Stänga • Skapa ett FileWriter objekt • En konstruktor tar filnamnet som parameter (String) FileWriter writer = new FileWriter(”testfil.txt”); • Skriv med metoden write() • Överlagrad, tex. med signaturen write(String str) writer.write("Första raden\n"); • Stäng filen med metoden close() writer.close(); //(Obs stäng ej System.in) Koppla ihop strömmar • För mer avancerat beteende kan de enkla strömmarna som läser/skriver från något kopplas ihop med mer avancerade strömmar. • Ex: PrintWriter out = new PrintWriter(new FileWriter(“filnamn.txt”)); out.println(“hej”); out.close(); • Strömmar finns bla. för buffring, hantera 157 radnummer, komprimering och kryptering 157 1 Läsa från filer I/O Streams • Scanner har en konstruktor som tar ett Fileobjekt som parameter • Alternativt kan man koppla ihop den med en Reader-klass • File f = new File(“minfil.txt”); • Scanner in = new Scanner(f); //Kastar ett kontrollerat undantag • Scanner in2 = new Scanner(new FileReader(“minfil.txt”)); • String str = in2.next(); • in2.close(); ,QSXW6WUHDPV 2XWSXW6WUHDPV 'DWD 6WUHDPV 3URFHVVLQJ 6WUHDPV &KDUDFWHU 6WUHDPV %\WH 6WUHDPV 158 Interfaces • Med interface betecknas allmänt de resurser en klass (eller ett objekt) ställer till förfogande • Mängden resurser som kan användas av “andra” • I Java formaliseras detta m h a interfacekonstruktionen • Ett Java interface är en mängd konstanter och abstrakta metoder • En interface lägger på så sätt fast “krav” på de klasser som implementerar interfacet Interface och Paket class klassnamn implements interfacenamn { … OBS! Det får finnas flera } Comparable i Shapes2- exemplet Interface - exempel Finns i paketet java.lang public interface Comparable { int compareTo(Object obj); } public abstract class Figure implements Comparable { private int xPosition; private int yPosition; metoden compareTo private String color; implementeras inte i Figure … Detta lämnas till de klasser som härleds från Figure protected abstract float getArea(); // Compute and return area of figure Alla klasser ärver från Object } För att ha något att jämföra 2 Ny Square Interface - deklaration import java.awt.Rectangle; public class Square extends Figure // impl automatiskt Comparable { ... protected float getArea() { return size * size; } public int compareTo(Object obj) { if (this.getArea() < ((Figure) obj).getArea() ) return -1; else if (this.getArea() > ((Figure) obj).getArea() ) return 1; else return 0; } public interface Interfacename { •konstantdeklarationer •abstrakta metodhuvuden } } Interfaces Interfaces • Varje interface-implementation är en ny “version” av interfacet • Interface är inga klasser och kan inte instantieras • En klass kan ärva från en klass och dessutom implementera ett eller flera interface • Interface-konstanterna är tillgängliga i den implementerande klassen • En interface kan “ärva” från ett eller flera interface (m h a extends) • En klass som implementerar ett sådan interface måste också implementera alla ärvda metoder Paket (packages) • Ett Java-paket är en mängd klasser • Paket användas för att gruppera liknande klasser och/eller sådana som beror på varandra • Klasserna i ett paket behöver inte ärva från varandra • Java util är ett paket (java.util) • Java API:n består av många paket • import satsen gör innehållet i ett paket tillgängligt import paketnamn.klassnamn; import paketnamn.*; enstaka klass alla klasser i paketet • Varje interface definierar en klasstyp • Interface liknar en superklass för alla klasser som implementerar interfacet !Polymorfi gäller även för interface !Referenser får referera till objekt av en subklass • Interface-konceptet har många likheter med (multipelt) arv, dock utan dess nackdelar • Multipelt arv finns inte i Java Paket • Programmeraren kan definiera egna paket package paketnamn; • Package-satsen måste vara första satsen i ett fil • Alla klasser i filen läggs till det namngivna paketet • Det får bara finnas en package sats i en fil • Paketnamnet motsvarar katalognamnet där klassfilerna finns • Det finns en s k environment variable CLASSPATH som lägger fast var systemet skall leta efter paket • Vid namnkollision måste berörda klasser kvalificeras (specificeras med fullt namn) 3 Skuggning av namn • OBS! Nya deklarationer skuggar giltiga identifierare !Man kommer inte längre åt det skuggade namnet • Kan bli problem om man tex ska göra en klass Rectangle • Använd full kvalificering (kontext + namn) för att komma åt skuggade namn • Exempel (se shapes exemplet): import java.awt.*; public class Rectangle { canvas.fill(new java.awt.Rectangle(…); } Object Serialization • Object serialization är ett sätt att spara ett objekts tillstånd (tex i en fil) så att vi sedan kan komma åt det även efter att programmet avslutats. • Object serialization åstadkoms mha Serializable interfacet och klasserna ObjectOutputStream och ObjectInputStream • writeObject metoden används för att serializera ett objekt • readObject används för att återskapa objektet 4