Bruk av class Scanner, split(), FileWriter og Formatter som alternativ til easyio i INF1000.

Like dokumenter
Bruk av class Scanner, FileWriter og Formatter som alternativ til EasyIO i INF1000.

INF1000-SIKT - Notat om I/O i Java

Oversikt. INF1000 Uke 6. Objekter, pekere og null. Lese og skrive fra/til fil. Litt om objekter, pekere og null Filer og easyio. Litt mer om tekster

Enkel lesing og skriving i Java

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

INF1010 våren 2018 tirsdag 23. januar

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

INF1000 : Forelesning 5

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

IN Notat om I/O i Java

INF Notat om I/O i Java

Forelesning inf Java 5

Repetisjon. INF gruppe 13

Oblig 4Hybelhus litt mer tips enn i oppgaven

Mer om uttrykk, terminal I/O, forgreninger. Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo

1. Finn klassene (hvilke objekter er det i problemet) 1. Dataene som beskriver problemet (hvilke objekter har vi og hvor mange klasser er det?

INF1000: noen avsluttende ord

Oversikt. Filer. Litt mer om tekster. INF1000 Uke 6. Lese og skrive fra/til fil. Eksempel. Vi importerer pakken easyio. Klassene In og Out i easyio

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF 1000 høsten 2011 Uke september

INF 1000 høsten 2011 Uke 3 6. september

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Forelesning inf Java 5

Forelesning inf Java 5

Innhold uke 3. INF 1000 høsten 2011 Uke 3 6. september. Uttrykk. Variabel: En plass i hukommelsen

INF1000 (Uke 4) Mer om forgreninger, While-løkker

Forelesning inf Java 4

INF1010 våren 2017 Onsdag 25. januar. Litt om unntak i Java

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

INF1000 Uke 5. Litt om objekter, filer med easyio, tekst

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

INF1000 : Forelesning 4

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

INF1000: noen avsluttende ord

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

INF1000 : Forelesning 1 (del 2)

TEMA: Kommunikasjon med Bruker INF1000 Plenumsgruppe 1, formatert utskrift

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

INF 1010, vår 2005 Løsningsforslag uke 11

Leksjon 7. Filer og unntak

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Inf1000, uke 5 19 sept. 2006

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Java 6. Eksempel med to-dimensjonal array Filbehandling Tekster

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2009

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

Blokker og metoder INF1000 (Uke 6) Metoder

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

switch: - terminal-i/o (bruker-i/o)

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

UNIVERSITETET I OSLO

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

Repetisjon Program. INF1000 Uke 2. Repetisjon Program Prosedyren main Alt inne i klasser. Repetisjon Variable og uttrykk

Oblig 3 tips litt mer tips enn i oppgaven

INF1000 Behandling av tekster

Forelesning inf Java 2

Forelesning inf Java 2

TOD063 Datastrukturer og algoritmer

Litt om pakker og mest om data inn og ut

som jobbet nærmest døgnet rundt i 18 måneder i Menlo Park i California for å forberede den neste bølgen innen computing.

Litt Java-historikk. Litt Java-historikk. Ulike varianter for ulike behov. Litt Java-historikk. The Green Team

INF1000 (Uke 6) Mer om metoder, tekster

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 h2006

Oblig4 - forklaringer. Arne og Ole Christian

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

INF1000 : Forelesning 2

INF Uke 10. Ukesoppgaver oktober 2012

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

Løsningsforslag ukeoppg. 2: 31. aug - 6. sep (INF Høst 2011)

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000

Oversikt. INF1000 Uke 3. Underveisevaluering. Spørsmål

Oblig 3 tips litt mer tips enn i oppgaven

UNIVERSITETET I OSLO

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

Fullstendige programeksempler. INF1000 : Forelesning 2. Eksempel 1. Eksempel 2. Vi skal nå se på endel programeksempler.

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2008

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF1000 : Forelesning 2

De numeriske datatypene. INF1000 : Forelesning 2. Sannhetsverdier. Desimaltall. int og double er eksempler på numeriske datatyper

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

UNIVERSITETET I OSLO

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

Transkript:

Arne Maus, ver.2.3, oktober, 2013 Bruk av class, split(), FileWriter og Formatter som alternativ til i INF1000. Noen ønsker å bruke noen av de klassene vi finner i pakken java.util og java.io isteden for i INF1000. Kurset og læreboka Rett på Java beskriver på s. 66-71 bruk av klassene til innlesning PrintWriter til utskrift og Formatter til formattering av særlig tall til senere utskrift. Dette notatet prøver på en enkel måte å gi noen tips til bruk av disse klassene, og dekker enkel innlesning og utskrift av tall og tekster. Vi presiserer at det er helt greit å bruke å bruke disse klassene på obligatoriske oppgaver og til eksamen, men at vi anbefaler fordi vi mener den pakken (som også er implementert ved bruk av standard Java klasser), er enklere for studentene. Installering av Gjøres enklest ved å laste ned.jar fra hjemmesida og legge en kopi i de(n) fil-mappen(e) der du kompilerer dine java-programmer (der du har.java-filene). Innlesning Innlesning kan skje både fra fil og fra tastaturet, og det er grovt sett tre måter å lese f.eks en fil på: 1. tegn for tegn (alt leses) 2. feltvis (f.eks tall etter tall hvor vi hopper over blanke, linjeskift o.l) 3. linjevis. EasyIO har metoder for alle de tre måtene å lese på og de kan blandes under lesing av en fil. Klassen har innlesningsmuligheter for de to siste måtene. Når vi skal lese fra fil eller tastatur må vi først opprette et leseobjekt. Det kobler ditt program sammen med den filen eller tastaturet vi leser fra. Så kaller vi lesemetoder i dette objektet for å foreta selve lesingen. Til slutt bør vi lukke vi leseobjektet. Opprettelse av et leserobjekt: For å lese fra tastaturet import.*; // må installeres In tast = new In(): import java.util.*; // er installert sc = new (System.in); For å lese fra en fil Både og opererer med en innlesningsmarkør som forteller hvor langt vi har kommet i lesingen av fila. Vi leser så fra starten av filen og utover mot slutten av fila. Når det leses med fra en fil må vi legge åpningen (og all senere lesing) inn i en try-catch blokk fordi man skal kunne fange opp mulige feil (som at en fil med det navnet ikke finnes). import.*; In f = new In("Data1.txt ): import java.io.*; // for klassen: File import java.util.*; // for klassen f ;

f = new (new File("Data1.txt")); } catch (Exception e) { /* legg feilmelding her */ f = null; } Grunnen til at f må deklareres utenfor try-catch blokken, er at man ikke er sikker på at try-grenen blir utført, og da har man ikke laget noe leser-objekt f. Tilordningen f = null er også viktig i catch-grenen da resten av koden nå vet at f har en gyldig verdi uansett om try- eller catch-grenen ble utført (null er en gyldig verdi, men den kan jo senere gi problemer). Alternativt kunne f fått null verdien i deklarasjoner ( f=null ;). Lese en linje fra en tastaturet Når det leses med fra en fil er det veldig likt, med det unntaket at har en metode inline () som leser neste ikke-tomme linje: String l = tast.readline() ; // leser resten av String l = sc.nextline(); // leser resten av String l = tast.inline() ; // leser resten av inneværende // linje og hvis den er tom, neste ikke-tomme linje Lese en linje fra en fil Når det leses med fra en fil må vi legge åpningen (og all senere lesing) inn i en try-catch blokk fordi man skal kunne fange opp mulige feil (som at en fil med det navnet ikke finnes). String t = f.readline() ; // leser resten av String t = f.inline() ; // leser resten av inneværende // linje og hvis den er tom, neste ikke-tomme linje String t = null; t= f.nextline();// leser resten av Lese et ord (ikke hele linja) fra en fil og fra tastatur Når vi leser et ord (adskilt foran og bak med det som vi betrakter som skilletegn, for eksempel blanke og linjeskift, er det omlag samme kode fra fil eller tastatur. Igjen må lesingen med legges i en try-catch blokk. a) fra tastatur: String tast = tast.next() ; // leser neste ord fra tastatur // hopper over alle tomme linjer String t = sc.next(); // leser neste ord fra tastatur // hopper over alle tomme linjer b) fra fil: String t = f.next() ; // leser neste ord fra fila String t = null; t = f.next(); // leser neste ord fra fila

