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

Slides:



Advertisements
Liknende presentasjoner
Repetisjon innkapsling static tabell av primitiv datatype LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring.
Advertisements

Tabeller av objekter Klassen ArrayList
Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring
Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Fag LO189D - Objektorientert programmering Objektorientert programmering© Else Lervik, TISIP - HiST/IDB vår-99Leksjon 12 Datalagring, Beans, 2D og Collections.
Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring
Filbehandling (Kapittel 8)
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Uke 10 - Sortering, og hvordan lage en klasse for et klassebibliotek 21 okt. 2003, Arne Maus Inst. for informatikk, UiO.
Uke 8 - Mer om: Objekter, klasser og pekere
Polymorfi og arv, del 1 LC191D Videregående programmering Semesterplan: Høgskolen i Sør-Trøndelag, Avdeling.
1 Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo.
1 Litt om OO og programmering Arne Maus. 2 OO og Java (og C++, C#)  Arven fra Simula  Programstruktur i Java  Generering av objekter  Beskyttelse.
Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Tabeller – Arrays Lage frekvenstabell Norske Bokstaver
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Java 4 Mer om forgreninger While-løkker Ole Christian Lingjærde
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
IS-102 Klassedefinisjoner
Oblig4 - forklaringer Arne og Ole Christian.
Eiendomsregister - eksempel
C# for javaprogrammerere
En gang til!? .
Filer Finne minste Finne Største Beregne gjennomsnitt Variabler Tabeller – Arrays Lage frekvenstabell.
Feilhåndtering. Feil er uunngåelige! Erfaring viser at feil i dataprogrammer som består av mer enn noen få linjer ikke er til å unngå. For å få et godt.
Mer om programmering av aggregeringer Repetisjon: Komposisjon og aggregering En register-klasse: modellering En register-klasse: implementering Sortering.
Å lage sikre klasser Unntaksklassene i Java-API-et Unntakshåndtering i databasesammenheng try-catch-finally-setningen Trelagsarkitektur; egen databaseklasse.
Introduksjon til Java 5.0. Hva er nytt i 5.0? Generiske typer For-løkke med iterator (for-hver løkke) Automatisk innpakking av primitive typer Metadata.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Objektorientert programmering
Høgskolen i Oslo Webprogrammering Filbehandling i PHP.
Uke 7 - del I: Repetisjon del II: Objekter, klasser og pekere 30 sept. 2003, Arne Maus Inst. for informatikk, UiO.
Java 11 Programmering med og uten objekter: hva er forskjellen?
Å 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.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 18.9 Lesing av data fra fil og skriving av data til fil. Side 411 – 4.. Kap 4.
Tabeller Dette er en tabell, eller array. Den kan defineres sånn som dette: public int[] heltallsTabell = new int[11]; //Her er 11 tabellens lengde for.
INF1000 (Uke 14) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Anja B.
Main metoden n public static void main(String[] args){ } n Inni denne metoden skjer alt! n Det kan bare finnes en main metode per program. n Den kan ligge.
INF Objektorientert programmering
Programmering i Java versjon september 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Object  Klassen i java  Alle klasser arver fra denne om ikke noe annet blir spesifisert  ArrayList.add(Object instans)  Alle elementer formes til Object.
Ekstra mange tips til Oblig 3! 12. mars 2007 Are Magnus Bruaset og Arild Waaler Inst. for informatikk, UiO.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Byggeklosser i java  Klassedefinisjon  Variabel deklarasjon  Metodedeklarasjoner  En ordentlig klasse  Spesielle/kryptiske skrivemåter  løkker og.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 25.9 MER OM: Sub-prosedyrer og sub-funksjoner Kap 4.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Inf1000 (Uke 10) HashMap og ArrayList
INF1000 (Uke 4) Mer om forgreninger, While-løkker
Inf1000 (Uke 5) Arrayer, filer og tekst
Kapittel 4 Skriving av klasser. 4.1 Anatomien til ein klasse Så langt har vi brukt ferdige klasser frå klassebiblioteket i Java Vi lagar objekt og brukar.
Kapittel 7 Array (lister og tabellar). 7.1 Arrayelement Array (lister, tabellar) er kjent frå VB Blir brukt til å organisere data når vi har mange dataelement.
Jæger: Robuste og sikre systemer INF150 Programmering torsdag 14.9 Ulike måter for å lese inn og skrive ut data. Kap. 3.5 mer om if – setninger Ferdige.
Kapittel 10 Exceptions Handtering av exceptions Ein exception er eit objekt som representerer ein feil eller eit unntak Exceptions blir kasta av.
Variabler, datatyper og uttrykk
IN3030 – Effektiv parallellprogrammering Uke 1 2. del, våren 2019
Utskrift av presentasjonen:

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

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

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

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

Å 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

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

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

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

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

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

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

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

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