Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Datafiler og serialisering Tekstfiler Scanner-klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering.

Liknende presentasjoner


Presentasjon om: "Datafiler og serialisering Tekstfiler Scanner-klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering."— Utskrift av presentasjonen:

1 Datafiler og serialisering Tekstfiler Scanner-klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering Semesterplan: Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring Else Lervik, januar 2010

2 Motivasjon  Hittil har programmene kommunisert med omverden via tastatur og skjerm  Ønskelig at data kan leve fra en kjøring til neste  Datafiler, tema denne gang  Databaser, tema neste gang  De fleste profesjonelle program bruker datafiler og/eller databaser Forelesning 4, side 2

3 Oppgave 1: Å lese fra tekstfil  Utvid main() i klassen FilLeser.java (se nedenfor) slik at programmet leser linje for linje fra en datafil. Hver enkelt linje skal skrives på skjermen. Programmet skal telle antall linjer lest og skrive ut det til slutt. import java.io.*; class FilLeser { public static void main(String[] args) throws IOException { String filnavn = "datafil.txt"; FileReader leseforbTilFil = new FileReader(filnavn); BufferedReader leser = new BufferedReader(leseforbTilFil); //... setninger som leser fra filen legges her... leser.close(); } Forelesning 4, side 3

4 Oppgave 2: Å skrive til teksfil  Utvid main() i klassen FilSkriver.java (se nedenfor) slik at programmet går i løkke og skriver nye linjer til datafilen fra oppgave 1. Hver enkelt linje skal leses inn fra brukeren ved å bruke showInputDialog(). import java.io.*; import static javax.swing.JOptionPane.*; class FilSkriver { public static void main(String[] args) throws IOException { String filnavn = "datafil.txt"; FileWriter skriveforbTilFil = new FileWriter(filnavn, true); PrintWriter skriver = new PrintWriter(new BufferedWriter(skriveforbTilFil)); //... setninger som skriver til filen legges her... skriver.close(); } Forelesning 4, side 4

5 Å lese tall fra en fil, klassen Scanner  Et Scanner-objekt kan knyttes til et strømobjekt eller til en streng.  Kan skanne teksten etter data av ulike typer.  Kan kun skanne framover i teksten. Vis programliste 16.2 side 531 LesMangeTall.java Forelesning 4, side 5

6 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 Forelesning 4, side 6

7 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 Forelesning 4, side 7

8 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) Forelesning 4, side 8

9 Eksempel import java.io.*; // DirekteTilgFil.java, side 535 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) Forelesning 4, side 9

10 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 final String betegnelse; private final 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 - ? Forelesning 4, side 10

11 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(); Forelesning 4, side 11

12 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 Java API-et 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. Forelesning 4, side 12

13 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.  Kommandovinduet er et spesialtilfelle av denne typen fil.  Kan lage en fil av denne typen i en editor.  Binær overføring av data (kap. 16.7)  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. 16.8)  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. 16.9)  Skriver og leser hele objekter.  Sekvensiell behandling av filen.  Filen er ikke lesbar i en editor (tekster vil kunne gjenfinnes blant mye annet). Forelesning 4, side 13


Laste ned ppt "Datafiler og serialisering Tekstfiler Scanner-klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering."

Liknende presentasjoner


Annonser fra Google