Her må deklarere Stingen t utenfor try-catch blokken for å gjøre dem synlige i resten av programmet. I tillegg må man enten i catch-blokka eller ved deklarasjonen gi en gyldig verdi til t ellers protesterer oversetteren javac. Lese et heltall og et flyttall fra en fil og fra tastatur Når vi leser et tall, adskilt foran og bak med det som vi betrakter som skilletegn, f.eks blanke og linjeskift, er det om lag samme kode fra fil eller tastatur. Igjen må lesingen med legges i en try-catch blokk når vi leser en fil. a) fra tastatur: int i = tast.nextint() ; // leser neste heltall fra tastatur double x = tast.nextdouble();//leser flyttall int i = sc.nextint(); // leser neste heltall fra tastatur double x= sc. nextdouble(); // leser flyttall b) fra fil: int i = f.nextint() ; // leser neste heltall fra tastatur double x = f.nextdouble();//leser flyttall double x = 0; int i =0; i = f.nextint(); // leser neste heltall fra fil x= f. nextdouble(); // leser flyttall Igjen må innlesning med deklarere variablene x og i utenfor try-cath blokken for å gjøre dem synlige i resten av programmet. I tillegg må man enten i catch-blokka eller ved deklarasjonen gi en gyldig verdi til x og i ellers protesterer kompilatoren. I tillegg har både og en rekke metoder (hasnext(), hasnextint(), nextdouble(),...) som for hver lesemetode sjekker om det neste som skal leses er et ord, et heltall, et flyttall osv og returnerer sant (true) hvis det vi tester er tilfellet elles usant(false). Lese tall i en fil med noen blanke Vi tar utgangspunkt i den første linja i fila «hybeldata.txt2 i oblig4hybelhus som i 2013, som så slik ut: 10;2013;0;0; 7500; 9000; Vi ser at dette er heltall adskilt med semikolon (;) og på to plasser også et det en blank (mellomrom) foran tallene. Vi skal nå se på hvordan dette leses, først med, så med bare Skanner og så med en kombinasjon av Skanner og split- metoden i klassen String. I tillegg bruker vi trim-metoden i String som fjerner blanke foran og bak i en tekst. In innf= new In("hybeldata.txt"); int maaned= innf.inint(" ;"); int aar = innf.inint(" ;"); int t = innf.inint(" ;"); int ta = innf.inint(" ;"); int mv = innf.inint(" ;"); f=null; f = new (new File("hybeldata.txt")); f.usedelimiter(";"); } catch (Exception e) { System.out.println("FEIL: Filhybeldata.txt");} int maaned= new Integer(f.next().trim()).intValue();

