Kun til bruk i tilknytning til l - PowerPoint PPT Presentation

About This Presentation
Title:

Kun til bruk i tilknytning til l

Description:

Title: Variabler, datatyper og uttrykk Author: Else Lervik Last modified by: else Created Date: 8/9/1999 1:45:26 PM Document presentation format: On-screen Show – PowerPoint PPT presentation

Number of Views:99
Avg rating:3.0/5.0
Slides: 23
Provided by: ElseL3
Category:

less

Transcript and Presenter's Notes

Title: Kun til bruk i tilknytning til l


1
Datafiler
Hva er en datafil? side 2 Datafiler og
strømmer side 3 Eksempel med lesing og
skriving side 4-7 Sekvensielle datafiler
sammendrag side 8-9 Inn-/ut-klassene i
Java side 10-11 Å lese tall fra en fil, klassen
Scanner side 12 Å kommunisere med
konsollet side 13 Hva skjer, tekstlig/binær
dataoverføring side 14-15 Direkte tilgang til
innholdet i en fil side 16-17 Hvordan lagre
objekter på en fil / serialisering side
18-21 Sammendrag datafiler side 22

2
Hva er en datafil?
  • Hittil har programmene våre kommunisert med
    omverdenen via tastatur og skjerm.
  • Program kan også kommunisere med datafiler.
  • Eksempler på datafiler er filer du arbeider med i
    tekstbehandlere og editorer.
  • Datafiler gjør det mulig for programmet å huske
    data fra kjøring til kjøring, brukeren trenger
    ikke å skrive inn alt på nytt.

3
Datafiler og strømmer
  • Vi betrakter dataene som sendes mellom program og
    fil som en strøm
  • Data strømmer fra kilde til bestemmelsessted.
  • Begynner alltid med å åpne strømmen.
  • Fyller på strømmen når vi skal skrive til
    datafilen.
  • Tømmer strømmen når vi skal lese fra filen.
  • Til slutt lukker vi strømmen.
  • I programmet begynner vi med å knytte en strøm
    til den fysiske filen, vi åpner filen.
  • Strømmen er det objektet som vi sender meldinger
    til når vi skal lese eller skrive til filen.
  • Lukking av strømmen fører til at forbindelsen
    mellom strømmen og den fysiske filen opphører, vi
    lukker filen.
  • Det finnes mange strømklasser. Vi bruker dem på
    en spesiell måte
  • Et objekt av én strømklasse blir gjerne argument
    til konstruktøren til en annen klasse. Dette
    gjentas inntil vi får en strøm som passer med det
    behovet vi har.

4
Eksempel på program som kommuniserer med en
datafil
Anne Eriksen Tove Ås Berit Jensen Toril
Sollien Arne Håkonsen
Anne Eriksen Tove Ås Berit Jensen
programmet kjører
programmet leser data fra datafilen
programmet skriver data til datafilen
navnefil.txt før kjøring av programmet
navnefil.txt etter kjøring av programmet
programmet leser data fra tastaturet
brukeren skriver inn data
5
Å lese alle navnene fra filen
String filnavn navnefil.txt
åpner filen
  • FileReader leseforbTilFil new
    FileReader(filnavn)
  • BufferedReader leser new BufferedReader(leseforb
    TilFil)
  • String etNavn leser.readLine()
  • String innlesteNavn "Følgende navn er
    registrert"
  • while(etNavn ! null) // null betyr
    filslutt
  • innlesteNavn ("\n" etNavn)
  • etNavn leser.readLine()
  • leser.close()
  • showMessageDialog(null, innlesteNavn)

data bør bufres
leser en og en linje, og lagrer dem i et
strengobjekt
lukker strømmen, og dermed filen
skriver navnene på skjermen
6
Lesing fra fil via strømmer
klient
leser BufferedReader
leseforbTilFil InputStreamReader
innfil FileInputStream
klient sender meldingen readLine() til
leser hvis bufferet er tomt, må leser
fylle bufferet leseforbTilFil leser byte og
omformer til char som legges i bufferet leser
henter en linje fra bufferet og returnerer til
klient
readLine()
buffer tomt fill()
read()
read()
mange byte returneres
mange Unicode-tegn returneres
7
Å skrive til fil
FileWriter skriveforbTilFil new
FileWriter(filnavn, true) PrintWriter skriver
new PrintWriter(new BufferedWriter(skriveforbTi
lFil)) String nyttNavn Peder
Ås skriver.println(nyttNavn) skriver.close()
åpner filen
data bør bufres, og vi ønsker å bruke println()
som vi kjenner fra før
skriver en linje til strømmen
lukker strømmen, og dermed filen
Vis programliste 12.1 side 428-429.
Gjør oppgavene side 432 og 433.
8
Sekvensielle datafiler - sammendrag
  • En sekvensiell datafil åpnes for lesing eller
    skriving.
  • Lesing foregår alltid fra begynnelsen av filen.
  • Skriving kan foregå fra begynnelsen av filen
    (andre argument til FileWriter() er false), eller
    etter det som ligger på filen fra før (andre
    argument til FileWriter() er true).
  • En fil som programmet skal lese fra, må eksistere
    på forhånd.
  • En fil som programmet skal skrive til, blir laget
    dersom den ikke eksisterer på forhånd.

