Filer och IO Input/output Filer Skriva och läsa textfiler Öppna/Skriva

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