int mtop = innf.inint(" ;"); int aar = new Integer(f.next().trim()).intValue(); int t = new Integer(f.next().trim()).intValue(); int ta = new Integer(f.next().trim()).intValue(); int mv = new Integer(f.next().trim()).intValue(); int mtop = new Integer(f.next().trim()).intValue(); Kombinasjon av og split av en String f = null; f = new (new File("hybeldata.txt")); } catch (Exception e) { System.out.println("FEIL i File Hybeldata.txt");} String [] arr = f.nextline ().split(";"); for (int i =0; i< arr.length; i++) { arr[i] = arr[i].trim(); } int maaned= int aar = int t = int ta = int mv = int mtop = new Integer(arr[0]).intValue(); new Integer(arr[1]).intValue(); new Integer(arr[2]).intValue(); new Integer(arr[3]).intValue(); new Integer(arr[4]).intValue(); new Integer(arr[5]).intValue(); Det er også mange andre matter å lese dette på, men grovt sett dekker disse tre eksemplene typiske møter som studentene vil bruke i oppgaveløsning og som ikke går ut over pensum. Her ser vi at antall linjer kode man må skrive med er klart færre enn med eller /split for å oppnå eksakt det samme. En av hovedgrunnene til dette er at hverken eller split aksepterer vanlig mellomrom som skilletegn skrevet med mellomromtasten, men måtte evt. skrive det som \\s*. Det siste er ikke til å forstå hvis man ikke har satt seg inn i hvordan regulære uttrykk skrives i Java, (noe som er langt utenfor pensum i INF1000). I tillegg har både og en rekke metoder (hasnext(), hasnextint(), nextdouble(),...) som for hver lesemetode sjekker om det neste som skal leses er et ord, et heltall, et flyttall osv og returnerer sant (true) hvis det vi tester er tilfellet elles usant(false). Utskrift Utskrift er enklere enn innlesning fordi det er færre feilsituasjoner. I -klassen brukes klasssen Out både til utskrift på skjerm og til fil. Rett på Java gir god oppskrift om utskrift på skjerm med klassen Out, men for skriving til skjermen man kan like gjerne bruke System.out.println() og System.out.print(). I standard java har man flere mulige klasser for utskrift til fil, f.eks klassene PrintWriter og FileWriter, hvor det synes enklest å bruke FileWriter. Klassen Out i hvor det er en rekke metoder for å skrive ut de ulike datatypene (String, char, int double) alt etter hvordan man vil ha utskriften antall tegnplasser man vil ha på linje, antall plasser etter komma, høyre-eller venstre-justert osv. Nedenfor vises bare noen få eksempler. Klassen

