INF1000-SIKT - Notat om I/O i Java

Like dokumenter
INF Notat om I/O i Java

IN Notat om I/O i Java

INF1010 våren 2018 tirsdag 23. januar

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

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

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Enkel lesing og skriving i Java

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

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

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

Leksjon 7. Filer og unntak

Kapittel 12: Filer og strømmer INF 100. Java som første programmeringsspråk

Leksjon 7. Filer og unntak

Jentetreff INF1000 Debugging i Java

Kapittel 14: Filer og strømmer. Kort versjon

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

Å lese tall fra en fil, klassen Scanner

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

String-manipulasjon og I/O i Java. INF1000 h14 - Hans Petter Taugbøl Kragset

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

Litt om pakker og mest om data inn og ut

INF1000 Behandling av tekster

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

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

INF1000 : Forelesning 5

TOD063 Datastrukturer og algoritmer

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

Repetisjon. INF gruppe 13

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

Kapittel 14: Filer og strømmer. Kort versjon

Leksjon 7. Filer og unntak

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

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

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

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

Fra Python til Java, del 2

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

INF1010 våren Generalisering -spesialisering Gjenbruk av klasser. Ved arv. Klasse-hierarkier. Stein Gjessing.

Løsningsforslag ukeoppg. 4: sep (INF Høst 2011)

Eksempel: Body Mass Index (BMI)

Løsningsforslag til eksamen i INF1000 våren 2006

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

Oblig 4Hybelhus litt mer tips enn i oppgaven

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

Forelesning inf Java 5

Forelesning inf Java 5

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

Forelesning inf Java 5

Forelesning inf Java 3

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

Post-it spørsmål fra timen (Arv og subklasser)

Programmering Høst 2017

UNIVERSITETET I OSLO

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

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

Seminaroppgaver IN1010, uke 2

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser del 1 (pluss litt I/O og unntaksbehandling)

Blokker og metoder INF1000 (Uke 6) Metoder

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

INF1000 (Uke 6) Mer om metoder, tekster

Uke 5, 27. januar Arv og subklasser del I. Stein Gjessing Institutt for informatikk

INF Løsning på seminaropppgaver til uke 8

Løse reelle problemer

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

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

UNIVERSITETET I OSLO

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

Avdeling for ingeniørutdanning Institutt for teknologi

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

UNIVERSITETET I OSLO

Forelesning inf Java 2

Forelesning inf Java 2

Læreboken på 45 minutter

UNIVERSITETET I OSLO

INF1000: Forelesning 4. Mer om arrayer Metoder

INF1010 våren Arv og subklasser del 1 pluss (hvis vi har tid) litt om Unntak, IO og Scanner-klassen

INF1010 våren 2010 Torsdag 4. februar. Arv og subklasser del I. Emneoversikt subklasser (2 uker) Hva er en subklasse? Eksempel: Universitetsregister

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

Løsningsforslag ukeoppg. 5: sep (INF Høst 2011)

Java 6. Eksempel med to-dimensjonal array Filbehandling Tekster

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

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

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

Forelesning inf Java 3

UNIVERSITETET I OSLO

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

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

INF100 Institutt for informatikk Universitetet i Bergen Øving 5

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

Eksempel 1 Eksempel 2 Dramatisering. INF1000 uke 3. Sundvollen 7. september 2015 Dag Langmyhr. INF1000 Sundvollen

INF 1000 høsten 2011 Uke 3 6. september

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

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

Forelesning inf Java 4

UNIVERSITETET I OSLO

INF1000 (Uke 6) Mer om metoder, tekster

Transkript:

INF1000-SIKT - Notat om I/O i Java Tuva Kristine Thoresen tuvakt@ulrik.uio.no 30. oktober 2013 Innhold 1 Innlesning fra terminal 2 1.1 Innlesning av tekst........................ 2 1.2 Innlesning av tall......................... 3 1.3 Eksempelprogram......................... 3 1.4 Alternativ innlesning av tall................... 4 2 Innlesning fra l 5 2.1 Innlesning av en typisk l.................... 5 2.2 Splitte opp en streng....................... 6 3 Skrive til l 7 3.1 Skriving.............................. 8 3.2 *Formattert utskrift....................... 8 1

I dette notatet skal vi se litt på I/O i Java. Dette notatet er ment for studenter på inf1000-sikt, men kan også brukes av andre studenter. 1 Innlesning fra terminal Det første vi skal se på er innlesning fra terminal. Dette bruker vi ofte i interaksjon med brukere av programmet. Programmet ber om input, som brukeren så taster inn. Programmet må så lese inn dette og bearbeide informasjonen. For å få til innlesning fra terminal bruker vi en ferdiglagd Java-klasse som heter Scanner. Denne klassen inneholder mange nyttige funksjoner for innlesning. For å bruke denne klassen må vi først importere de nødvendige programmene. Disse ligger i java.util og kan importeres på følgende måte: import java.util.scanner; Neste steg er å opprette et innlesningsobjekt. Det må vi gjøre slik at vi får tak i hele Scanner-klassen og dens funksjonalitet. Dette gjøres slik: Scanner in = new Scanner(System.in); Når vi leser fra terminalen leser vi fra standard input. Dette får vi tak i gjennom System.in. 1.1 Innlesning av tekst Scanner har to metoder som vi bruker for å lese inn tekst: ˆ nextline() - leser inn en linje av tekst. ˆ next() - leser inn et ord. Disse metodene kan brukes på følgende måte: System.out.print("Tast inn en setning: "); String linje = in.nextline(); System.out.print("Tast inn et ord: "); String ord = in.next(); 2

