Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

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

Liknende presentasjoner


Presentasjon om: "Å 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."— Utskrift av presentasjonen:

1 Å 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 435.

2 Hva skjer når tall skrives til / leses fra en fil? Teksten ”25” består av tegnene ’2’ (kode 50 = ) og ’5’ (kode 53 = ). Teksten etterfølges av linjeskift, ikke vist her. skriver.println(tall); String s = leser.readLine() int tall2 = Integer.parseInt(s);int tall1 = 25; heltallet 25 på binær form i primær- minnet på disken

3 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

4 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)

5 Eksempel 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 < 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); /* 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(); } /* Utskrift Filen har lengde: */ for (int i = 0; i < 10; i++) fil.writeInt(i); fil.seek(6 * 4); fil.readInt(tall) 2 3 1

6 Hvordan lagre et objekt på fil? Hvordan lagrer vi et objekt av klassen Register på fil? class Register { private ArrayList liste = new ArrayList ();.. class Utstyr { public static final int BESTILLINGSFAKTOR = 5; private String betegnelse; private String leverandør; private int påLager; private int nedreGrense; Vi må plukke objektet fra hverandre og lagre hver enkelt dataverdi, for eksempel slik: skriv BESTILLINGSFAKTOR til filen skriv antall utstyrsobjekter til filen for (int i = 0; i < register.finnAntUtstyr(); i++) { Utstyr u = register.finnUtstyr(i); skriv betegnelse, leverandør, påLager, nedreGrense til filen } tilsvarende for alle utstyrsobjekter 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 - ?

7 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 register til fil: FileOutputStream utstrøm = new FileOutputStream(”register.ser"); ObjectOutputStream ut = new ObjectOutputStream(utstrøm); ut.writeObject(register); ut.close(); Å lese objektet fra fil: FileInputStream innstrøm = new FileInputStream("leilighet1.ser"); ObjectInputStream inn = new ObjectInputStream(innstrøm); Object obj = inn.readObject(); …eventuell casting til Register gir advarsel: ” warning: [unchecked] unchecked cast” …gjøre noe med objektet inn.close();

8 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 Utstyr implements java.io.Serializable { –class Register 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.

9 Sammendrag - datafiler Sekvensielle datafiler med tekstlig overføring av data (kap ) –Å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 ) –Skriver og leser hele objekter. –Sekvensiell behandling av filen. –Filen er ikke lesbar i en editor (tekster vil kunne gjenfinnes blant mye annet).


Laste ned ppt "Å 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."

Liknende presentasjoner


Annonser fra Google