1 / 9

Å lese tall fra en fil, klassen Scanner

Å 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 12.2 side 435. Hva skjer når tall skrives til / leses fra en fil?. 11001. 11001.

ehren
Download Presentation

Å lese tall fra en fil, klassen Scanner

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

  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 /* 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 < 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 < 10; i++) fil.writeInt(i); 3 fil.readInt(tall)

  6. Hvordan lagre et objekt på fil? • Hvordan lagrer vi et objekt av klassen Register på fil? class Register { private ArrayList<Utstyr> liste = new ArrayList<Utstyr>(); .. 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. 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). Sammendrag - datafiler

More Related