9
Lesing og skriving til fil - oversikt
 
å lese fra fil å skrive til fil
å åpne fil FileReader forbindelse new FileReader(filnavn) FileWriter forbindelse new FileWriter(filnavn, append)
å lage lesestrøm eller skrivestrøm BufferedReader leser new BufferedReader( forbindelse) PrintWriter skriver new PrintWriter(new BufferedWriter( forbindelse))
å lese/skrive til strømmen leser.readLine(...) skriver.print(....) skriver.println(....)
å lukke strømmen leser.close() skriver.close()
10
Et lite utsnitt av inn-/ut-klassene i JDK 1.0
Object
Object
OutputStream
InputStream
FileInputStream
FileOutputStream
FilterOutputStream
PrintStream
11
Et lite utsnitt av inn-/ut-klassene i JDK 1.1 og
nyere
Object
Object
Writer
Reader
BufferedReader
InputStreamReader
FileReader
OutputStreamWriter
PrintWriter
BufferedWriter
FileWriter
12
Å lese tall fra en fil, klassen Scanner
  1. Et Scanner-objekt kan knyttes til et strømobjekt
    eller til en streng.
  2. Kan skanne teksten etter data av ulike typer.
  3. Kan kun skanne framover i teksten.

Vis programliste 12.2 side 437.
Gjør oppgaven side 438.
13
Å kommunisere med konsollet
  • Utskrift er velkjent System.out.println()
  • Innlesing blir omtrent som ved lesing fra fil
  • InputStreamReader leseforbTilKonsoll new
    InputStreamReader(System.in)
  • BufferedReader leser new BufferedReader(leseforb
    TilKonsoll)
  • System.out.print("Skriv fornavn ")
  • System.out.flush() // tømmer bufferet etter at
    print() er brukt
  • String fornavn leser.readLine()
  • I konsollvinduet
  • gtjava les
  • Skriv fornavn Åse

14
Hva skjer når tall skrives til / leses fra en fil?
11001
11001
int tall2 Integer.parseInt(s)
int tall1 25 heltallet 25 på binær form
i primær- minnet
110010 110101
String s leser.readLine()
skriver.println(tall)
på disken
110010 110101
Teksten 25 består av tegnene 2 (kode 50
1100102) og 5 (kode 53 1101012). Teksten
etterfølges av linjeskift, ikke vist her.
15
Tekstlig kontra binær overføring av data
  • Tekstlig overføring av (tall-)data
  • Filen kan leses av mennesker.
  • Omformingen til / fra binær form tar tid.
  • Dersom desimaltall skal beholde nøyaktigheten må
    en double skrives til fil med 15 sifre.
  • Binær overføring av (tall-)data
  • Dataene overføres direkte mellom primærminnet og
    datafilen.
  • Filen kan ikke leses av mennesker.
  • Ingen tid brukes til omforming mellom
    forskjellige representasjoner av tallet.
  • Dataene tar akkurat like stor plass på filen som
    i primærminnet.
  • Interface for binær dataoverføring
  • DataInput
  • DataOutput

16
Direkte tilgang til innholdet i en fil
  • Et objekt av klassen RandomAccessFile knyttes til
    en fil som kan åpnes for både lesing og skriving.
  • Vi kan flytte oss framover og bakover i filen ved
    å posisjonere filpekeren et antall byte framover
    eller bakover.
  • Klassen RandomAccessFile implementerer
    interfacene for binær dataoverføring.
  • Konstruktør
  • RandomAccessFile(String filnavn, String modus)
  • modus r eller rw
  • Metoder - alle kan kaste IOException
  • long getFilePointer(), void seek(long pos), long
    length()
  • void close()
  • char readChar(), int readInt(), double
    readDouble()
  • void writeChar(int tegn), void writeInt(int
    heltall), void writeDouble(double desimaltall)