FileWriter bruker et annet prinsipp, den skriver ut bare en tekst (akkurat som System.out.println()). Det er så opp til brukeren å formattere bredde, antall sifre etter komma osv. før tallet omgjøres til tekst og så skrives ut. Husk at alle skriveobjekter som skriver til fil må lukkes til slutt for at alt man har skrevet skal skrives ut på fila! Lage et skriverobjekt til fil import.* Out fil1 = newout( FilenMin.txt ); // Åpner fil med skriving fra starten FileWriter FileWriter import java.io.*; FileWriter f0 = null; f0 = new FileWriter("file1.txt"); // Åpner fil med skriving fra starten import.* Out fil2 = newout( FilenMin2.txt, true); // Åpner fil med skriving fra enden import java.io.*; FileWriter f= null; f = new FileWriter("file2.txt", true); // Åpner fil med skriving fra enden Utskrift på fil med Alle metodene i klasse Out heter enten: out skriver ut et tall, tekst eller bokstav uten linjeskift etter, eller: outln skriver ut et tall, tekst eller bokstav med linjeskift etter Disse metodene har ulike antall parametre som bestemmer særlig bredden på det feltet man skriver ut, justeringen (RIGHT, CENTER eller LEFT) av det man skriver ut eller evt. antall sifre etter komma for flyttall. Velger man ikke, vil tall bli høyrejustert og tekster venstrejustert og velger man ikke bredde vil det man skriver ut få så mange plassert på linja som de trenger for å bli skrevet ut, eks: // skriver ut et tall (123) på 3 plasser fil1.out(123); // skriver ut et tall (123) høyrejustert på 5 plasser fil1.out(123,5); // skriver ut linjeskift fil1.outln(); // utskrift med linjeskift. fil1.outln("en linje med tekst"); // skriver ut desimaltallet 123.456 med to desimaler med feltbredde 6 fil1.outln(123.456, 2); // som over, høyrejustert på 10 plasser. fil1.outln(123.456, 2, 10); // Teksten skrives høyrejustert på 10 plasser. fil1.outln("til høyre", 10, OutExp.RIGHT);

// Lukker filen etter skriving. fil1.close(); Utskrift på fil med FileWriter Som sagt skriver FileWriter bare ut tekster (som System,out.println()), og hvis man vil formatterer tekst eller særlig tall før utskrift, må man også bruke klassen Formatter fra java.io. Man kan da med Formatter fortsette å skrive inn i en fil man allerede har åpnet med FileWriter: FileWriter f1 = new FileWriter("file1.txt"); f1.write( Her er svaret: ); double x = 2,1734; Formatter fm = new Formatter(f1); // for å skrive videre på f1 fm.format("%12d %s %4.3f %6.2f",9876543,"\n Hurra", 77.6666, x); f1.write( SLUTT ); f1.close(); } catch(exception e) { } Vi har her et eksempel på at vi først lager en fil file1.txt med FileWriter og skriver teksten Her er svaret: på fila. Så åpner vi en Formatter på den fila og skriver ut ett tall, en tekst et tall og tilslutt en variabel som har et tall som verdi og som da skrives ut. Det som blir skrevet på fila er: Her er svaret: 9876543 Hurra 77,667 2,17 SLUTT For å formattert et tall til så må man i format først angi en tekst ("%12d %s %4.3f %6.2f") som sier hvordan resten av data og variable etter denne stringen skal skrives. Her er en særs enkel forklaring på hvordan du kan skrive selve formatterings-stringen (den fulle bruksanvisningen for dette er på mange sider): Vi ser at den står for adskilte deler som hver begynner med %, og det er like mange slike %-deler som det er tall, tekster eller variable etter denne (9876543,"\n Hurra", 77.6666, x). Betydningen av de like delene i formatteringsstringen er: %12d d betyr heltall og 12 sier at feltet som skal nyttes her er 12 langt %s - s sier at her skal det være en string(tekst)og at den tar så stor plass som den er lang %4.3f f betyr flyttall, og at det skal skrives med 4 plasser før og 3 sifre etter komma %6.2f som ovenfor, men med 6 sifre før og 2 sifre etter komma. Legg merke til at det ikke bare er formatterings-stringen som formatterer. Teksten "\n Hurra" blir skrevet ut som først linjeskift, så en blank og så Hurra. \n inne i tekster har alltid denne effekten.