1.2 Innlesning av tall For å lese inn tall med Scanner kan vi bruke disse to metodene: ˆ nextint() - leser inn et heltall. ˆ nextdouble() - leser inn et desimaltall. Eksempel på bruk av disse to metodene: System.out.print("Tast inn et heltall: "); int heltall = in.nextint(); System.out.print("Tast inn et desimaltall: "); double desimaltall = in.nextdouble(); 1.3 Eksempelprogram Nå skal vi lage et lite program som leser inn et heltall, et desimaltall og en setning fra brukeren. import java.util.scanner; class InputEks { public static void main(string[] args) { // oppretter innlesningsobjekt: Scanner in = new Scanner(System.in); // leser inn et heltall: System.out.print("Tast inn din alder: "); int alder = in.nextint(); // leser inn et desimaltall: System.out.print("Tast inn din hoyde (i meter): "); double hoyde = in.nextdouble(); // leser inn linjeskiftet: in.nextline(); // leser inn en setning: System.out.print("Tast inn ditt fulle navn: "); String navn = in.nextline(); 3

Vi er nødt til å lese inn en ekstra linje, før vi leser inn navnet. Dette er fordi metodene nextint() og nextdouble() bare leser inn tallene, og ikke linjeskiftet. Dermed får vi problemer neste gang vi skal lese inn en setning. 1.4 Alternativ innlesning av tall For å unngå det ekstra kallet på nextline() etter man har lest inn et tall, kan man unngå bruk av metodene nextint() og nextdouble(). Isteden kan man lese inn en linje, og så konvertere denne teksten til tall etterpå. Dette kan skje på følgende måte: String linje = in.nextline(); int heltall = Integer.parseInt(linje); Her konverterer vi teksten linje til et heltall ved kall på metoden Integer.parseInt(). Denne metoden tar en tekst som inneholder et tall (for eksempel "4") som input og konverterer denne til et heltall (her: med verdi 4). På tilsvarende måte kan man konvertere en tekst til et desmialtall, med metoden Double.parseDouble(). Eksempelprogrammet vårt kan da se slik ut: import java.util.scanner; class InputAlt { public static void main(string[] args) { // oppretter innlesningsobjekt: Scanner in = new Scanner(System.in); // leser inn et heltall: System.out.print("Tast inn et heltall: "); String linje = in.nextline(); int heltall = Integer.parseInt(linje); // leser inn et desimaltall: System.out.print("Tast inn et desimaltall: "); String tekst = in.nextline(); double desimaltall = Double.parseDouble(tekst); // leser inn en setning System.out.print("Tast inn ditt fulle navn: "); String navn = in.nextline(); Her ser vi at vi slipper det ekstra kallet på nextline(). 4

2 Innlesning fra l Når vi leser inn fra terminalen med Scanner leser vi fra System.in. For å lese inn fra l, kan vi også bruke Scanner. Forskjellen er at nå må vi sende med len som argument til Scanner. Det er dessverre noen små problemer med å lese fra l. Vi har nemlig ingen garanti for at len vi prøver å lese fra, faktisk nnes! Java lar oss løse dette ved at vi først prøver å lese fra len. Hvis dette går galt, får vi en feilmelding som vi må håndtere. Vi må først huske å importere de nødvendige programmene: import java.util.scanner; import java.io.*; og så kan vi begynne å lese. Vi oppretter først et innlesningsobjekt, og forteller det at det skal lese fra len innl.txt: File f = new File("innfil.txt"); Scanner innfil = new Scanner(f); catch(ioexception e) { Legg merke til try-catch-blokkene. Disse forteller Java at vi prøver å lese fra l, og at vi fanger opp feilen hvis noe går galt. Hvis noe går galt kaster programmet vårt en IOException. Det er rett og slett en feilmelding som sier at noe gikk galt med innlesningen fra l. Denne feilen fanger vi opp i catch-blokka, og gjør noe med den. Her har vi lyst til å skrive ut feilmeldingen vi får til terminalen. Det gjør vi ved kall på metoden printstacktrace() på unntaket e. 2.1 Innlesning av en typisk l Innlesning fra l fungerer på samme måte som innlesning fra terminal. Vi kan bruke de samme Scanner-metodene for å lese inn informasjon: String linje = innfil.nextline(); int heltall = innfil.nextint(); double desimaltall = innfil.nextdouble(); Men, ofte har ler en bestemt struktur som gjentar seg. La oss se på en l på et slikt format: 5

Ola Tuva Heidi Lars Gunnar Ingrid... Her har vi en l med en masse navn, et navn på hver linje. Vi vet ikke hvor mange linjer la vår har - hvordan kan vi da lese fra den? Løsningen ligger i en metode i Scanner: ˆ hasnextline(): Denne metoden returnerer true hvis det nnes ere linjer i la, false ellers. For å lese inn hele len, kan vi da gjøre følgende: while (innfil.hasnextline()) { String linje = innfil.nextline(); Hvis man har lyst til å lese et og et ord i la kan man bruke metoden hasnext(): while (innfil.hasnext()) { String ord = innfil.next(); 2.2 Splitte opp en streng I noen tilfeller møter vi på ler med følgende format: ord1;ord2;ord3;ord4; ord1;ord2;ord3;ord4;... Vi har lyst til å få tak i de ulike ordene og gjøre noe med de i programmet vårt. En strategi for å lese denne len er å lese inn en og en linje, dele denne opp i ord, og gjøre noe med ordene. For å få til dette kan man bruke en metode i klassen String som heter split(). Denne metoden deler en tekst opp i ord, basert på et gitt skilletegn, og lagrer ordene i en array. Teksten selv endres ikke. Et eksempel på bruk: String linje = "hei;meg;deg"; String[] ord = linje.split(";"); 6

Resultatet av kallet på metoden split(";") er en array, der hver plass inneholder et av ordene i setningen: String[] ord = {"hei", "meg", "deg"; For å lese inn len gitt over, kan vi da gjøre følgende: while(innfil.hasnextline()) { String linje = innfil.nextline(); String[] ord = linje.split(";"); String ord1 = ord[0]; String ord2 = ord[1]; // osv... Vi leser inn linja, splitter den opp basert på skilletegnet ";", og gjør noe med ordene etterpå. 3 Skrive til l For å skrive til l bruker vi klassen FileWriter. Denne klassen ligger i java.io og må importeres herfra: import java.io.*; Som ved innlesning fra l kan det oppstå feilsituasjoner, så vi trenger også her try-catch-blokkene. FileWriter utfil = new FileWriter("utfil.txt"); catch (IOException e) { Her trenger vi bare å sende med navnet på len vi vil skrive til. Merk at vi ikke krever at denne len nnes fra før, FileWriter oppretter len for deg. Hvis vi har lyst til å skrive i slutten av en allerede eksisterende l, legge til informasjon, sender vi med et ekstra argument til FileWriter: FileWriter utfil = new FileWriter("utfil.txt", true); catch (IOException e) { 7

3.1 Skriving For å skrive til l, bruker vi metoden write: FileWriter utfil = new FileWriter("utfil.txt", true); // skrive til filen: utfil.write("her er en tekst, woho! \n"); utfil.write("setning nummer 2\n"); // lukk filen: utfil.close(); catch (IOException e) { Det er to viktige ting å huske på her: ˆ Metoden write() gir deg ikke linjeskift, så du må huske å legge til teksten \n på slutten av setningen din. Denne gir deg linjeskift. ˆ Det er viktig å lukke skriveren når du er ferdig, uten dette blir ikke len skrevet til. Dette gjør du med metoden utfil.close(). 3.2 *Formattert utskrift Dette er *-sto og er ment for de mest interesserte studentene. For å skrive formattert, kan vi bruke en Java-klasse som heter PrintWriter. PrintWriter tilbyr blant annet følgende metoder: ˆ print(string s) - som skriver ut en tekst. ˆ println(string s) - som skriver ut en tekst med linjeskift. ˆ printf(string s, argumenter) - som skriver formattert utskrift. Når vi oppretter et PrintWriter-objekt sender vi med den gamle lskriveren vår, FileWriter. Et eksempel på formattert utskrift med desimaltall ("%f"), tekster ("%s") og heltall ("%d") kan du se her: FileWriter filewriter = new FileWriter("out.txt"); PrintWriter printwriter = new PrintWriter(fileWriter); String navn = "Tuva"; double desimal = 3.14159265359; 8

int heltall = 365; // formattert utskrift printwrite.printf("%-5s %2.2f %d \n", navn, desimal, heltall); printwriter.close(); catch(ioexception e) { Dette gir gir følgende formatterte resultat: Tuva 3,14 365 Under kommer en liten oversikt over de vanligste formatteringsvalgene: ˆ %s formatterer en tekst. ˆ %d formatterer et heltall. ˆ %f formatterer et desimaltall. ˆ %10s formatterer en tekst som tar 10 karakterer med plass. Merk at hvis teksten er lengre enn 10 karakterer, vil den bruke større plass. ˆ %-10s venstrestiller teksten. ˆ %.2f formatterer et desimaltall med to sifre etter komma. 9