17
Eksempel
/ Leser hele filen / fil.seek(0)
// flytter til begynnelsen av filen try
while (true) // stopper når EOFException
kastes int t fil.readInt()
System.out.println(t)
catch (EOFException e)
fil.close()
import java.io. class DirekteTilgFil public
static void main(String args) throws
IOException RandomAccessFile fil
new RandomAccessFile("Direktefil.dat",
"rw") / Skriver 10 heltall til filen /
for (int i 0 i lt 10 i)
fil.writeInt(i) long fillengde
fil.length() System.out.println("Filen har
lengde " fillengde) /
Flytter filpekeren til tall nr 7, leser det,
ganger det med 10, og skriver det tilbake
igjen / fil.seek(6 4) // flytter
forbi 6 tall, hver på 4 byte int tall
fil.readInt() tall 10 fil.seek(6
4) // flytter filpekeren "tilbake"
fil.writeInt(tall)
/ Utskrift Filen har lengde
40 0 1 2 3 4 5 60 7 8 9 /
0
1
2
3
4
5
6
7
8
9
1
fil.seek(6 4)
2
for (int i 0 i lt 10 i)
fil.writeInt(i)
fil.readInt(tall)
3
18
Hvordan lagre et objekt på fil?
  • Hvordan lagrer vi et objekt av klassen
    Oppussingsprosjekt på fil?
  • class Oppussingsprosjekt
  • private String navn
  • private ArrayList ltFlategtalleFlater new
    ArrayListltFlategt()
  • private ArrayList ltMalinggtalleMalingstyper
    new ArrayListltMalinggt()
  • Vi må plukke objektet fra hverandre og lagre hver
    enkelt dataverdi, for eksempel slik
  • skriv først antall flater til filen
  • for (int i 0 i lt prosjekt.finnAntFlater()
    i)
  • Flate flaten prosjekt.finnFlate(i)
  • skriv navn, lengde og bredde til flaten, samt
    navn på malingstype
  • tilsvarende for alle malingstyper
  • En streng må lagres ved at tegnene legges i en
    tabell av char. Tabellen og tabellens lengde
    skrives til filen.
  • Ved innlesing må vi gjennomføre den omvendte
    prosessen.
  • Eller - ?

19
Serialisering
  • Java tilbyr serialisering av objekter.
  • Hele objektet lagres med én setning.
  • Filen er ikke lesbar i en editor.
  • Filen er sekvensiell og åpnes for lesing eller
    skriving.
  • Å skrive objektet enLeilighet til fil
  • FileOutputStream utstrøm new FileOutputStream("l
    eilighet1.ser")
  • ObjectOutputStream ut new ObjectOutputStream(uts
    trøm)
  • ut.writeObject(enLeilighet)
  • ut.close()
  • Å lese objektet fra fil
  • FileInputStream innstrøm new FileInputStream("le
    ilighet1.ser")
  • ObjectInputStream inn new ObjectInputStream(inns
    trøm)
  • Object obj inn.readObject()
  • eventuell casting til Oppussingsprosjekt
  • gjøre noe med objektet
  • inn.close()

20
Hva må til for at et objekt skal kunne
serialiseres?
  • Klasser som beskriver serialiserbare objekter må
    implementere interfacet java.io.Serializable.
  • Enkelt! Det inneholder ingen metoder.
  • I vårt tilfelle
  • class Flate implements java.io.Serializable
  • class Maling implements java.io.Serializable
  • class Oppussingsprosjekt implements
    java.io.Serializable
  • De aller fleste klassene i SDK implementerer
    Serializable
  • Hva skjer i serialiseringsprosessen?
  • Objektvariabler lagres, klassevariabler lagres
    ikke.
  • Informasjon om hver enkelt klasse, inkludert
    versjon, lagres.
  • En referanse til et objekt fører til at objektet
    lagres første gang referansen påtreffes. Objektet
    får da et serienummer. Neste gang referansen
    påtreffes, lagres bare serienummeret.
  • Dersom klassen forandrer seg (ny versjon blir
    laget) mellom skriving og lesing av filen kastes
    unntaket InvalidClassException.

21
Vis programliste 12.4 side 443-445
Gjør oppgavene side 447.
22
Sammendrag - datafiler
  • Sekvensielle datafiler med tekstlig overføring av
    data (kap. 12.1-12.7)
  • Åpnes for lesing eller skriving.
  • Leser linjevis med readLine().
  • Skriver med print() og println().
  • Eventuelle data av talltyper blir omformet
    til/fra tekst.
  • Konsollet er et spesialtilfelle av denne typen
    fil.
  • Kan lage en fil av denne typen i en editor.
  • Binær overføring av data (kap. 12.8)
  • Data, også data av talltyper, overføres uten
    omforming.
  • En fil med slike data må alltid lages av et
    program.
  • Filer med direkte tilgang (kap. 12.9)
  • Kan åpnes for både lesing og skriving.
  • Ikke sekvensiell Kan flytte filpekeren framover
    og bakover.
  • Data overføres binært. Kun data av typen char vil
    være lesbare i en editor.
  • Serialisering (kap. 12.10)
  • Skriver og leser hele objekter.
  • Sekvensiell behandling av filen.
  • Filen er ikke lesbar i en editor (tekster vil
    kunne gjenfinnes blant mye annet).
Write a Comment
User Comments (0)
About PowerShow.com